Du schreibst leider nicht, was für ein Display du hast, bzw. was für ein Controller drauf ist. Auch wird nicht klar warum du den 4-Bit Modus nimmst.
Für den Anfang tät ich normal 8Bit in einem Schritt rüberreichen, mit der selben Schaltung kannst du später immer noch auf 4Bit gehen.
Dein code ist für ein Standard LCD mit HD44780, so du bereit bist nochmal code von asm zu c zu portieren nimm das hier in 8Bit. Wartet immer nur solange bis das Display fertig ist und springt nicht soviel in der Gegend rum (machts auch irgendwie übersichtlicher, IMHO):
Code:
lcdtxbytei:
; write single byte instruction to lcd
; rgtmp haelt instruction
; prepare to write instruction
CBI portb, 6 ; rs to low
; write the byte
RCALL lcdwritebyte
RET
lcdtxbyted:
; write single byte data to lcd
; rgtmp haelt databyte
; prepare to write data
SBI portb, 6 ; rs to high
; write the byte
RCALL lcdwritebyte
RET
lcdwritebyte:
; prepare for write
SBI portb, 0 ; execute to high
CBI portb, 7 ; rw to low
; portd to output (data bits)
LDI rgtmp2, 0xff
OUT DDRD, rgtmp2
; copy byte to port
OUT PORTD, rgtmp
; lower execute, exec instruction
CBI portb, 0 ; execute to low
; --- check busy flag
; portd to input
LDI rgtmp2, 0x00
OUT portd, rgtmp2 ; shut down pullups
OUT DDRD, rgtmp2 ; switch to input
; prepare for busy read
SBI portb, 7 ; rw to high
CBI portb, 6 ; rs to low
busyloop:
; if busy low, don't run in circles
SBIS PIND, 7
RJMP busyend
SBI portb, 0 ; execute to high
RJMP busyloop
; end of busy
busyend:
RET
lcdinit:
; config execute
SBI DDRB, 0 ; PC0 is output
SBI PORTB, 0 ; and set it to high
; config rw (read/write, low for write, high for data/status read)
SBI DDRB, 7 ; PC1 is output
SBI PORTB, 7 ; and set it to high
; config rs (register select, low for instruction, high for data)
SBI DDRB, 6 ; PC2 is output
SBI PORTB, 6 ; and set it to high
; init display
; - 8bit, 2 zeilen
LDI rgtmp, 0x38
RCALL lcdtxbytei
; - 8bit, 2 zeilen
LDI rgtmp, 0x38
RCALL lcdtxbytei
; - display an, cursor an, blink (?)
LDI rgtmp, 0x0e
RCALL lcdtxbytei
; - clear and home display
LDI rgtmp, 0x01
RCALL lcdtxbytei
; - autoincrement
LDI rgtmp, 0x06
RCALL lcdtxbytei
RET
Sorry, hab irgendwie keinen Beispielcode in c...
Lesezeichen