Code:
;----------------------------------------------------------
;Anschlussbelegung mein LCD
;----------------------------------------------------------
;DB4 = PC3 = PIN11
;DB5 = PC2 = PIN12
;DB6 = PC1 = PIN13
:DB7 = PC0 = Pin14
;E = PD6 = PIN6
;RS = PD7 = PIN4
;R/W = GND = Pin5
;----------------------------------------------------------
[_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
;
;Anschlussbelegung LCD
; PD6 | PD7 | PC0 PC1 PC2 PC3 | PC0 PC1 PC2 PC3
; 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 | 0 0 0 1 | LCD Inhalt löschen und Cursor auf Home
; | 0 | 0 0 0 0 | 1 1 0 0 | Display ein, Cursor aus, Blinken aus
_Init_LCD:
mov r1, r18 ;Registerinhalte sichern
mov r3, r21
mov r6, r22
mov r7, r23
mov r8, r24
mov r9, r28
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, 0 ; PC3 (D3/D7) als Ausgang konfigurieren
sbi DDRC, 1 ; PC2 (D2/D6) als Ausgang konfigurieren
sbi DDRC, 2 ; PC1 (D1/D5) als Ausgang konfigurieren
sbi DDRC, 3 ; PC0 (D0/D4) als Ausgang konfigurieren
sbi DDRD, 6 ; PD4 (E) als Ausgang konfigurieren
sbi DDRD, 7 ; PD5 (RS) als Ausgang konfigurieren
ldi r24, &B00100100 ; 4 Bit-Datenlänge, extension Bit
rcall _Lcd_control
ldi r24, &B00001001 ; 4 Zeilen Modus
rcall _Lcd_control
ldi r24, &B00100000 ; 4 Bit-Datenlänge, extension Bit RE=0
rcall _Lcd_control
ldi r24, &B00000110 ; Entry Mode Set Cursor Auto-Increment
rcall _Lcd_control
ldi r24, &B00001100 ; Display ein, Cursor aus, Blinken aus
rcall _Lcd_control
mov r18, r1 ;alte Registerinhalte wieder zurück
mov r21, r3
mov r22, r6
mov r23, r7
mov r24, r8
mov r28, r9
[END]
;----------------------------------------------------------
[_Write_lcd]
;----------------------------------------------------------
_Write_lcd:
mov r1, r18 ;Registerinhalte sichern
mov r3, r21
mov r6, r22
mov r7, r23
mov r8, r24
mov r9, r28
sbi PortD, 7 ; RS High für Datenübertragung
rjmp _Write_lcd_Byte ; weiter zur Datenübertragung
_Lcd_control:
cbi PortD, 7 ; RS Low für Befehlsübertragung
_Write_lcd_Byte:
ldi r18, 8 ;Für Schleife 8 x
loop: mov r23, R24 ;Zu übertragendes Byte wird in R24 bereitgestellt und in R23 für Bitmanipulation
andi r28, &B00000001 ;nur LSB wird ausgewertet
ror r24 ;R24 wird nach rechts verschoben
rol r22 ;R22 wird nach links verschoben
or r22, r28 ;R22 und R28 in Register R25 vereinen
Dec r18 ;-1
Brne loop ;springe zu Schleife wenn R18 > 0
mov r24, r22 ;R22 wird in R24 bereitgestellt
swap r24 ;Nibble tauschen die Daten stehen jetzt gespiegelt an PC0 - PC3!!
mov r22, r24 ; Zu übertragendes Byte wird in R24 bereitgestellt und in R22 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 R21, PinC ; PortC in Register R21 einlesen (wegen PC7, PC6, PC5, PC4) diese sollen ; ja nicht überschrieben werden
andi R21, &B11110000 ; nur die oberen 4 Bit (PC7, PC6, PC5, PC4) berücksichtigen, untere 4 Bit ; (PC3, PC2, PC1, PC0) auf Null setzen
or R24, R21 ; 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 R22, &B00001111 ; nur die unteren 4 Bit (unteres Nibble) berücksichtigen, obere 4 Bit ; (oberes Nibble) auf Null setzen
or R22, R21 ; PortC (PC7, PC6, PC5, PC4) mit LCD (PC3, PC2, PC1, PC0) in Register R22 ; vereinen
out PortC, R22 ; PortC aus Register R22 setzen
rcall LCD_Write_Enable ; Übertragungsaktivierung
rcall LCD_Delay_50us ; 50us LCD-Verarbeitungspause einplanen
ret
LCD_Write_Enable:
sbi PortD, 6 ; E High Übertragungsaktivierung gestartet
nop ; 3 Taktzyklen warten
nop
nop
cbi PortD, 6 ; 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 R22, 165 ; R22 Register mit Delaywert vorbelegen
LCD_Delay_50us2:
dec R22 ; R22 Registerinhalt um 1 runterzählen
brne LCD_Delay_50us2 ; Springe bei ungleich zurück zu LCD_Delay_50us2
ret ; 1 Takt (Befehlszyklus)
mov r18, r1 ;alte Registerinhalte wieder zurück
mov r21, r3
mov r22, r6
mov r23, r7
mov r24, r8
mov r28, r9
[END]
;----------------------------------------------------------
[_CLS]
;----------------------------------------------------------
_Cls:
mov r1, r18 ;Registerinhalte sichern
mov r3, r21
mov r6, r22
mov r7, r23
mov r8, r24
mov r9, r2
ldi R24, &B00000001 ; LCD Inhalt löschen und Cursor auf Home
rcall _Lcd_control ; Befehl an LCD senden
rcall LCD_Delay_5ms ; 5ms LCD-Verarbeitungspause einplanen
ret
mov r18, r1 ;alte Registerinhalte wieder zurück
mov r21, r3
mov r22, r6
mov r23, r7
mov r24, r8
mov r28, r9
[END]
Die Anschlußbelegung steht in der Libary mit drin.
Lesezeichen