.equ PIN_RS = 4 .equ PIN_RW = 5 .equ PIN_E = 6 ;definitionsdatei .include "m8def.inc" ;+++++++++++++++++++++++ Einstellung DDR +++++++++++++++++++++++++ ldi r16, 255 out DDRD, r16 ldi r16, 0 out DDRC, r16 out DDRB, r16 ;+++++++++++++++++++++++ Stackpointer initialisieren +++++++++++++ ldi r16, low (ramend) out spL, r16 ldi r16, high (ramend) out spH, r16 ;*********************** Hauptprogramm *************************** main: rcall lcdini /* ldi r17, 48 rcall dataus ldi r17, 'a' rcall dataus ldi r17, 'l' rcall dataus ldi r17, 'l' rcall dataus ldi r17, 'o' rcall dataus */ loop: rcall loop // programmende ;*********************** Routinen ******************************** ;------------------------ Zeit ----------------------------------- ms2: ldi r24, low (500) // 2000 = µs = 2ms; 4 = takte ldi r25, high (500) // 2000 = µs = 2ms; 4 = takte ms21: sbiw r24,1 //2takte brne ms21 //2takte ret //4takte ms5: ldi r24, low (2000) // 2000 = µs = 2ms; 4 = takte ldi r25, high (2000) // 2000 = µs = 2ms; 4 = takte ms51: sbiw r24,1 //2takte brne ms51 //2takte ret //4takte ;+++++++++++++++++++++++ LCD-Routinen ++++++++++++++++++++++++++++ enab: sbi PORTD, PIN_E //erzeugt den Enable Takt zum Übernehmen für Initalisierung NOP NOP NOP NOP cbi PORTD, PIN_E ret komaus: //kommandoausgabe auf r17 mov r18, r17 swap r17 andi r17, 0b00001111 // UND; Übernehme nur die rechten 4 bits out PORTD, r17 //kommando auf ausgang rcall enab //fallende flanke an E übernimmt mov r17, r18 andi r17, 0b00001111 out PORTD, r17 rcall enab //fallende flanke an E übernimmt ret dataus: //datenausgabe auf r17 sbi PORTD, PIN_RS //RS = high; daten mov r18, r17 swap r17 andi r17, 0b00001111 out PORTD, r17 //daten auf ausgang rcall enab //fallende flanek übernimmt mov r17, r18 andi r17, 0b00001111 out PORTD, r17 rcall enab //fallende flanke übernimmt cbi PORTD, PIN_RS ret ;*********************** für LCD-Ansteuerung ********************* ;+++++++++++++++++++++++ LCD initialisieren ++++++++++++++++++++++ // 4 bit betrieb, 2 Zeilen, 5x7 Matrix, lcdini: ldi r16, 8 // nach einschalten 15 ms warten lcd: rcall ms2 dec r16 brne lcd ldi r17, 0b00000011 // 3 mal senden out PORTD, r17 rcall enab //1 mal rcall ms5 rcall enab //2 mal rcall ms5 rcall enab //3 mal rcall ms5 ldi r17, 0b00000010 // 4 bit-modus out PORTD, r17 rcall enab rcall ms5 ldi r17, 0b00101000 // 4 bit, 2 Zeilen, 5*7 Fonts rcall komaus ldi r17, 0b00001110 // Display ON, Cursor ON; underline rcall komaus ldi r17, 0b00000100 // fertig rcall komaus ret