Halloo Leute ich verzweifle... wie kann ich eine etwas in die 2 Zeile meines Displays ausgeben. Folgendes: Dieses Programm schreibt mir XiMiX nur ich will das in der 2 Zeile zugleich EISTEE steht.... bitte um Hilfe list p=16f84 #include <P16f84.INC> ERRORLEVEL -302 loops equ 0x20 ; Wartezeit für WAIT in Millisekunden loops2 equ 0x21 ; interner timer für wait LcdStatus equ 0x22 ; Puffer für aus dem LCD ausgelesenes Statusbyte LcdDaten equ 0x23 ; Puffer für zum LCD zu schreibendes Byte LcdDaten1 equ 0x4F Taste equ 0x24 ; Tastaturpuffer #define LcdE PORTB,0 ; enable Lcd #define LcdRw PORTB,3 ; read Lcd #define LcdRs PORTB,2 ; Daten Lcd (nicht control) #define LcdPort PORTB ; Datenbus des LCD (obere 4 Bit) ; für Tastatur-Anschluß #define KRow1 PORTB,1 ;Keyboard 1 4 7 * #define KRow2 PORTB,2 ;Keyboard 2 5 8 0 #define KRow3 PORTB,3 ;Keyboard 3 6 9 # #define KLine1 PORTB,4 ;Keyboard 1 2 3 #define KLine2 PORTB,5 ;Keyboard 4 5 6 #define KLine3 PORTB,6 ;Keyboard 7 8 9 #define KLine4 PORTB,7 ;Keyboard * 0 # Ini_con Equ B'00000000' ; Interupt disable Ini_opt Equ B'00000010' ; pull-up ;******************************************************** ; Das Programm beginnt mit der Initialisierung Init bsf STATUS, RP0 ; Bank 1 movlw Ini_opt ; pull-up Wiederstände ein movwf OPTION_REG movlw B'00000000' ; PortB alle outputs movwf TRISB bcf STATUS, RP0 ; Bank 0 clrf PORTB movlw Ini_con ; Interupt disable movwf INTCON ;Display initialisieren call InitLcd mainloop call Tastfrei ; darauf warten, das keine Taste gedrückt ist ; call WAIT ; entprellen nur bei schlechten Tasten nötig drueck call Tastatur ; wird nun eine Taste gedrückt? movfw Taste ; Tastencode nach w; Taste=0 dann Z=1 btfsc STATUS, Z ; skip wenn Taste<>0 goto drueck ; Tastencode=0 d.h. keine Taste gedrückt, weiter warten call OutLcdDaten ; Tastencode am LCD ausgeben goto mainloop ; auf ein neues ;***************************************************** ;+++LCD-Routinen************************************** ;***************************************************** ;LCD initialisieren in 9 Schritten, Begrüßung ausgeben InitLcd movlw D'255' ; 250 ms Pause nach dem Einschalten movwf loops call WAIT movlw B'00110000' ; 1 movwf LcdPort bsf LcdE nop bcf LcdE movlw D'50' ; 50 ms Pause movwf loops call WAIT movlw B'00110000' ; 2 call Control8Bit movlw B'00110000' ; 3 call Control8Bit movlw B'00100000' ; 4 call Control8Bit movlw B'00000001' ; löschen und cusor home call OutLcdControl movlw B'00101000' ; 5 function set, 4-bit 2-zeilig, 5x7 call OutLcdControl movlw B'00001000' ; 6 display off call OutLcdControl movlw B'00000110' ; 7 entry mode, increment, disable display-shift call OutLcdControl movlw B'00000011' ; 8 cursor home, cursor home call OutLcdControl movlw B'00001111' ; 9 display on call OutLcdControl movlw 'X' ; 'XiMiX:' ausgeben call OutLcdDaten movlw 'i' call OutLcdDaten movlw 'M' call OutLcdDaten movlw 'i' call OutLcdDaten movlw 'X' call OutLcdDaten movlw 'E' ; 'EISTEE:' ausgeben call OutLcdDaten movlw 'I' call OutLcdDaten movlw 'S' call OutLcdDaten movlw 'T' call OutLcdDaten movlw 'E' call OutLcdDaten movlw 'E' call OutLcdDaten return ;***************************************************** ; ein Steuerbyte aus W 8-bittig übertragen Control8Bit movwf LcdPort bsf LcdE nop bcf LcdE movlw D'10' movwf loops call WAIT return ;***************************************************** ; darauf warten, daß das Display bereit zur Datenannahme ist ; dazu wird das busy-Bit des LCD abgefragt LcdBusy bsf STATUS, RP0 ; make Port B4..7 input movlw B'11110000' iorwf TRISB, f bcf STATUS, RP0 BusyLoop bcf LcdRs ; Steuerregister bsf LcdRw ; Lesen bsf LcdE nop movf LcdPort, w ; 4 obere Bits lesen (D7..D4) movwf LcdStatus ; und in LcdStatus speichern bcf LcdE nop bsf LcdE nop ; 4 untere Bits lesen (D3..D0) und ignorieren bcf LcdE btfsc LcdStatus, 7 ; teste bit 7 goto BusyLoop bcf LcdRw bsf STATUS, RP0 ; make Port B4..7 output movlw B'00001111' andwf TRISB, f bcf STATUS, RP0 return ;***************************************************** ; aus W ein Byte mit Steuerdaten zum Display übertragen OutLcdControl movwf LcdDaten ; Byte in LcdDaten zwischenspeichern call LcdBusy ; warten bis Display bereit ist movf LcdDaten, w ; Byte zurück nach W holen andlw H'F0' ; low-Teil löschen movwf LcdPort ; Hi-teil Daten schreiben bsf LcdE nop bcf LcdE ; Disable LcdBus swapf LcdDaten, w ; Byte verdreht nach W holen andlw H'F0' ; High Teil löschen movwf LcdPort ; Low-teil Daten schreiben bsf LcdE nop bcf LcdE ; Disable LcdBus return ;***************************************************** ; aus W ein Datenbyte (zum Anzeigen) an's Display übertragen OutLcdDaten movwf LcdDaten ; Byte in LcdDaten zwischenspeichern call LcdBusy ; warten bis Display bereit ist movf LcdDaten, w ; Byte zurück nach W holen andlw H'F0' ; low-Teil löschen movwf LcdPort ; Hi-teil Daten schreiben bsf LcdRs ; Daten bsf LcdE ; Enable LcdBus nop bcf LcdE ; Disable LcdBus swapf LcdDaten, w ; Byte verdreht nach W holen andlw H'F0' ; High Teil löschen movwf LcdPort ; Low-teil Daten schreiben bsf LcdRs ; Daten bsf LcdE nop bcf LcdE ; Disable LcdBus bcf LcdRs ; return ;***************************************************** ;+++Tastatur-Routinen********************************* ;***************************************************** ; warten darauf, daß keine Taste mehr gedrückt ist Tastfrei ; Warten auf freie Tastatur call Tastatur ; Tastencode nach Taste & W movfw Taste ; wenn code=0 dann Z=1 btfss STATUS, Z ; wenn Z=1 dann skip goto Tastfrei ; weiter warten return ; Tastatur ist frei ;***************************************************** ; ist eine Taste gedrückt? und welche? ; der Tastencode wird in W und Taste gespeichert (ASCII) ; wenn keine Taste gedrückt wurde, wird 0 zurückgegeben ; ; zur Erinnerung liste ich noch mal die weiter oben aufgeführten ; Definitionen auf ; mit denen ist festgelegt, an welche Pins des PortB die einzelnen ; Spalten und Zeilen der Tastatur abgeschlossen sind ;#define KRow1 PORTB,1 ;Keyboard 1 4 7 * ;#define KRow2 PORTB,2 ;Keyboard 2 5 8 0 ;#define KRow3 PORTB,3 ;Keyboard 3 6 9 # ;#define KLine1 PORTB,4 ;Keyboard 1 2 3 ;#define KLine2 PORTB,5 ;Keyboard 4 5 6 ;#define KLine3 PORTB,6 ;Keyboard 7 8 9 ;#define KLine4 PORTB,7 ;Keyboard * 0 # Tastatur ; zuerst müssen die Tastaturzeilen-Pins auf Eingang gestellt werden bsf STATUS, RP0 ; Bank 1 movlw Ini_opt ; pull-up Widerstände ein movwf OPTION_REG movlw B'11110000' ; RB0 .. RB3 output, RB4 .. RB7 input movwf TRISB bcf STATUS, RP0 ; Bank 0 ; das Enable-Pin des Displays muß auf Low stehen, damit das Display ; abgeschaltet ist solange wir die Tastatur abfragen clrf PORTB ; Display inaktiv am Bus ; w wird auf 0 gesetzt, dieser Wert wird durch ein ASSCI-Zeichen ; überschrieben, falls eine Taste gedrückt ist ; falls keine Taste gedrückt ist, bleibt 0 erhalten movlw 0 ; W=0 bcf KRow1 ; 1. spalte aktivieren bsf KRow3 bsf KRow2 call key1 ; 1. Spalte abfragen bcf KRow2 ; 2.Spalte aktivieren bsf KRow1 ; 1.Spalte ausschalten call key2 ; 2. Spalte bcf KRow3 ; 3. Spalte aktivieren bsf KRow2 ; 2. spalte ausschalten call key3 ; 3. Spalte bsf KRow3 ; 3. Spalte ausschalten movwf Taste ; PortB wieder komplett zu Output machen bsf STATUS, RP0 ; Bank 1 movlw B'00000000' ; RB1 .. RB7 output movwf TRISB bcf STATUS, RP0 ; Bank 0 return key1 btfss KLine1 retlw '1' btfss KLine2 retlw '4' btfss KLine3 retlw '7' btfss KLine4 retlw '*' return key2 btfss KLine1 retlw '2' btfss KLine2 retlw '5' btfss KLine3 retlw '8' btfss KLine4 retlw '0' return key3 btfss KLine1 retlw '3' btfss KLine2 retlw '6' btfss KLine3 retlw '9' btfss KLine4 retlw '#' return ;***************************************************************** ;Zeitverzögerung um loops * 1 ms ********************************* ;***************************************************************** ; universelle Warteschleife, sowas braucht man öfter ; z.B. für die LCD-Initialisierung ; in loops wird die Wartezeit in Millisekunden übergeben ; ; 10 MHz externer Takt bedeutet 2,5 MHz interner Takt ; also dauert 1 ms genau 2500 Befehle ; 250 Schleifen a 10 Befehle sind 2500 Befehle = 1 ms WAIT top movlw .250 ; timing adjustment variable (1ms) movwf loops2 top2 nop ; warten und nichts tun nop nop nop nop nop nop decfsz loops2, F ; innere Schleife fertig? goto top2 ; nein, noch mal rum ; decfsz loops, F ; äußere Schleife fertig? goto top ; nein, noch mal rum retlw 0 ; FERTIG und return end
Den DDRAM-Adress-Zeiger vor der Ausgabe von "EISTEE" auf die 2.Zeile setzen und es sollte funktionieren. Gruß Skriptkiddy
Hi Die 2.Zeile fängt bei den Meisten Displays auf der Adresse $40 an. Also nach der ersten Zeile DDRAM auf $40 setzen. MfG Spess
ich verstehe nur nicht wie ich das auf diese Adresse setzte.... könntets ihr mir vl. eine Zeile vorschreiben bittee
HI >könntets ihr mir vl. eine Zeile vorschreiben Ich kenne zwar PICs nicht, aber das sollte passen: movlw B'11000000' call Control8Bit MfG Spess
Wenn der Controller ein HD44780 ist, dann schick 0xC0 als Befehl und dein Wunsch geht in Erfüllung =)
Im Datenbaltt des hd44780-Controllers steht wie ein Kommando zum setzen des DDRAM-Pointers auszusehen hat. Ein Bisschen selber machen schadet ja nicht. Ulrich Radig hat mal ne schöne Zusammenfassung [1] gerschrieben. Da steht alles drinne, was für die Charakter-LCDs wichtig ist. [1] http://www.ulrichradig.de/home/uploads/File/AVR_LCD/LC.pdf Gruß Skriptkiddy
Skript Kiddy schrieb: > Ulrich Radig hat mal ne schöne Zusammenfassung [1] gerschrieben. Da > steht alles drinne, was für die Charakter-LCDs wichtig ist. > > > [1] http://www.ulrichradig.de/home/uploads/File/AVR_LCD/LC.pdf Ah, jetzt weiß ich endlich, warum hier soviele Leute "Standart" schreiben :-)
hy ich verzweifle, habe 3stunden alles probiert nur... ich bringe es nicht zam etwas in der 2 zeile darzustellen.... bitte um hilfee dankee
Im Datenblatt mal schauen, an welcher Adresse die zweite Zeile beginnt?
Spess53 schrieb: > HI > >>könntets ihr mir vl. eine Zeile vorschreiben > > Ich kenne zwar PICs nicht, aber das sollte passen: > > movlw B'11000000' > call Control8Bit > Hmm. SOllte da nicht ein Aufruf von movlw B'11000000' call OutLcdControl sein? Control8Bit wird laut Initialisierung verwendet, wenn das LCD noch nicht durch die Initialisierung durch ist. Nachdem es auf 4 BIt umgeschaltet wurde, wird nur noch OutLcdControl verwendet
Karl heinz Buchegger schrieb: > Hmm. > SOllte da nicht ein Aufruf von > > movlw B'11000000' > call OutLcdControl > > sein? Würde ich auch sagen.
zieh Dir mal den Stoff hier rein ist echt gut. http://www.sprut.de/electronic/lcd/index.htm#2x16 Spess hat ja schon richtig gesagt '11000000' mußt Du an dein Display als Kommando senden nicht als Daten .Man beachte also die RS-Leitung glaube ich. lcd_command MOVWF command movF command,0 andlw b'11110000' iorwf PORTB,1 CALL lcd_enable swapf command,0 andlw b'11110000' iorwf PORTB,1 CALL lcd_enable call wait_2ms RETLW 0 lcd_enable nop BSF PORTB,3 nop nop nop nop nop nop BCF PORTB,3 nop nop nop clrf PORTB RETLW 0 Kannst Dir ja mal meinen Cod anschauen ,vieleicht bringts was!
Spess53 schrieb: > HI > >>könntets ihr mir vl. eine Zeile vorschreiben > > Ich kenne zwar PICs nicht, aber das sollte passen: > > movlw B'11000000' > call Control8Bit > > MfG Spess Ich habe von PIC mindestens noch weniger Ahnung, aber wenn ich mir den Quelltext anschaue, dann eher OutLcdControl als Control8Bit (OutLcdControl überträgt nibbleweise, Control8Bit byteweise).
Mario Horvat schrieb: > dankee leutee ich habs gschafft :D na toll, und dafür habe ich versucht nachzudenken :-) Was wars?
Klaus Wachtler schrieb: > Spess53 schrieb: >> HI >> >>>könntets ihr mir vl. eine Zeile vorschreiben >> >> Ich kenne zwar PICs nicht, aber das sollte passen: >> >> movlw B'11000000' >> call Control8Bit >> >> MfG Spess > > Ich habe von PIC mindestens noch weniger Ahnung, Gehts dir wie mir :-) > aber > wenn ich mir den Quelltext anschaue, dann eher OutLcdControl > als Control8Bit (OutLcdControl überträgt nibbleweise, Control8Bit > byteweise). Find ich immer wieder faszinierend, wenn Programmierer ihre eigenen Funktionen nicht kennen. Oder sollte er am Ende gar nicht ....
ich hab statt movlw B'11000000' call Control8Bit geschrieben statt movlw B'11000000' call OutLcdControl
Klaus Wachtler schrieb: > Karl heinz Buchegger schrieb: >> call OutLcdControl > > Mist, wieso ist der wieder schneller? Bin doch grad erst online gekommen! @TO Mich hat der 8-er in Control8Bit stutzig gemacht, also hab ich hochgescrollt. Der Rest war reine Logik und programmieren durch 'vorhandenen Code ansehen' und 'vergleichende Verhaltensfor... ääääh Programmierung'. Funktioniert meistens ganz gut, sich einfach mal ansehen, wie an anderen Stellen im Code Commandos gesendet werden. Und dann 2 und 2 zusammenzählen.
Mario Horvat schrieb: > ich hab statt > movlw B'11000000' > call Control8Bit > geschrieben statt > > movlw B'11000000' > call OutLcdControl Wahnsinn, Und da bist du 3 Stunden lang nicht draufgekommen, dass du den falschen Call hast? Respekt.
jaa keine ahnung... bin noch Schüler, und sowas haben wir bis jz. noch nie gemacht...
Hi >>Karl heinz Buchegger schrieb: >> Hmm. >> SOllte da nicht ein Aufruf von >> >> movlw B'11000000' >> call OutLcdControl >> >> sein? >Würde ich auch sagen. Ich jetzt auch. War die falsche Stelle aus der ich die Zeilen kopiert hatte. Zumindest hat es, dank aufmerksamer Mitleser, etwas zur Lösung beigetragen. MfG Spess
Hi
>War bestimmt Absicht, damit der TO auch etwas mitdenkt :-)
Eher Mitleid.
MfG Spess
Mario Horvat schrieb: > jaa keine ahnung... > bin noch Schüler, und sowas haben wir bis jz. noch nie gemacht... Darum gehts eigentlich gar nicht. Klar, man übernimmt schon mal Code. Was aber in der Programmierung gar nicht geht: Code übernehmen, ohn ihn sich nicht wenigstens einmal anzusehen. Und wo Code ungeschaut zu übernehmen überhaupt nicht geht, das ist in der Assembler-Programmierung. Du musst wissen welche Funktionen du übernimmst, was sie machen und welche Register sie verwenden. Abschreiben, so wie man eine Mathe-Hausaufgabe abschreiben kann, führt gerade in der Assembler-Programmierung unweigerlich ins Desaster. Oder eben so wie bei dir: zu 3 verlorenen Stunden
Wenn er was gelernt hat, war es doch nicht verloren, zumindest nicht für ihn. Du bist doch sonst so geduldig?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.