Loginbox
Please enter your username and password into the following fields to log in.
OLED-Display mit SSD1322-Controller und 256x64 Pixel
Harry 
PowerUser
Gender: 
Location:
zwischen Augsburg und Ulm
Age: 57
Posts: 2020
Registered: 03 / 2003

PowerUser


Location:

Age: 57
Posts: 2020
Registered: 03 / 2003
Subject: OLED-Display mit SSD1322-Controller und 256x64 Pixel - Posted: 02.10.2011 - 20:47 -
Bitte sehr
Soweit ich es testen konnte funktioniert alles bis auf gDrawBitMap (was ich mir allerdings überhaupt nicht erklären kann).
Ich hätte es gerne noch mit readonly/linear getestet, aber dieses EVAboard hat das vom µC nicht hergegeben (nur 2 k RAM). Ich bin sicher, daß das wesentlich schneller ginge/besser wäre. Leider müssen bei diesem Controller immer mindestens 2 Bytes (=4 Pixel) gelesen/geschrieben werden. Mein SetPixel/ClearPixel/XOrPixel muß also immer 2 Bytes lesen, Pixel ändern, 2 Bytes schreiben. Bei Read/WriteByte werden immer 8 Pixel = 4 Bytes verarbeitet.
Die Geschwindigkeit läßt also leider noch zu wünschen übrig (evtl. kann das ja mal jemand Assembler-optimieren).
gruss
Harry

Soweit ich es testen konnte funktioniert alles bis auf gDrawBitMap (was ich mir allerdings überhaupt nicht erklären kann).
Ich hätte es gerne noch mit readonly/linear getestet, aber dieses EVAboard hat das vom µC nicht hergegeben (nur 2 k RAM). Ich bin sicher, daß das wesentlich schneller ginge/besser wäre. Leider müssen bei diesem Controller immer mindestens 2 Bytes (=4 Pixel) gelesen/geschrieben werden. Mein SetPixel/ClearPixel/XOrPixel muß also immer 2 Bytes lesen, Pixel ändern, 2 Bytes schreiben. Bei Read/WriteByte werden immer 8 Pixel = 4 Bytes verarbeitet.
Die Geschwindigkeit läßt also leider noch zu wünschen übrig (evtl. kann das ja mal jemand Assembler-optimieren).
gruss
Harry
You must be logged in or your permissions are to low to see this Attachment(s).
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
Electronics works with smoke - if you let the smoke out, it works no longer.

Harry 
PowerUser
Gender: 
Location:
zwischen Augsburg und Ulm
Age: 57
Posts: 2020
Registered: 03 / 2003

PowerUser


Location:

Age: 57
Posts: 2020
Registered: 03 / 2003
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel - Posted: 14.12.2022 - 15:42 -
Ein kleines Update .... Dank einer Spende von Miparo hatte ich die Gelegenheit ein solches Display doch noch linear/readonly zu testen. Zur Erinnerung: OLED 256x64 Pixel, Controller SSD1322,
Endlich ist der Bildaufbau gewohnt schnell ~82ms. Bei der erforderlichen und aufwendigen Schwarz/weiss-Graustufenumwandlung eigentlich ok. Evtl. weiß ja jemand, wie man das schneller machen kann?
Gruss
Harry
Endlich ist der Bildaufbau gewohnt schnell ~82ms. Bei der erforderlichen und aufwendigen Schwarz/weiss-Graustufenumwandlung eigentlich ok. Evtl. weiß ja jemand, wie man das schneller machen kann?
Gruss
Harry
You must be logged in or your permissions are to low to see this Attachment(s).
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
Electronics works with smoke - if you let the smoke out, it works no longer.
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel - Posted: 15.12.2022 - 02:40 -
Hi Harry,
Supi.
GraphIOS evtl etwas flotter so:
Supi.
GraphIOS evtl etwas flotter so:
Code
userdevice GraphIOS(Cmd: byte; Arg: byte);
begin
if Cmd = 0 then // command
if Arg = 0 then
SendOLEDCmd($15); // Set Column Address , sichtbarer Bereich 28 - 91 vertikal
SendOLEDdata(28); // 28
SendOLEDdata(91); // 91
SendOLEDCmd($75); // Set Row Address , sichtbarer Bereich 0-63 horizontal
SendOLEDdata(0);
SendOLEDdata(63);
SendOLEDCmd($5C); // Befehl Write OLED RAM bleibt aktiv bis ein nächstes Kommando kommt
endif;
else // data
asm;
LDI _ACCCLO, %.DispData AND 0FFh
LDI _ACCCHI, %.DispData SHRB 8
LDD _ACCB, Y+000h
LDI _ACCBLO, 4
IOS_LOOP:
CLR _ACCA
SBRC _ACCB, 7
LDI _ACCA, $F0
LSL _ACCB
SBRC _ACCB, 7
ORI _ACCA, $0F
ST Z+, _ACCA
LSL _ACCB
DEC _ACCBLO
BRNE IOS_LOOP
endasm;
for DispCounter:= 0 to 3 do
SendOLEDdata(DispData[DispCounter]);
endfor;
endif;
end GraphIOS;
{$D+}
begin
if Cmd = 0 then // command
if Arg = 0 then
SendOLEDCmd($15); // Set Column Address , sichtbarer Bereich 28 - 91 vertikal
SendOLEDdata(28); // 28
SendOLEDdata(91); // 91
SendOLEDCmd($75); // Set Row Address , sichtbarer Bereich 0-63 horizontal
SendOLEDdata(0);
SendOLEDdata(63);
SendOLEDCmd($5C); // Befehl Write OLED RAM bleibt aktiv bis ein nächstes Kommando kommt
endif;
else // data
asm;
LDI _ACCCLO, %.DispData AND 0FFh
LDI _ACCCHI, %.DispData SHRB 8
LDD _ACCB, Y+000h
LDI _ACCBLO, 4
IOS_LOOP:
CLR _ACCA
SBRC _ACCB, 7
LDI _ACCA, $F0
LSL _ACCB
SBRC _ACCB, 7
ORI _ACCA, $0F
ST Z+, _ACCA
LSL _ACCB
DEC _ACCBLO
BRNE IOS_LOOP
endasm;
for DispCounter:= 0 to 3 do
SendOLEDdata(DispData[DispCounter]);
endfor;
endif;
end GraphIOS;
{$D+}
Kein Support per PN! | No support via PM!
Harry 
PowerUser
Gender: 
Location:
zwischen Augsburg und Ulm
Age: 57
Posts: 2020
Registered: 03 / 2003

PowerUser


Location:

Age: 57
Posts: 2020
Registered: 03 / 2003
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel - Posted: 15.12.2022 - 16:30 -
..... und ein Bild vom Display ... von Miparo gemopst

You must be logged in or your permissions are to low to see this Attachment(s).
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
Electronics works with smoke - if you let the smoke out, it works no longer.

Harry 
PowerUser
Gender: 
Location:
zwischen Augsburg und Ulm
Age: 57
Posts: 2020
Registered: 03 / 2003

PowerUser


Location:

Age: 57
Posts: 2020
Registered: 03 / 2003
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel - Posted: 15.12.2022 - 18:10 -
Hi Miparo,
bitteeeeeeeee nicht
Du bist ein Genie. Mit deinem Assembler-Code dauert der Refresh nur noch 41.3ms - doppelt so schnell.
Dein SendOLEDData und SendOLEDCMD hab ich allerdings nicht verwendet.
Gruss
Harry
bitteeeeeeeee nicht

Du bist ein Genie. Mit deinem Assembler-Code dauert der Refresh nur noch 41.3ms - doppelt so schnell.
Dein SendOLEDData und SendOLEDCMD hab ich allerdings nicht verwendet.
Gruss
Harry
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
Electronics works with smoke - if you let the smoke out, it works no longer.
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel - Posted: 15.12.2022 - 18:13 -
die For Schleife immer als downto benutzen, das geht flotter.
Wobei eine While Schleife noch schneller ist und immer runter zählen, da ein BRNE auf Null testen flotter ist als immer auf den Endwert zu testen.
"SendOLEDData und SendOLEDCMD"
Solltest du aber evtl tun, da hier immer ein unütze bytes auf den Frame gelegt werden muss.
Wobei eine While Schleife noch schneller ist und immer runter zählen, da ein BRNE auf Null testen flotter ist als immer auf den Endwert zu testen.
"SendOLEDData und SendOLEDCMD"
Solltest du aber evtl tun, da hier immer ein unütze bytes auf den Frame gelegt werden muss.
Kein Support per PN! | No support via PM!

Harry 
PowerUser
Gender: 
Location:
zwischen Augsburg und Ulm
Age: 57
Posts: 2020
Registered: 03 / 2003

PowerUser


Location:

Age: 57
Posts: 2020
Registered: 03 / 2003
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel - Posted: 20.12.2022 - 16:22 -
Wird das Programm wie folgt geändert ....
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
14.67ms.
Gruss
Harry
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

Gruss
Harry
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
Electronics works with smoke - if you let the smoke out, it works no longer.

Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel - Posted: 20.12.2022 - 23:09 -
Hi Harry,
hättest du meinen Rest ASM noch dazu gefügt, wäre es schneller
SPIOutD(@DispData,4); hat einen riesen Overhead, das kann man gleich in der Umwandlung abschicken
dann wird auch DispData nicht mehr gebraucht.
Die dicke For Schleife wird dann auch schlanker .
Da bleibt für den Opti nichts übrig
miparo
hättest du meinen Rest ASM noch dazu gefügt, wäre es schneller

SPIOutD(@DispData,4); hat einen riesen Overhead, das kann man gleich in der Umwandlung abschicken
dann wird auch DispData nicht mehr gebraucht.
Die dicke For Schleife wird dann auch schlanker .
Da bleibt für den Opti nichts übrig

miparo
Kein Support per PN! | No support via PM!

Harry 
PowerUser
Gender: 
Location:
zwischen Augsburg und Ulm
Age: 57
Posts: 2020
Registered: 03 / 2003

PowerUser


Location:

Age: 57
Posts: 2020
Registered: 03 / 2003
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel - Posted: 21.12.2022 - 10:15 -
Hi Miparo,
erst nach dem ich es getestet hab
[Edit] getestet 14.21ms
und ich glaube, schneller geht jetzt nicht mehr. Miparo deinen ASM-Code für WriteOLED_D und WriteOLED_C hab ich nicht übernommen, da die Adressierung des Display-RAMs nur einmal am Anfang des Refreshs nötig ist und es somit nicht viel bringen wird. Danke dir
und ASM würde ich auch gerne können .....
Procedure chDispRefresh; // 7.85ms @ 64MHz
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;
ASM;
LDI _ACCCLO, GraphColArr AND 0FFh
LDI _ACCCHI, GraphColArr SHRB 8 // Z Pointer auf GraphColArr
LDI _ACCFLO, 007FFh AND 0FFh
LDI _ACCFHI, 007FFh SHRB 8 // Zähler laden 2047
REFRESH_L1:
LD _ACCB, Z+ // PTR^ GraphData laden , PTR erhöhen
LDI _ACCALO, 4 // 4 x BYTES
REFRESH_L2:
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
call SYSTEM.SPIOutByteD // nur _ACCA wird zerstört
LSL _ACCB // ARG shift left um oben Bit 5 ... zu testen
DEC _ACCALO // wenn Loop var nicht 0 nochmal
BRNE REFRESH_L2
SBIW _ACCFLO, 1
BRNE REFRESH_L1 //
EndASM;
End chDispRefresh;
Gruss
Harry
erst nach dem ich es getestet hab

[Edit] getestet 14.21ms


Code
Procedure chDispRefresh; // 7.85ms @ 64MHz
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;
ASM;
LDI _ACCCLO, GraphColArr AND 0FFh
LDI _ACCCHI, GraphColArr SHRB 8 // Z Pointer auf GraphColArr
LDI _ACCFLO, 007FFh AND 0FFh
LDI _ACCFHI, 007FFh SHRB 8 // Zähler laden 2047
REFRESH_L1:
LD _ACCB, Z+ // PTR^ GraphData laden , PTR erhöhen
LDI _ACCALO, 4 // 4 x BYTES
REFRESH_L2:
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
call SYSTEM.SPIOutByteD // nur _ACCA wird zerstört
LSL _ACCB // ARG shift left um oben Bit 5 ... zu testen
DEC _ACCALO // wenn Loop var nicht 0 nochmal
BRNE REFRESH_L2
SBIW _ACCFLO, 1
BRNE REFRESH_L1 //
EndASM;
End chDispRefresh;
Gruss
Harry
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
Electronics works with smoke - if you let the smoke out, it works no longer.

![]() |
Registered users in this topic Currently no registered users in this section |