-
Hi
Wenn grad das Thema angesprochen wird - bei mir funktioniert das LCD auch nicht wirklich.
Ich hab das blaue LCD 1x16 vom Reichelt. Einen Adapter für LPT gelötet und entsprechendes Ansteuerungsprogramm geschrieben (mit BlitzPlus und lib). Das hat soweit ganz gut funktioniert :)
* Aber *
nun versuche ich, das ganze an mein BMS-Board2 anzuschließen. Als Controller verwende ich einen PIC16F74. Lässt sich programmieren, sonst ist auch alles ok. Zum Proggn verwende ich einen eigenen (Auch mit Blitz+) Compiler, der von einer Art Basic-Sprache zu ASM übersetzt. Das MPASM von Microchip mach daraus HEX und der PBrenner37 von sprut brennt das ganze in den PIC.
Das LCD wird im 4bit-modus angesteuert. Aus Layoutgründen musste ich die Pins:
RS = RC7
R/W = RC6
D4 = RC5
D5 = RC4
D6 = RD3
D7 = RD2
En = RD1
verwenden (ziemlich ungeschickt :( )
Auf der linken Hälfte des LCD sind Rechtecke zu sehen, so wie es sprut schreibt.
Und dazu kommt entsprechender Code (aus dem Header; auszugsweise):
Das ist die eigentliche Sendefunktion. Könnte da mal bitte einer drüber schauen? Kann das so funktionieren?
Code:
;LCD-Send-Funktion
;-----------------
;Bits in W: frei(nix),RS,frei(R/W),D4,D5,D6,D7,frei(En)
lcd_send
;Pins:
; RS = RC7
; (R/W = RC6)
; D4 = RC5
; D5 = RC4
; D6 = RD3
; D7 = RD2
; En = RD1
;Bits löschen, Enable erst mal auf high
bsf PORTD,1
bcf PORTC,7 ;RS
bcf PORTC,6 ;R/W [kann eigentlich immer auf >low< bleiben (lcd=slave), evtl auskommentieren :-)]
bcf PORTC,5 ;D4
bcf PORTC,4 ;D5
bcf PORTD,3 ;D6
bcf PORTD,2 ;D7
movwf lshelp ;sicherheitskopie
bcf W,3 ;bits maskieren
bcf W,2
bcf W,1
bcf W,0
iorwf PORTC,F ;Daten reinschreiben
movf lshelp,W ;sicherheitskopie abrufen
bcf W,7 ;bits maskieren
bcf W,6
bcf W,5
bcf W,4
bcf W,1
bcf W,0
iorwf PORTD,F ;Daten reinschreiben
nop
bcf PORTD,1 ;enable auf low -> lcd reagiert^^ (und leds auch)
call zykwait ;dem lcd ein bisschen zeit geben
bsf PORTD,1 ;enable auf high
return
Und dazu die entsprechende Initialisierung
Code:
lcd_init
;Bits: (frei), RS,(R/W),D4,D5,D6,D7,(Enable)
movlw B'00001000' ;4-bit mode
call lcd_send
movlw B'00001000' ;4-bit,2-zl,5x7-font
call lcd_send
movlw B'00000010' ;2.teil
call lcd_send
movlw B'00000000' ;display on, cursor on +blinken
call lcd_send
movlw B'00011110' ;2.teil
call lcd_send
movlw B'00000000' ;display löschen, cursor@home
call lcd_send
movlw B'00010000' ;2.teil
call lcd_send
movlw B'00000000' ;Auto-incr.
call lcd_send
movlw B'00001100' ;2.teil
return
Ach übrigens: es sind noch 4 leds+vorwiderstände an den datenleitungen angeschlossen.
Die Anoden der LEDs sind am Collector eines pnp-transistors angeschlossen, der bei En=LOW die leds ermöglicht (seltsamer satz^^ - wollte nicht nochmal enabled verwenden). Wenn eine Datenleitung auf low ist, leuchtet die entsprechende led.
-> vllt zieht die led das low-signal in den verbotenen ttl-bereich ???
Danke für jede Hilfe
Mit freundlichen Grüßen
BMS