Beim
Kosmos-Mikrocontroller
gab es ein zweistelliges Siebensegment-Display mit einem
CMOS-Displaytreiber, das über vier Leitung D0 bis Do angesteuert wurde.
Eine weitere Leitung "Digit" diente dazu, zwischen beiden Stellen
umzuschalten. Wenn ich es mit meinem CH32V003 ansteuern will, muss ich
beachten, dass alle Bits um eine Stelle verschoben sind, weil D0 am
Controller die Eingangsleitung ist und die digitalen Ausgänge mit D1
beginnen. Das Display wird aber genauso angesteckt wie im Handbuch zum
Kosmos Mikrocontroller. .
Im Testlab kann man nun diverse Ausgaben testen. Wenn ich eine 8
ausgebe, erscheint auf dem rechten Digit eine 4, weil die Ausgaben um
eine Stelle verschonen sind.
Um das linke Digit anzusteuern, muss D5 gesetzt werden. zusätzlich zur Ziffer muss also 32 ausgegeben werden.
Um links eine 3 auszugeben, muss ich also 3 * 2 + 32 = 38 ausgeben.
Um beide Ziffern zu verwenden, muss man schnell hintereinander das
rechte und das linke Digit ansteuern. Die Ausgabe wird hier also
gemultiplext, wobei jede Zahl für eine Millisekunde leuchtet. Für ein
zweistelliges Display bedeutet das eine Ausgabefrequenz von 500 Hz,
sodass man kein Flackern erkennen kann.
Hier werden die Zahlen von 1 bis 99 hochgezählt. Um die Ziffen zu
trennen, wird zuerst ganzzahlig durch 10 geitelt. so erhält man die
obere Digit und kann es ausgeben. Danach wird diese Ziffer mit 10
Multipliziert. Aus 74 wurde 7, und nun 70. Durch Subtraktion 74-70
landet die untere Ziffer 4 in A und kann rechts ausgegeben werden. Das
Ganze läuft in eienr D-Schleife 250 Mal, also 0,5 Sekunden lang, bis
die folgende Zahl ausgegebnen wird.
REM Display
0x09FE Pdir = 254
0x0A01 Pullup = 1
0x0100 A = 0
L1:
0x4200 Print A
0x04FA D = 250
0x2108 Call L2:
0x2800 A = A + 1
0x2003 Jmp L1:
L2:
0x3600 C = A
0x020A B = 10
0x2D00 A = A / B
0x3400 B = A
0x3100 A = A Shl 1
0x1320 A = A OR = 32
0x4500 Pout = A
0x1901 Delay ms = 1
0x3500 A = B
0x020A B = 10
0x2C00 A = A * B
0x3400 B = A
0x3700 A = C
0x2B00 A = A - B
0x3100 A = A Shl 1
0x4500 Pout = A
0x1901 Delay ms = 1
0x3700 A = C
0x2608 D*Jmp L2:
0x0263 B = 99
0x221E If A=B Jmp L4:
0x4800 Ret
L4:
0x0100 A = 0
0x4800 Ret