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