Pfad: Home =>
AVR-Übersicht =>
Board-Hardware =>
4-Bit-LCD am STK500 => Quellcode Basisroutinen
; ********************************************
; * LCD-Basisroutinen für 4-Bit-Anschluss *
; * einer zweizeiligen LCD an einen ATMEL- *
; * Port, Bits 4..7=Data, Bit 1=RS, Bit0=E *
; * Version 1, Februar 2002, (C) 2002 by *
; * Gerhard Schmidt, bug reports and sug- *
; * gestions to info!at!avr-asm-tutorial.net *
; ********************************************
;
; Hardware: LCD-Anzeige am aktiven Port
;
; Definitionen, die in dem aufrufenden Assembler-
; Programm enthalten sein müssen:
; - Stackoperationen
; - Register rmp (R16..R31)
; - Taktfrequenz ftakt
; - pLcdPort Aktiver LCD-Port
; - pLcdDdr Datenrichtungsregister des aktiven Port
; Subroutinen:
; - Lcd4Init: Setzt die LCD zurück
; - Lcd4Chr: Gibt den Character in rmp aus
; - Lcd4PBcd: Gibt die gepackte BCD-Zahl in rmp aus
; - Lcd4ZTxt: Gib nullterminierten Text aus Flash ab Z
; - Lcd4RTxt: Gib rmp chars aus SRAM ab Z aus
;
; Festlegungen für den LCD-Port
.EQU cLcdWrite=0b11111111 ; Datenrichtung Schreibe LCD
.EQU cLcdDummy=0b00111000 ; Dummy-Function-Word
.EQU mLcdRs=0b00000010 ; RS-Bit Maske
.EQU bLcdEn=0 ; Enable Bit
.EQU c1s=200 ; Warten zu Beginn (200 * 5 ms)
.EQU c5ms=ftakt/800 ; 5 ms Warten nach jedem Kontrollwort
.EQU c50us=ftakt/80000 ; 50 us Warten nach jedem Zeichen
;
; Makro für Enable active time
;
; Version für 10 MHz Takt
;.MACRO enactive
; nop
; nop
; nop
; nop
; nop
;.ENDMACRO
;
; Version für 4 MHz Takt
;
.MACRO enactive
nop
nop
.ENDMACRO
;
Lcd4Init:
rcall LcdDelay1s ; Warte eine Sekunde auf LCD
ldi rmp,cLcdWrite ; Datenrichtung auf Ausgang
out pLcdDdr,rmp
ldi rmp,cLcdDummy ; Dummy zum Abfangen der LCD
rcall Lcd4Set ; drei Mal senden mit Delay je 5 ms
rcall LcdDelay5ms
ldi rmp,cLcdDummy
rcall Lcd4Set
rcall LcdDelay5ms
ldi rmp,cLcdDummy
rcall Lcd4Set
rcall LcdDelay5ms
ldi rmp,0b00101000 ; Function Set auf 4 Bit
rcall Lcd4Ctrl ; Ausgabe auf Control Port LCD
ldi rmp,0b00010100 ; Cursor display shift
rcall Lcd4Ctrl
ldi rmp,0b00001100 ; LCD on
rcall Lcd4Ctrl
ldi rmp,0b00000110 ; Entry mode
rcall Lcd4Ctrl
Lcd4Clear:
ldi rmp,0b00000001 ; Set Lcd Clear
rcall Lcd4Ctrl
Lcd4Home:
ldi rmp,0b00000010 ; Set LCD Home Position
;
; Ausgabe von rmp an den Control-Port der LCD
;
Lcd4Ctrl:
push rmp ; Rette Byte
andi rmp,0xF0 ; Lösche unteres Nibble
rcall Lcd4Set ; Gib oberes Nibble aus
pop rmp ; Stelle Byte wieder her
swap rmp ; Vertausche Nibbles
andi rmp,0xF0 ; Lösche unteres Nibble
rcall Lcd4Set ; Gib unteres Nibble aus
rjmp LcdDelay5ms ; Fertig
;
; Gib die gepackte BCD-Zahl in rmp auf dem LCD aus
;
Lcd4PBcd:
push rmp ; Save on stack
swap rmp ; Higher to lower nibble
rcall Lcd4PBcd1 ; Output nibble
pop rmp ; Restore from stack
Lcd4PBcd1:
andi rmp,0x0F ; Mask upper nibble
ori rmp,0x30 ; Nibble to ASCII
;
; Gib char in rmp auf LCD aus
;
Lcd4Chr:
push rmp ; Rette char auf Stapel
andi rmp,0xF0 ; Lösche unteres Nibble
sbr rmp,mLcdRs ; Setze RS-Bit
rcall Lcd4Set ; Gib Nibble aus
pop rmp ; Hole Char vom Stapel
swap rmp ; Vertausche Nibble
andi rmp,0xF0 ; Lösche unteres Nibble
sbr rmp,mLcdRs ; Setze RS-Bit
rcall Lcd4Set ; Gib Nibble aus
rjmp LcdDelay50us ; Fertig
;
; Gib Nibble in rmp an LCD aus
;
Lcd4Set:
out pLcdPort,rmp ; Byte auf Ausgabeport
nop
sbi pLcdPort,bLcdEn ; Setze Enable-Bit
enactive ; Delay macro
cbi pLcdPort,bLcdEn ; Enable Bit löschen
nop
ret
;
; Verzögerung um 1 Sekunde bei Init der LCD
;
LcdDelay1s:
ldi rmp,c1s ; 200 * 5 ms warten
LcdDelay1s1:
rcall LcdDelay5ms
dec rmp
brne LcdDelay1s1
ret
;
; Verzögerung um 5 ms nach jedem Control Word
;
LcdDelay5ms:
push ZH
push ZL
ldi ZH,HIGH(c5ms)
ldi ZL,LOW(c5ms)
LcdDelay5ms1:
sbiw ZL,1
brne LcdDelay5ms1
pop ZL
pop ZH
ret
;
; Delay um 50 Mikrosekunden nach jedem Char
;
LcdDelay50us:
ldi rmp,c50us
LcdDelay50us1:
nop
dec rmp
brne LcdDelay50us1
ret
;
; Gib an der Position in rmp den Text ab Z aus (null-term.)
;
Lcd4ZTxt:
sbr rmp,0b10000000 ; Setze DD-RAM-Adresse
rcall Lcd4Ctrl
Lcd4ZTxt1:
lpm ; Get a char
tst R0 ; Null-Char?
breq Lcd4ZTxtR
mov rmp,R0
rcall Lcd4Chr
adiw ZL,1
rjmp Lcd4ZTxt1
Lcd4ZTxtR:
ret
;
; Gib rmp chars Text im SRAM ab Z aus
;
Lcd4RTxt:
mov R0,rmp ; R0 ist Zähler
Lcd4RTxt1:
ld rmp,Z+ ; Lese char
rcall Lcd4Chr
dec R0
brne Lcd4RTxt1
ret
©2002 by http://www.avr-asm-tutorial.net