solltest Du Dein Display mal in Betrieb nehmen hier der Code dazu.
Warum mein Display nichts mehr macht weiss ich nicht.
An allen Pins kommt die Bits so an wie sie müssen.
Egal andere Mütter haben auch schöne Displays
Grüsse Joshy
PS. Der lesende Teil des Displays habe ich auskommentiert daher kannst Du den Propeller direkt 1:1 an das Display anschliesen. Die 3.3V vom Prop werden in der 5V Welt auch als High Pegel erkannt. Nur beim Lesen von 5V Pegeln braucht der Prop für seine 3.3V einen Spannungsteiler.
Code: Alles auswählen
''******************************************************
''* Propeller WINTEC WD-C2704M-1HNN display interface *
''******************************************************
CON
_CLKMODE = XTAL1 + PLL16X ' externer Quartz x 16
_XINFREQ = 5_000_000
' Display pins
#4,RS,RW,E1,E2,D0,D1,D2,D3,D4,D5,D6,D7
LED=D7+1
PUB Main | ctrl,char
PortInit
WaitMS(15) ' > 15 ms
' init Controller 1 (E1) oder 2 (E2)
ctrl:=E2
WriteCMD(ctrl,$38)
WaitMS(5) ' >4.1 ms
WriteCMD(ctrl,$380)
WaitMS(1) ' >1 µs
WriteCMD(ctrl,$38) ' ab hier Busy Flag auswerten bzw. Pause für Display
WaitWhileBusy(ctrl)
WriteCMD(ctrl,$38) ' SYSTEM SET 8Bit 2 lines
WaitWhileBusy(ctrl)
WriteCMD(ctrl,$0F) ' Display an mit blinkendem unterstrich Cursor
' controller 1 (Zeile 1 u. 2)
WaitWhileBusy(ctrl)
WriteCMD(ctrl,$01) ' Display löschen
WaitWhileBusy(ctrl)
WriteCMD(ctrl,$02) ' Cursor Pos1 (home)
WaitWhileBusy(ctrl)
WriteCMD(ctrl,$04 | %10) ' ENTRY MODE SET (nach jedem zeichen ein Schritt rechts)
' Nur ein Test um 8 eigene Zeichen zu definieren
'WaitWhileBusy(ctrl)
'WriteCMD(ctrl,$40 | 0) ' SET CGRAM ADRESS 0 (erste Zeichendefinition)
'repeat 8*8
' WriteDATA(ctrl,$FF) ' 8 invertierte Spaces
WaitWhileBusy(ctrl)
WriteCMD(ctrl,$80 | 0) ' SET DDRAM ADRESS 0 (erste Zeile erste Spalte)
' 27 Zeichen ab Space in oberster Zeile ausgeben
repeat char from 1 to 27
WaitWhileBusy(ctrl)
WriteDATA(ctrl,$20+char)
repeat 'endlos
PRI SetLED(boolean) ' nur als Test LED
if boolean<>0
outa[LED]:=1
else
outa[LED]:=0
PRI WaitMS(ms) | now ' kurze Pausen für das Display
now := CNT
now += CLKFREQ / 1000 * ms
WaitCnt(now)
PRI PortInit | pin ' Alle Displaypins als Ausgänge
outa[RS..LED]~
dira[RS..LED]~~
PRI WriteCMD(c,cmd) ' sende Commando zu Controller 1 oder 2
outa[RW] := 0 ' schreibend
outa[RS] := 0 ' Steuerleitung auf Commando
outa[D0..D7] := cmd
outa[c] := 0 ' nicht nötig !!!
outa[c] := 1 ' comando wird bei fallender Flanke übernommen
WaitMS(1)
outa[c] := 0
PRI WriteDATA(c,data) ' sende daten zu Controller 1 oder 2
outa[RW] := 0 ' schreibend
outa[RS] := 1 ' Steuerleitung auf Daten
outa[D0..D7] := data
outa[c] := 0 ' nicht nötig !!!
outa[c] := 1 ' Daten werden bei fallender Flanke übernommen
WaitMS(1)
outa[c] := 0
PRI WaitWhileBusy(c) | reg ' Busy so lange bit 7 gesetzt ist
SetLED(1) ' Kontroll LED an
WaitMS(5) ' Pause für Display
SetLED(0) ' Kontroll LED aus
return ' und zurück
' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
' !!! wird im Moment nicht benutzt !!!
' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
dira[D7] := 0 ' als Eingänge
outa[RW] := 1 ' lesend
repeat
outa[c] := 0 ' ansteigende Flanke setzt daten
outa[c] := 1 ' daten gültig so lange high
WaitMS(1) ' Zeit für Display nicht nötig !!!
reg := ina[D7]
outa[c] := 0
if reg==0
quit
dira[D7]:= 1 ' D7 wieder als Ausgang
outa[RW]:= 0 ' wieder schreibend
SetLED(0) ' controll LED aus