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






Zitieren

Lesezeichen