Namenlos
05.02.2009, 21:27
Hallo Leute =)
Ich erhoffe mir mal wieder eine gute Hilfe von euch und zwar
geht es um folgendes:
Auf mikrocontroller.net findet man ja im Toutorial eine
sehr gute beschreibung für eine LCD Ansterungsroutine
für eine 4 Bit Ansteuerung.
Da ich aber an meinen ATMega8 viele Pins habe und ich
nur ein paar Pins gebrauche (Display + 2 AD Wandler )
habe ich die Routine ( versucht O:) )
auf 8 Bit umgeschrieben... und nun erhoffe ich mir
ob ihr diese mal auf Fehler kontrollieren könntet oder weitere
Tipps dazu geben könntet =)
Das Toturial auf µC.net
http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD
Liebe Grüße
Namenlos
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 8bit-Interface ;;
;; ;;
;; D0 = PortD0 ;;
;; D1 = PortD1 ;;
;; D2 = PortD2 ;;
;; D3 = PortD3 ;;
;; D4 = PortD4 ;;
;; D5 = PortD5 ;;
;; D6 = PortD6 ;;
;; D7 = PortD7 ;;
;; ;;
;; R/W = PortB0 ;;
;; RS = PortB1 ;;
;; E = PortB2 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.def init = r21
.def temp2 = r22
.def temp3 = r23
.ifndef XTAL
.equ XTAL = 4000000
.endif
lcd_data: ;RS = 1,;sendet ein Datenbyte an das LCD
push init
sbi PortB, 1
rcall lcd_enable
rcall delay50us
pop init
ret
lcd_command:;sendet einen Befehl an das LCD
push init
cbi PortB, 1 ;RS=0, Daten werden geschrieben
rcall lcd_enable
rcall delay50us
pop init
ret ;zurück zum Hauptprogramm
lcd_enable: ;erzeugt den Enable-Puls
;Bei höherem Takt (>= 8 MHz) kann es notwendig sein,
;vor dem Enable High 1-2 Wartetakte (nop) einzufügen.
;Siehe dazu http://www.mikrocontroller.net/topic/81974#685882
sbi PORTB, 2 ; Enable high
nop ; 3 Taktzyklen warten
nop
nop
cbi PORTB, 2 ; Enable wieder low
ret ; Und wieder zurück
delay50us: ;Pause nach jeder Übertragung,50us
ldi init, ( XTAL * 50 / 3 ) / 1000000
delay50us_:
dec init
brne delay50us_
ret ; wieder zurück
delay5ms: ; 5ms Pause
ldi init, ( XTAL * 5 / 607 ) / 1000
WGLOOP0: ldi temp2, $C9
WGLOOP1: dec temp2
brne WGLOOP1
dec init
brne WGLOOP0
ret ; wieder zurück
lcd_init: ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
ldi temp3,50
powerupwait:
rcall delay5ms
dec temp3
brne powerupwait
ldi init, 0b00000011 ; muss 3mal hintereinander gesendet
out PortD, init ; werden zur Initialisierung
rcall lcd_enable ; 1
rcall delay5ms
rcall lcd_enable ; 2
rcall delay5ms
rcall lcd_enable ; und 3!
rcall delay5ms
ldi init, 0b00110000 ; 8Bit / 2 Zeilen / 5x7
rcall lcd_command
ldi init, 0b00001100 ; Display ein / kein Cursor / kein Blinken
rcall lcd_command
ldi init, 0b00000100 ; inkrement / kein Scrollen
rcall lcd_command
ret
lcd_clear: ;Sendet den Befehl zur Löschung des Displays
ldi init, 0b00000001 ; Display löschen
rcall lcd_command
rcall delay5ms
ret
lcd_home: ;Sendet den Befehl: Cursor Home
ldi init, 0b00000010 ; Cursor Home
rcall lcd_command
rcall delay5ms
ret
Ich erhoffe mir mal wieder eine gute Hilfe von euch und zwar
geht es um folgendes:
Auf mikrocontroller.net findet man ja im Toutorial eine
sehr gute beschreibung für eine LCD Ansterungsroutine
für eine 4 Bit Ansteuerung.
Da ich aber an meinen ATMega8 viele Pins habe und ich
nur ein paar Pins gebrauche (Display + 2 AD Wandler )
habe ich die Routine ( versucht O:) )
auf 8 Bit umgeschrieben... und nun erhoffe ich mir
ob ihr diese mal auf Fehler kontrollieren könntet oder weitere
Tipps dazu geben könntet =)
Das Toturial auf µC.net
http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD
Liebe Grüße
Namenlos
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 8bit-Interface ;;
;; ;;
;; D0 = PortD0 ;;
;; D1 = PortD1 ;;
;; D2 = PortD2 ;;
;; D3 = PortD3 ;;
;; D4 = PortD4 ;;
;; D5 = PortD5 ;;
;; D6 = PortD6 ;;
;; D7 = PortD7 ;;
;; ;;
;; R/W = PortB0 ;;
;; RS = PortB1 ;;
;; E = PortB2 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.def init = r21
.def temp2 = r22
.def temp3 = r23
.ifndef XTAL
.equ XTAL = 4000000
.endif
lcd_data: ;RS = 1,;sendet ein Datenbyte an das LCD
push init
sbi PortB, 1
rcall lcd_enable
rcall delay50us
pop init
ret
lcd_command:;sendet einen Befehl an das LCD
push init
cbi PortB, 1 ;RS=0, Daten werden geschrieben
rcall lcd_enable
rcall delay50us
pop init
ret ;zurück zum Hauptprogramm
lcd_enable: ;erzeugt den Enable-Puls
;Bei höherem Takt (>= 8 MHz) kann es notwendig sein,
;vor dem Enable High 1-2 Wartetakte (nop) einzufügen.
;Siehe dazu http://www.mikrocontroller.net/topic/81974#685882
sbi PORTB, 2 ; Enable high
nop ; 3 Taktzyklen warten
nop
nop
cbi PORTB, 2 ; Enable wieder low
ret ; Und wieder zurück
delay50us: ;Pause nach jeder Übertragung,50us
ldi init, ( XTAL * 50 / 3 ) / 1000000
delay50us_:
dec init
brne delay50us_
ret ; wieder zurück
delay5ms: ; 5ms Pause
ldi init, ( XTAL * 5 / 607 ) / 1000
WGLOOP0: ldi temp2, $C9
WGLOOP1: dec temp2
brne WGLOOP1
dec init
brne WGLOOP0
ret ; wieder zurück
lcd_init: ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
ldi temp3,50
powerupwait:
rcall delay5ms
dec temp3
brne powerupwait
ldi init, 0b00000011 ; muss 3mal hintereinander gesendet
out PortD, init ; werden zur Initialisierung
rcall lcd_enable ; 1
rcall delay5ms
rcall lcd_enable ; 2
rcall delay5ms
rcall lcd_enable ; und 3!
rcall delay5ms
ldi init, 0b00110000 ; 8Bit / 2 Zeilen / 5x7
rcall lcd_command
ldi init, 0b00001100 ; Display ein / kein Cursor / kein Blinken
rcall lcd_command
ldi init, 0b00000100 ; inkrement / kein Scrollen
rcall lcd_command
ret
lcd_clear: ;Sendet den Befehl zur Löschung des Displays
ldi init, 0b00000001 ; Display löschen
rcall lcd_command
rcall delay5ms
ret
lcd_home: ;Sendet den Befehl: Cursor Home
ldi init, 0b00000010 ; Cursor Home
rcall lcd_command
rcall delay5ms
ret