copyright = Klein Jürgen www = email = klein@aindling.de comment = HomeCon Library libversion = 1.20 date = 19.03.2004 statement = LCD Library für KS0073 EA DIP204-4 license = history = ;---------------------------------------------------------- [_Init_LCD] ;---------------------------------------------------------- ; ; RW liegt auf GND da nur geschrieben wird ; D3, D2, D1, D0 liegen auf GND da nur 4 Bit-Datenlänge ; RS Low für Befehlsübertragung, High für Datenübertragung ; E Low-High-Low für Übertragungsaktivierung ; ; Belegung Jürgen: ; PB5 | PB4 | PC3 PC2 PC1 PC0 | PC3 PC2 PC1 PC0 ; E | RS | D7 D6 D5 D4 | D3 D2 D1 D0 ; | 0 | 0 0 1 0 | 0 1 0 0 | 4 Bit-Datenlänge, extension Bit RE=1 ; | 0 | 0 0 0 0 | 1 0 0 1 | 4 Zeilen Modus ; | 0 | 0 0 1 0 | 0 0 0 0 | 4 Bit-Datenlänge, extension Bit RE=0 ; | 0 | 0 0 0 0 | 0 1 1 0 | Entry Mode Set Cursor Auto-Increment ; | 0 | 0 0 0 0 | 1 1 0 0 | Display ein, Cursor aus, Blinken aus ; | 0 | 0 0 0 0 | 0 0 0 1 | LCD Inhalt löschen und Cursor auf Home ; ; ; Belegung Sepp: ; PC4 | PC5 | PC3 PC2 PC1 PC0 | PC3 PC2 PC1 PC0 ; E | RS | D4 D5 D6 D7 | D0 D1 D2 D3 ; | 0 | 0 1 0 0 | 0 0 1 0 | 4 Bit-Datenlänge, extension Bit RE=1 ; | 0 | 0 0 0 0 | 1 0 0 1 | 4 Zeilen Modus ; | 0 | 0 1 0 0 | 0 0 0 0 | 4 Bit-Datenlänge, extension Bit RE=0 ; | 0 | 0 0 0 0 | 0 1 1 0 | Entry Mode Set Cursor Auto-Increment ; | 0 | 0 0 0 0 | 0 0 1 1 | Display ein, Cursor aus, Blinken aus ; | 0 | 0 0 0 0 | 1 0 0 0 | LCD Inhalt löschen und Cursor auf Home _Init_LCD: rcall LCD_Delay_5ms ; 5ms LCD-Verarbeitungspause einplanen rcall LCD_Delay_5ms ; 5ms LCD-Verarbeitungspause einplanen rcall LCD_Delay_5ms ; 5ms LCD-Verarbeitungspause einplanen rcall LCD_Delay_5ms ; 5ms LCD-Verarbeitungspause einplanen sbi DDRC, 3 ; PC3 (D4/D0) als Ausgang konfigurieren sbi DDRC, 2 ; PC2 (D5/D1) als Ausgang konfigurieren sbi DDRC, 1 ; PC1 (D6/D2) als Ausgang konfigurieren sbi DDRC, 0 ; PC0 (D7/D3) als Ausgang konfigurieren sbi DDRC, 5 ; PC5 (RS) als Ausgang konfigurieren sbi DDRC, 4 ; PC4 (E) als Ausgang konfigurieren ;ldi R24, &B00100100 ; Jürgen 4 Bit-Datenlänge, extension Bit RE=1 ldi R24, &B01000010 ; Sepp 4 Bit-Datenlänge, extension Bit RE=1 rcall _Lcd_control ;ldi R24, &B00001001 ; Jürgen 4 Zeilen Modus ldi R24, &B00001001 ; Sepp 4 Zeilen Modus rcall _Lcd_control ;ldi R24, &B00100000 ; Jürgen 4 Bit-Datenlänge, extension Bit RE=0 ldi R24, &B01000000 ; Sepp 4 Bit-Datenlänge, extension Bit RE=0 rcall _Lcd_control ;ldi R24, &B00000110 ; Jürgen Entry Mode Set Cursor Auto-Increment ldi R24, &B00000110 ; Sepp Entry Mode Set Cursor Auto-Increment rcall _Lcd_control ;ldi R24, &B00001100 ; Jürgen Display ein, Cursor aus, Blinken aus ldi R24, &B00000011 ; Sepp Display ein, Cursor aus, Blinken aus rcall _Lcd_control ret [END] ;---------------------------------------------------------- [_Write_lcd] ;---------------------------------------------------------- _Write_lcd: sbi PortC, 5 ; RS High für Datenübertragung rjmp _Write_lcd_Byte ; weiter zur Datenübertragung _Lcd_control: cbi PortC, 5 ; RS Low für Befehlsübertragung _Write_lcd_Byte: mov R25, R24 ; Zu übertragendes Byte wird in R24 bereitgestellt und in R25 für die Übertragung des 2. Nibble gesichert ; H i g h Nibble muss zuerst übertragen werden swap R24 ; Nibble tauschen andi R24, &B00001111 ; nur die unteren 4 Bit (unteres Nibble) berücksichtigen, obere 4 Bit (oberes Nibble) auf Null setzen in R23, PinC ; PortC in Register R23 einlesen (wegen PC7, PC6, PC5, PC4) diese sollen ja nicht überschrieben werden andi R23, &B11110000 ; nur die oberen 4 Bit (PC7, PC6, PC5, PC4) berücksichtigen, untere 4 Bit (PC3, PC2, PC1, PC0) auf Null setzen or R24, R23 ; PortC (PC7, PC6, PC5, PC4) mit LCD (PC3, PC2, PC1, PC0) in Register R24 vereinen out PortC, R24 ; PortC aus Register R24 setzen rcall LCD_Write_Enable ; Übertragungsaktivierung ; L o w Nibble muss noch übertragen werden andi R25, &B00001111 ; nur die unteren 4 Bit (unteres Nibble) berücksichtigen, obere 4 Bit (oberes Nibble) auf Null setzen or R25, R23 ; PortC (PC7, PC6, PC5, PC4) mit LCD (PC3, PC2, PC1, PC0) in Register R25 vereinen out PortC, R25 ; PortC aus Register R25 setzen rcall LCD_Write_Enable ; Übertragungsaktivierung rcall LCD_Delay_50us ; 50us LCD-Verarbeitungspause einplanen ret LCD_Write_Enable: sbi PortC, 4 ; E High Übertragungsaktivierung gestartet nop ; 3 Taktzyklen warten nop nop cbi PortC, 4 ; E Low Übertragungsaktivierung beendet ret ; Funktionsende LCD_Delay_5ms: ldi R24, 255 ; R24 Register mit Delaywert 100 * 50us vorbelegen LCD_Delay_5ms2: rcall LCD_Delay_50us ; 50us Pause dec R24 ; R24 Registerinhalt um 1 runterzählen brne LCD_Delay_5ms2 ; Springe bei ungleich zurück zu LCD_Delay_5ms2 ret ; Funktionsende LCD_Delay_50us: ldi R25, 165 ; R25 Register mit Delaywert vorbelegen LCD_Delay_50us2: dec R25 ; R25 Registerinhalt um 1 runterzählen brne LCD_Delay_50us2 ; Springe bei ungleich zurück zu LCD_Delay_50us2 ret ; 1 Takt (Befehlszyklus) bei 3,6864Mhz dauert ca. 271ns ; 50us / 271ns * 3 Takte in der Schleife = 61,5 [END] ;---------------------------------------------------------- [_CLS] ;---------------------------------------------------------- _Cls: ;ldi R24, &B00000001 ; Jürgen LCD Inhalt löschen und Cursor auf Home ldi R24, &B00001000 ; Sepp LCD Inhalt löschen und Cursor auf Home rcall _Lcd_control ; Befehl an LCD senden rcall LCD_Delay_5ms ; 5ms LCD-Verarbeitungspause einplanen ret [END]