.include "m8def.inc" .def temp1 = r16 .def temp2 = r17 .def temp3 = r18 ldi temp1, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse out SPL, temp1 ldi temp1, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse out SPH, temp1 rcall lcd_init rcall lcd_clear rcall lcd_home ldi temp1, 125 loop: lcd_number: push temp2 ; die Funktion verändert temp2, also sichern ; wir den Inhalt, um ihn am Ende wieder ; herstellen zu können mov temp2, temp1 ; das Register temp1 frei machen ; abzählen wieviele Hunderter ; in der Zahl enthalten sind ldi temp1, '0' lcd_number_1: subi temp2, 100 ; 100 abziehen brcs lcd_number_2 ; ist dadurch ein Unterlauf entstanden? inc temp1 ; Nein: 1 Hunderter mehr ... rjmp lcd_number_1 ; ... und ab zur nächsten Runde ; ; die Hunderterstelle ausgeben lcd_number_2: rcall lcd_data subi temp2, -100 ; 100 wieder dazuzählen, da die ; vorherhgehende Schleife 100 zuviel ; abgezogen hat ; abzählen wieviele Zehner in ; der Zahl enthalten sind ldi temp1, '0' lcd_number_3: subi temp2, 10 ; 10 abziehen brcs lcd_number_4 ; ist dadurch ein Unterlauf enstanden? inc temp1 ; Nein: 1 Zehner mehr ... rjmp lcd_number_3 ; ... und ab zur nächsten Runde ; die Zehnerstelle ausgeben lcd_number_4: rcall lcd_data subi temp2, -10 ; 10 wieder dazuzählen, da die ; vorhergehende Schleife 10 zuviel ; abgezogen hat ; die übrig gebliebenen Einer ; noch ausgeben ldi temp1, '0' ; die Zahl in temp2 ist jetzt im Bereich add temp1, temp2 ; 0 bis 9. Einfach nur den ASCII Code für rcall lcd_data ; '0' dazu addieren und wir erhalten dierekt ; den ASCII Code für die Ziffer pop temp2 ; den gesicherten Inhalt von temp2 wieder herstellen ret ; und zurück rjmp loop ; ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden lcd_init: ldi temp1, 0xFF ; alle Pins am Ausgabeport auf Ausgang out LCD_DDR, temp1 ldi temp3,6 powerupwait: rcall delay5ms dec temp3 brne powerupwait ldi temp1, 0b00000011 ; muss 3mal hintereinander gesendet out LCD_PORT, temp1 ; werden zur Initialisierung rcall lcd_enable ; 1 rcall delay5ms rcall lcd_enable ; 2 rcall delay5ms rcall lcd_enable ; und 3! rcall delay5ms ldi temp1, 0b00000010 ; 4bit-Modus einstellen out LCD_PORT, temp1 rcall lcd_enable rcall delay5ms ldi temp1, 0b00101000 ; 4 Bot, 2 Zeilen rcall lcd_command ldi temp1, 0b00001100 ; Display on, Cursor off rcall lcd_command ldi temp1, 0b00000100 ; endlich fertig rcall lcd_command ret .equ LCD_PORT = PORTD .equ LCD_DDR = DDRD .equ PIN_E = 5 .equ PIN_RS = 4 ;sendet ein Datenbyte an das LCD lcd_data: push temp2 mov temp2, temp1 ; "Sicherungskopie" für ; die Übertragung des 2.Nibbles swap temp1 ; Vertauschen andi temp1, 0b00001111 ; oberes Nibble auf Null setzen sbr temp1, 1<