Hallo,
ich stehe grade irgendie auf dem Schlauch, weiß aber dass die Lösung
sicher simpel ist. Ich verwende ein OLED mit 96x64px. Dieses ist in 8
waagrechte Bänke unterteilt. Jede Bank enthält 96 Bytes. Dabei ist D0
das oberste Pixel der Bank, D7 das unterste.
Es gibt 2 Möglichkeiten der Ansteuerung:
1. Ich lege eine Startadresse an und schieße danach die Datenbytes raus,
der Adresszähler wird automatisch vom Display inkrementiert.
2. Ich lege für JEDES Byte eine Startadresse an und aktualisiere auch
nur dieses.
Möglichkeit 2 funktioniert natürlich bedeutend schneller. Die Adresse
wird in 2 Bytes (Lo+Hi) gesendet, dabei ist die Besonderheit:
Der Bildbereich fängt nicht bei 0x00 an, sondern für Lo bei 0x04 (0x04
-> 0x0F) und für Hi bei 0x12 (0x12 -> 0x1F). Jetzt habe ich aber das
Problem, wie erzeuge ich eine Adresse wie z.B. 0x5F? Wenn ich dort
0x5F+0x04 mache überschreite ich 0x0F für Lo und die Ausgabe stimmt
nicht mehr! Ich habe es probiert mit Hi+0x01 und Lo fängt wieder von
0x04 an, mag er aber nicht :( Wo liegt mein Denkfehler?
Hier mal ein Schnipsel C# fürs einfachere Verständnis:
1 | public int refreshByte(int x, int y)
|
2 | //x and y are absolute px-offsets
|
3 | {
|
4 | int bank = 0;
|
5 | if ((y / 8) > 0) bank = (y / 8); //Detect bank
|
6 | int col = x; // Detect column
|
7 | int data = y % 8; // Detect D-row inside bank
|
8 |
|
9 | this.CS_on(); //nCS=0
|
10 | this.DC_ctrl(); //Prepare to send Control Bytes
|
11 | this.write_Disp((byte)(0xB0 + bank)); // Set display bank
|
12 | this.write_Disp((byte)(0x04 + (col & 0x0F))); // Set Lower Column address
|
13 | this.write_Disp((byte)(0x12 + (col/16))); // Set higher Column address
|
14 | this.DC_data(); //Prepare to send Data Bytes
|
15 | this.write_Disp((byte)(disp_map[bank, col, 0] | disp_map[bank, col, 1] << 1 | disp_map[bank, col, 2] << 2 | disp_map[bank, col, 3] << 3 | disp_map[bank, col, 4] << 4 | disp_map[bank, col, 5] << 5 | disp_map[bank, col, 6] << 6 | disp_map[bank, col, 7] << 7)); // Enqueue bits to get a column byte
|
16 | this.DC_ctrl(); //Prepare to send Control Bytes
|
17 | this.write_Disp(0xE3); // NOP
|
18 | this.CS_off(); //nCS=1
|
19 |
|
20 | return 0;
|
21 | }
|