Hallo
Also so langsam versteh ich das ganze echt nichtmehr. Weiß nichtmehr was ich noch probieren soll. Ich hab mir jetzt mal ein 4 MHz Quarz bestellt und stütze mich auf die Hoffunung daß es damit funktioniert. Habe nämlich die Vermutung daß die Datenwörter einfach zu kurz am Display anliegen und dieses die Befehle gar nicht "mitbekommt" Ich hab jetzt nochmal meine letzte Codevariante angehängt... Kann ja eigentlich auch nicht sein daß hier eigentlich jeder diese Displays zum laufen bekommt nur ich nicht...Falls irgendjemand doch einen Fehler findet bitte melden...
Vielen Dank im Voraus!!!!
MFG
Bean
Code:.include "m8def.inc" .def temp1 = r16 .def temp2 = r17 .def temp3 = r18 ldi temp1, LOW(Ramend) out SPL, temp1 ldi temp1, High(Ramend) out SPH, temp1 ldi temp1, 0xFF out DDRB, temp1 rcall delay5ms rcall lcd_init rcall lcd_clear 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 rcall delay50us andi temp2, 0b00001111 out PORTB, temp2 rcall lcd_enable rcall delay50us ret ;erzeugt den Enable-Puls lcd_enable: sbi PORTB, 7 ;Enable high rcall delay50us cbi PORTB, 7 ;Enable wieder low ret ;wieder zurück ;Pause nach jeder Übertragung delay50us: ;50us Pause ldi temp2, $1E WGLOOP0: ldi temp3, $14 WGLOOP1: dec temp3 brne WGLOOP1 dec temp2 brne WGLOOP0 ;wieder zurück ;Längere Pause für manche Befehle delay5ms: ;5ms Pause WGLOOP2: ldi temp2, $01 WGLOOP3: dec temp2 brne WGLOOP3 dec temp1 brne WGLOOP2 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