; D.2 = RS ; D.3 = E ; D.4 = D.7 = DB4 - DB7 ; GND = R/W ; LCD Init ldi r16,0b11111100 out DDRD,r16 ; D.2 - D.7 = Ausgang clr r16 out PORTD,r16 ; Alles '0' rcall Warte50ms ; ca.50ms warten bis LCD bereit ldi r16,0b00110000 ; RESET-Sequenz out PORTD,r16 rcall LCD_Enable rcall Warte2ms rcall Warte2ms rcall Warte2ms ldi r16,0b00110000 out PORTD,r16 rcall LCD_Enable rcall Warte2ms ldi r16,0b00110000 out PORTD,r16 rcall LCD_Enable rcall Warte2ms ldi r16,0b00100000 ; - 4-Bit Modus (muss einmal out PORTD,r16 ; allein gesendet werden) rcall LCD_Enable rcall Warte2ms ; - Zeit zum Umschalten ldi r18,0b00101000 ; LCD-Modus: 4-Bit, 2 Zeilen, 5x7 rcall LCD_Cmd rcall LCD_Off rcall LCD_Clr ldi r18,0x06 ; Entry Mode Set rcall LCD_Cmd rcall LCD_On ;--------------------------------------------------------------------------- LCD_Data: ldi r16,0b00000100 ;- RS(D.2) = hi - Daten senden rjmp LCD_Out LCD_Cmd: ldi r16,0b00000000 ;- RS(D.2) = lo - Kommando senden LCD_Out: mov r17,r18 ;- r18 nach r17 kopieren. swap r17 ;- r17 Halbbytes tauschen. andi r18,0b11110000 ;- In beiden Registern andi r17,0b11110000 ; unteres Halbbyte löschen. or r18,r16 ;- RS-Bit entsprechend.. or r17,r16 ; setzen oder löschen. ; In r18 steht jetzt nur das obere Halbbyte von r18 und das RS-Bit(D.2) out PORTD,r18 rcall LCD_Enable ; In r17 steht jetzt nur das untere Halbbyte von r18 und das RS-Bit out PORTD,r17 rcall LCD_Enable rcall Warte50us ret ;--------------------------------------------------------------------------- LCD_Enable: sbi PORTD,3 ; Enable high nop ; kurz warten nop nop nop ; kurz warten nop nop cbi PORTD,3 ; Enable wieder low ret ;--------------------------------------------------------------------------- LCD_Clr: ldi r18,0b00000001 ; Display löschen rcall LCD_Cmd rcall Warte2ms ret ;--------------------------------------------------------------------------- LCD_Off: ldi r18,0b00001000 rcall LCD_Cmd rcall Warte50us ret ;--------------------------------------------------------------------------- LCD_On: ldi r18,0b00001100 ; Bit0=Cursor blink rcall LCD_Cmd ; Bit1=Cursor On/Off rcall Warte50us ; Bit2=Display On/Off ret ;--------------------------------------------------------------------------- LCD_Home: ldi r18,0b00000010 ; Display Cursor HOME rcall LCD_Cmd rcall Warte2ms ret ;--------------------------------------------------------------------------- LCD_Line1: ldi r18,0b10000000 ; DRAM auf Adresse 0x00 = 1.Zeile rcall LCD_Cmd rcall Warte50us ret ;--------------------------------------------------------------------------- LCD_Line2: ldi r18,0b11000000 ; DRAM auf Adresse 0x40 = 2.Zeile rcall LCD_Cmd rcall Warte50us ret ;--------------------------------------------------------------------------- ; Goto Adresse (Zeile 1 = 0x00..0x0F, Zeile 2 = 0x40..0x4F) LCD_Goto: ori r18,0b10000000 ; Goto DRAM auf Adresse r18(r16) rcall LCD_Cmd rcall Warte50us ret ;---------------------------------------------------------------------------