ansteuerung eines LCD mit PIC

Gast #15859
Lesenswert?

Ich schätze du meinst ein Zeichendisplay. Da musst du auf das Timing 
achten. Nach dem Einschalten musst du min. 15ms warten, bis du den 
ersten Befehl losschickst, danach min 4,1ms bis zum 2 ten Befehl und 
dann min 100us bis zum 3.

Schau am besten auch mal hier vorbei: 
http://sprut.de/electronic/lcd/index.htm

Mfg. Ignis Aureus

PS: vielleicht ist auch das Display im Ar*** :-)
Gast #15860
Lesenswert?

Hast du es schon mal mit JAL versucht? Habe in einer ELEKTOR davon 
gelesen.Herundergeladen, PIC und Display zusammengelötet, ein paar 
Zeilen in JAL programmiert und hat gleich funktioniert.Für kleine 
Anwendungen superleicht.

Du kannst dir ja mal das Beispiel für ein Thermometer mit LM75 und 
Display (HD44780) ansehen.

MFG  Günter
Angehängte Dateien:
Gast #15862
Lesenswert?

Hallo,

soweit ich weiß werden die Daten bei der negativen Flanke übernommen. 
Aber das ist eigentlich auch egal, da Du ja immer zuerst die Daten 
anlegst und dann einen Impuls am Enable-Pin erzeugst. Was zeigt das 
Display denn an? Einen schwarzen Balken in der ersten Zeile? Dann hat 
die Initialisierung normaler weise nicht funktioniert.
Ich kann dir am Montag mal meinen ASM-Code anhängen, dann kannst Du dein 
Display mal testen, ob es funktioniert. Habe mir auch mal eins 
geschossen (glaube mit der Programmierspannung des PIC) und dann 
tagelang an einem kaputten Display herumgerätselt oberwohl mein Code ok 
war.

Gruß,

Ralf
Gast #15864
Lesenswert?

Hallo,

das war bei mir auch so. Das kann entweder daran liegen, dass die 
Initialisierung nicht funktioniert hat, das Display nicht per Befehl 
eingeschaltet wurde oder das Display nicht gelöscht wurde. Als letztes 
bleibt dann noch das das Display kaputt ist(so war es leider bei meinen 
ersten Versuchen), aber da sollte man ja zunächst nicht dran denken. 
Fragst Du zur Zeit das Busy-Flag ab? Falls nicht, ist das für das Timing 
der Befehle von Vorteil, da man so immer solange wartet, bis das Display 
intern nichtmehr arbeitet und für einen neuen Befehl zur Verfügung 
steht.
Gast #15865
Lesenswert?

.. das mit der fallenden Flanke hab ich auch so gehandhabt wie´s im 
Datenblatt steht.
Enable war immer high, Daten angelegt - ein paar nop´s damit die Daten 
passen und dann Enable auf low, warten bis die Daten im Diaplay 
gepuffert waren und enable wieder auf high.

so hätts eigentlich funktionieren müssen. Hat es aber nicht in ca. 50% 
der Fälle kam nur Mist raus...
Dann hab ich die Software abgeändert:
Enable immer low, daten anlegen, enable high,warten E auf low, warten... 
seitdem funktioniert alles fehlerfrei.
Verstanden hab ich den zusammenhang nicht   ??

Michael..
Gast #15876
Lesenswert?

Hi,

ich poste hier einfach mal, was ich vor etlichen Jahren in meinem 
jugendlichem Leichtsinn für meine PIC-Library zurechtgezimmert hatte. 
Ist recht ordentlich dokumentiert, wie ich sehe, hätte ich mir gar nicht 
zugetraut ;)
Die Umlaute sind leider flöten gegangen, damals habe ich das noch mit 
DOS oder Windows gemacht.
Ich hoffe, das hilft weiter!




;
;Routinen zur Ansteuerung eines LCD-Displays mit Hitachi 
44780-Controller
;Vor dem ersten Aufruf mssen PA0, PA1 und PB4-PB7 auf Ausgang gestellt 
werden
;


;Portzuweisung
LCD_DATA  EQU  PORTB
LCD_CTRL  EQU  PORTA

;Fileregister
lcd_counter  EQU  $2D

;PORTA Kontroll Bits
LCD_E    EQU  0
LCD_RS    EQU  1


;LCD-Kommandos
LCD_CLEAR  EQU  %00000001
LCD_HOME  EQU  %00000010
LCD_INC_SHIFT  EQU  %00000111
LCD_INC_FREEZE  EQU  %00000110
LCD_DEC_SHIFT  EQU  %00000101
LCD_DEC_FREEZE  EQU  %00000100
LCD_OFF    EQU  %00001000
LCD_ON    EQU  %00001100
LCD_CURSOR_ON  EQU  %00001111
LCD_CURSOR_OFF  EQU  %00001100

LCD_LEFT  EQU  $0      ;DD-Adresse fr linke H„lfte
LCD_RIGHT  EQU  $40      ;DD-Adresse fr rechte H„lfte


;*** LCD-Display initialisieren
lcd_init

    movlw  30      ;Startup-Verz”gerung 15ms
    call  x_delay500

    movlw  48
    movwf  LCD_DATA
    call  pulse
    movlw  9      ;Verz”gerung 4,5ms
    call  x_delay500

    movlw  48
    movwf  LCD_DATA
    call  pulse
    call  delay500    ;Verz”gerung 500æs

    movlw  48
    movwf  LCD_DATA
    call  pulse
    movlw  9      ;Verz”gerung 4,5ms
    call  x_delay500

    movlw  32      ;4-Bit-Mode
    movwf  LCD_DATA
    call  pulse
    call  delay500    ;Verz”gerung 500æs

    movlw  40      ;1/16 duty cycle
    call  lcd_cmd

    movlw  LCD_OFF      ;Display, Cursor, Blinken aus
    call  lcd_cmd

    movlw  LCD_CLEAR    ;Display l”schen, Curser auf 1
    call  lcd_cmd

    movlw  LCD_INC_FREEZE    ;Inkrementelles Schreiben
    call  lcd_cmd

    clrf  lcd_counter    ;Cursorposition initialisieren

    return


;*** Zeichen auf dem LCD-Display ausgeben
lcd_char
    movwf  temp1      ;Zeichen zwischenspeichern
    movlw  %00001111    ;Portbits B4-B7 l”schen
    andwf  LCD_DATA,F    ;und ausgeben

    movlw  %11110000    ;Highnibble extrahieren
    andwf  temp1,W      ;in W
    iorwf  LCD_DATA,F    ;und ausgeben

    bsf  LCD_CTRL,LCD_RS    ;Byte ist Zeichen
    call  pulse

    movlw  %00001111    ;Portbits B4-B7 l”schen
    andwf  LCD_DATA,F    ;und ausgeben

    movlw  %00001111    ;Lownibble extrahieren
    andwf  temp1,F      ;in F
    swapf  temp1,W      ;in Highnibble von W
    iorwf  LCD_DATA,F    ;und ausgeben

    call  pulse
    bcf  LCD_CTRL,LCD_RS    ;RS-Flag l”schen

    call  delay500    ;Verz”gerung 500æs

    incf  lcd_counter,F    ;Cursorposition aktualisieren

    return



;*** Befehl an LCD-Controller bergeben
lcd_cmd
    movwf  temp1      ;Befehl zwischenspeichern
    movlw  %00001111    ;Portbits B4-B7 l”schen
    andwf  LCD_DATA,F    ;und ausgeben

    movlw  %11110000    ;Highnibble extrahieren
    andwf  temp1,W      ;in W
    iorwf  LCD_DATA,F    ;und ausgeben

    call  pulse

    movlw  %00001111    ;Portbits B4-B7 l”schen
    andwf  LCD_DATA,F    ;und ausgeben

    movlw  %00001111    ;Lownibble extrahieren
    andwf  temp1,F      ;in F
    swapf  temp1,W      ;in Highnibble von W
    iorwf  LCD_DATA,F    ;und ausgeben

    call  pulse

    movlw  4      ;Verz”gerung 2ms
    call  x_delay500
    return


lcd_setcursor
    movwf  temp3      ;Adresse zwischenspeichern
    movwf  lcd_counter    ;Cursor aktualisieren
    bsf  temp3,7      ;DD-RAM adressieren
    movf  temp3,W
    call  lcd_cmd      ;und anzeigen
    return


;*** Enable-Puls ausgeben
pulse
    bsf  LCD_CTRL,LCD_E
    bcf  LCD_CTRL,LCD_E
    return

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren