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 .....
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