Wird das Programm wie folgt geändert ....
Code
Var
OLED_CD[@PortD,2] : Bit;
OLED_RST[@PortD,3] : Bit;
DispData : Array[0..3] of Byte; // Displaydata schwarz/weiss --> graustufen
ArrayCounter : Integer;
Counter : Integer;
Procedure WriteOLED_C(Arg: Byte); // Command-Byte zum LCD senden
Begin
OLED_CD:=0; // Befehl
SPIOutByteD(Arg); // Output Arg
OLED_CD:=1; // Daten
End WriteOLED_C;
Procedure WriteOLED_D(Arg: Byte); // Daten zum LCD senden
Begin
SPIOutByteD(Arg); // Output Arg
End WriteOLED_D;
Procedure Init_OLED;
Begin
MDelay(50);
Oled_RST:=0;
MDelay(50);
Oled_RST:=1;
MDelay(50);
WriteOLED_C($FD); //Display Lock einmalig,damit das OLED Commandos empfängt
WriteOLED_D($12);
WriteOLED_C($AE); //Display OFF , Displaycontroller aktiv,Panel inaktiv
WriteOLED_C($B3); //Display Clock , interner Osc und Divisor , bleibt unverändert
WriteOLED_D(%10010001);
WriteOLED_C($CA); //Set Multiplex , entspricht der Pixelhöhe des Displays
WriteOLED_D(63); //Höhe - 1 , 64 Pixel
WriteOLED_C($A2); //Set Offset , beginne bei Reihe 0
WriteOLED_D(0);
WriteOLED_C($A1); //Set Startline , beginne bei Reihe 0
WriteOLED_D(0);
WriteOLED_C($A0); //Set Remap
WriteOLED_D(%00000110); //0b00000110 verkehrt ,0b00010100 normal(Displayanschluß unten)
WriteOLED_D(%00010001);
WriteOLED_C($B5); //Set GPIO , keine weitere Bedeutung da diese Pin's nicht rausgeführt
WriteOLED_D(0);
WriteOLED_C($AB); //Set Funktion , bleibt unverändert
WriteOLED_D($01);
WriteOLED_C($B4); //External VSL , bleibt unverändert
WriteOLED_D($A0);
WriteOLED_D($FD);
WriteOLED_C($C1); //Set Contrast Current , Genereller Kontrast , bleibt unverändert
WriteOLED_D($FF);
WriteOLED_C($C7); //Set Master Contrast , Hier ist eine Helligkeitsanpassung möglich
WriteOLED_D($08); // 0-14 Empfehlung 9-10 oder weniger , je mehr umso weniger LifeTime !!!
WriteOLED_C($B9); //Set Default Gray Scale , bleibt unverändert
WriteOLED_C($B1); //Set pre & dis_charge , bleibt unverändert
WriteOLED_D($E2);
WriteOLED_C($D1); //Enhance Driving Scheme , bleibt unverändert
WriteOLED_D($82);
WriteOLED_D($20);
WriteOLED_C($BB); //Set pre-charge Voltage
WriteOLED_D($08);
WriteOLED_C($B6); //Set Second Pre-charge Period
WriteOLED_D($0F);
WriteOLED_C($BE); //Set VCOMH
WriteOLED_D($07);
WriteOLED_C($A6); //Display normel , "0xa7" Display reverse
MDelay(50);
WriteOLED_C($AF); //Display ON , Displaycontroller aktiv,Panel aktiv
End Init_OLED;
Procedure chDispRefresh; //
Begin
OLED_CD:=0; // Befehl
SPIOutByteD($15); // Output Arg
OLED_CD:=1; // Daten
SPIOutByteD(28);
SPIOutByteD(91);
OLED_CD:=0; // Befehl
SPIOutByteD($75); // Output Arg
OLED_CD:=1; // Daten
SPIOutByteD(0);
SPIOutByteD(63);
OLED_CD:=0; // Befehl
SPIOutByteD($5C); // Output Arg
OLED_CD:=1;
For ArrayCounter:=0 to 2047 do
_ACCB:=GraphColArr[ArrayCounter]; // DisplayArray in _ACCB leden
ASM; // von Thorsten
LDI _ACCCLO, %.DispData AND 0FFh
LDI _ACCCHI, %.DispData SHRB 8 // Pointer auf Data laden
//LDD _ACCB, Y+000h // Arg from Frame laden
LDI _ACCBLO, 4 //
IOS_LOOP2:
CLR _ACCA // Ausgangspunkt data:=0
SBRC _ACCB, 7 // Bit 7 in ARG testen
LDI _ACCA, $F0 // wenn gesetzt DATA:=$F0
LSL _ACCB // ARG nach links schieben
SBRC _ACCB, 7 // Bit 6 ... jetzt testen SkipRegisterBitClear
ORI _ACCA, $0F // gesetzt Data := data or $0F
ST Z+, _ACCA // Data wegspeichern und Data Ptr um 1 erhöhen
LSL _ACCB // ARG shift left um oben Bit 5 ... zu testen
DEC _ACCBLO // wenn Loop var nicht 0 nochmal
BRNE IOS_LOOP2 //
EndASM;
SPIOutD(@DispData,4);
EndFor;
End chDispRefresh;
{$D-}
UserDevice GraphIOS(Cmd: Byte; Arg: Byte);
Begin
End GraphIOS;
{$D+}
..... und anstatt gDispRefresh mein chDispRefresh verwendet, dauert der Displayrefresh unter gleichen Bedingungen wie oben nur noch 15.7ms anstatt 41.3ms!
Durch den Merlin-Optimizer gejagt, wird es nochmal um ca. 1ms schneller