Vielen Dank erstnal für die Antwort! Hab meine Schleifen jetzt um gemodelt. Das sollte nun eigentlich ncihtmehr das Problem sein. Trotzdem bin ich so langsam am verzweifeln. Versuche den ganzen Tag schon dieses Display zum laufen zu bekommen. Aber es will nicht wie ich will. Ich hab jetzt mal meinen Code angehängt. Wie das Display an den Controller angeschlossen ist steht auch da drin. Vielleicht kann mir ja jemand weiterhelfen. Würde mich sehr freuen.
MFG
Mr Bean
Code:
.include "m8def.inc"
.def temp1 = r16
.def temp2 = r17
.def temp3 = r18
ldi temp1, LOW(RAMEND) ;LOW-Byte der obersten RAM-Adresse
out SPL, temp1
ldi temp1, HIGH(RAMEND) ;High-Byte der obersten Ram-Adresse
out SPH, temp1
ldi temp1, 0xFF ;PortB=Ausgang
out DDRB, temp1
rcall lcd_init ;Display initialisieren
rcall lcd_clear ;Display löschen
ldi temp1, 'T' ;Zeichen anzeigen
rcall lcd_data
ldi temp1, 'e'
rcall lcd_data
ldi temp1, 's'
rcall lcd_data
ldi temp1, 't'
rcall lcd_data
loop:
rjmp loop
; LCD Routinen
;4-Bit Interface
;BDB4-BDB7: PB0 - Pb3
;RS: PB4
;E: PB7
;sendet ein DAtenbyte an das LCD
lcd_data:
mov temp2, temp1 ;"Sicherungskopie" für die Übertragung des zweiten Nibbles
swap temp1 ;vertauschen
andi temp1, 0b00001111 ;oberes Nibble auf 0 setzen
sbr temp1, 1<<4 ;entspricht 0b00010000
out PORTB, temp1 ;ausgeben
rcall lcd_enable ;Enable-Routine aufrufen
andi temp1, 0b00001111 ;obere Hälfte auf null setzen
sbr temp2, 1<<4 ;entspricht 0b00010000
out PORTB, temp2 ;ausgeben
rcall lcd_enable ;enable routine aufrufen
rcall delay50us ;Delay routine aufrufen
ret ;zurück zum Hauptprogramm
;sendet einen Befehl an das LCD
lcd_command: ;wie lcd_data, nur ohne RS zu setzen
mov temp2, temp1
swap temp1
andi temp1, 0b00001111
out PORTB, temp1
rcall lcd_enable
andi temp2, 0b0001111
out PORTB, temp2
rcall lcd_enable
rcall delay50us
ret
;erzeugt den Enable-Puls
lcd_enable:
sbi PORTB, 7 ;Enable high
nop ;6 Taktzyklen warten
nop
nop
nop
nop
nop
nop
nop
nop
cbi PORTB, 7 ;Enable wieder low
ret ;wieder zurück
;Pause nach jeder Übertragung
delay50us: ;50us Pause
ldi temp1, $E9
WGLOOP0: dec temp1
brne WGLOOP0
ret ;wieder zurück
;Längere Pause für manche Befehle
delay5ms: ;5ms Pause
ldi temp1, $8F
WGLOOP2: ldi temp2, $E7
WGLOOP3: dec temp2
brne WGLOOP3
dec temp1
brne WGLOOP2
ldi temp1, $01
WGLOOP4: dec temp1
brne WGLOOP4
ret ;wieder zurück
;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
ldi temp3,50
powerupwait:
rcall delay5ms
dec temp3
brne powerupwait
ldi temp1, 0b00000011 ;muss 3 mal hintereinander gesendet werden zur Initialisierung
out PORTB, temp1 ;1
rcall lcd_enable
rcall delay5ms
rcall lcd_enable ;2
rcall delay5ms
rcall lcd_enable ;3
rcall delay5ms
ldi temp1, 0b00000010 ;4Bit Modus einstellen
out PORTB, temp1
rcall lcd_enable
rcall delay5ms
ldi temp1, 0b00101000
rcall lcd_command
ldi temp1, 0b00001100
rcall lcd_command
ldi temp1, 0b00000100
rcall lcd_command
ret
;sendet einen Befehl zur Löschung des Displays
lcd_clear:
ldi temp1, 0b00000001 ;Display Löschen
rcall lcd_command
rcall delay5ms
ret
Lesezeichen