Hallo,
ich arbeite gerade an einer Routine, mit der man einzelne Buchstaben
(ASCII) auf ein OLED darstellen kann.
Nun ist die Frage, wie ich die einzelnen Datensätze für die jeweiligen
Buchstaben laden sollte.
Wären dass nur wenige Zeichen (z.B. 10-20), dann wäre eine Sprungtabelle
dafür angebracht, aber bei über 100 Zeichen bietet sich sicher eine
bessere Lösung an.
Oder was meint ihr dazu?
Option 1 (Sprungtabelle):
1 | ;Zeichne Buchstabe 'A'
|
2 | ldi temp1, A
|
3 |
|
4 | ...
|
5 |
|
6 | ldi ZH, HIGH(jumptable * 2)
|
7 | ldi ZL, LOW(jumptable * 2)
|
8 | add ZL, temp1
|
9 | ldi temp1, 0
|
10 | adc ZH, temp1
|
11 | ijmp
|
12 |
|
13 | ;Sprungtabelle (> 100 Verzweigungen, viel Laufzeit, viel Code)
|
14 | jumptable:
|
15 | rjmp load_A
|
16 | ...
|
17 | rjmp load_Z
|
18 |
|
19 | load_A:
|
20 | ldi ZH, HIGH(A * 2)
|
21 | ldi ZL, LOW(A * 2)
|
22 | ;loop 5 mal
|
23 | LD temp1, Z+
|
24 | rcall twi_send_byte ;Sende ein Byte an das OLED
|
25 | ...
|
26 | rjmp back
|
27 |
|
28 | ;ASCII
|
29 | A:
|
30 | .DB 0x8A, 0xA3 ;Nur als Beispiel
|
31 | .DB 0x25, 0x25
|
32 | .DB 0x8A
|
33 | ...
|
34 | Z:
|
35 | .DB 0x8A, 0xA3
|
36 | .DB 0x25, 0x25
|
37 | .DB 0x8A
|
38 | ...
|
Option 2 (ohne Sprungtabelle):
1 | ;Zeichne Buchstabe 'A'
|
2 | ldi temp1, A
|
3 |
|
4 | ...
|
5 |
|
6 | ldi ZH, HIGH(ascii * 2)
|
7 | ldi ZL, LOW(ascii * 2)
|
8 | ldi temp2, 5
|
9 | mul temp1, temp2
|
10 | add ZL, temp1
|
11 | ldi temp1, 0
|
12 | adc ZH, temp1
|
13 | rcall oled_draw_char
|
14 | ijmp
|
15 |
|
16 | ascii:
|
17 | ;A
|
18 | .DB 0x8A, 0xA3 ;Nur als Beispiel
|
19 | .DB 0x25, 0x25
|
20 | .DB 0x8A
|
21 | ...
|
22 | ;Z
|
23 | .DB 0x8A, 0xA3
|
24 | .DB 0x25, 0x25
|
25 | .DB 0x8A
|
26 | ...
|
Zu Option 2: bei über 100 Zeichen (100 * 5 bytes), passen die Werte zu
den Adressen nicht mehr in den temp1 Register.
Genauso wenig lässt sich ZH mit einem einfachen add carry korrekt laden.
Wie würde man das anstellen falls diese Variante die bessere ist?