; ******************************************* ; * LCD-Basisroutinen fuer 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 http://avr-asm-tutorial.net * ; ******************************************* ; ; Hardware: LCD-Anzeige am aktiven Port ; ; Definitionen, die in dem aufrufenden Assembler- ; Programm enthalten sein muessen: ; - Stackoperationen ; - Register rmp (R16..R31) ; - Taktfrequenz ftakt ; - pLcdPort Aktiver LCD-Port ; - pLcdDdr Datenrichtungsregister des aktiven Port ; Subroutinen: ; - Lcd4Init: Setzt die LCD zurueck ; - 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 fuer 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 fuer Enable active time ; ; Version fuer 10 MHz Takt ;.MACRO enactive ; nop ; nop ; nop ; nop ; nop ;.ENDMACRO ; ; Version fuer 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 ; Loesche unteres Nibble rcall Lcd4Set ; Gib oberes Nibble aus pop rmp ; Stelle Byte wieder her swap rmp ; Vertausche Nibbles andi rmp,0xF0 ; Loesche 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 ; Loesche 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 ; Loesche 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 loeschen nop ret ; ; Verzoegerung um 1 Sekunde bei Init der LCD ; LcdDelay1s: ldi rmp,c1s ; 200 * 5 ms warten LcdDelay1s1: rcall LcdDelay5ms dec rmp brne LcdDelay1s1 ret ; ; Verzoegerung 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 Zaehler Lcd4RTxt1: ld rmp,Z+ ; Lese char rcall Lcd4Chr dec R0 brne Lcd4RTxt1 ret