Hallo,
es liegt bei mir ein ähnliches Problem vor. Ich verwende allerdings einen PIC16F84A und 162C-LCD-Anzeige.
Mein Skript:
Code:
list p=16f84
;**************************************************************
;* Pinbelegung
;* ----------------------------------
;* PORTA: 0 -
;* 1 -
;* 2 -
;* 3 -
;* 4 -
;* PORTB: 0 LCD Display E
;* 1
;* 2 LCD Display RS
;* 3 LCD Display R/W
;* 4-7 LCD Display D4 .. D7
;*
;**************************************************************
;
;
; LCD-Display
;
; Taktquelle: 4 MHz
;
;**************************************************************
; Includedatei für den 16F84 einbinden
#include <P16F84A.INC>
; Configuration festlegen
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
;**************************************************************
; Variablennamen vergeben
loops Equ 0x22 ; Zähler für Warteschleife
loops2 Equ 0x23 ; Zähler für Warteschleife
Daten Equ 0x24
;**************************************************************
;Ersetzungen:
LcdE equ 0 ; enable Lcd
LcdRw equ 3 ; read Lcd
LcdRs equ 2 ; Daten Lcd (nicht control)
Init:
bsf STATUS,RP0; ->Bank 1
movlw B'00000000'
movwf TRISB;->PortB: alle outputs
bcf STATUS,RP0; ->Bank 0
movwf PORTB;-> alles auf null setzen
call InitLcd;-> initialisieren
;Buchstabe einfuegen
movlw 'H'
bsf PORTB, LcdRs ; auf den Textpuffer schreiben
call Datenreinkopieren; Die Daten werden herein kopiert
bcf PORTB, LcdRs
Main ;Endlosschleife
goto Main
InitLcd
;auf das Ende des internen Resets warten
call Warten
call Warten
call Warten
call Warten
call Warten
call Warten
call Warten
call Warten
call Warten
call Warten
call Warten
;Interface auf 8 bit Eingang setzen
call Achtbitsetzen
call Achtbitsetzen
call Achtbitsetzen
;Interface auf 4-bit Eingang setzen
call Vierbitsetzen
;Interface als zwei zeilig einstellen
call zweizeilig
call Display_aus
call Displayloeschen
call kurser_rechts_shift
call Display_ein
return
Achtbitsetzen; Achtbit-Datenbus einstellen
call Aufnullsetzten; alle Ausgaenge von PortB werden auf low setztrn
bsf PORTB,5
bsf PORTB,4
call Absenden
return
Vierbitsetzen; Vierbit-Datenbus einstellen
call Aufnullsetzten; alle Ausgaenge von PortB werden auf low setzen
bsf PORTB,5
call Absenden
return
Absenden
bsf PORTB,LcdE
call Warten
call Warten
call Warten
bcf PORTB,LcdE
call Warten
return
Aufnullsetzten
movlw B'00000000'
movwf PORTB
return
Datenreinkopieren
call Aufnullsetzten; alle Ausgaenge von PortB werden auf low setzen
;Erster Teil einfuegen (ersten vier Bit)
btfsc Daten, 7
bsf PORTB,7
btfsc Daten, 6
bsf PORTB,6
btfsc Daten, 5
bsf PORTB,5
btfsc Daten, 4
bsf PORTB,4
call Absenden
call Aufnullsetzten; alle Ausgaenge von PortB werden auf low setzen
;Zweiter Teil einfuegen
btfsc Daten, 3
bsf PORTB,7
btfsc Daten, 2
bsf PORTB,6
btfsc Daten, 1
bsf PORTB,5
btfsc Daten, 0
bsf PORTB,4
call Absenden
return
Displayloeschen
movlw B'00000001'
movwf Daten
call Datenreinkopieren
return
Display_aus
movlw B'00001000'
movwf Daten
call Datenreinkopieren
return
Display_ein
movlw B'00001100'
movwf Daten
call Datenreinkopieren
return
zweizeilig
movlw B'00100000'
movwf Daten
call Datenreinkopieren
return
kurser_rechts_shift
movlw B'00000010'
movwf Daten
call Datenreinkopieren
movlw B'00001111'
movwf Daten
call Datenreinkopieren
return
Warten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
return
MSWarten
movlw .110 ; Zeitkonstante für 1ms
movwf loops2
Wai2 nop
nop
nop
nop
nop
nop
decfsz loops2, F ; 1 ms vorbei?
goto Wai2 ; nein, noch nicht
return;
end
Es passiert nichts. Wenn man den Kontrast hochregelt, stellt man fest das nur in der unteren Zeile graue Kästchen erscheinen.
Mit einem Logikprüfer habe ich schon meinen PIC überprüft, es scheint als ob der PIC funktionieren würde. Müssen noch irgendwelche Widerstände zwischen PIC und LCD eingebaut werden? / Oder woran kann so ein Verhalten liegen?
mfg
Sebastian
Lesezeichen