@Hubert.G
ich bin gerade dabei mir Assembler beizubringen.
hab da ein Paar Zeilen Code geschriben, versuche erst eimal übersichtlichkeithalber mit 8-Bit-Modus.
hier poste ich's mal, falls jemand sich die Zeit nimmt wäre ich sehr dankbar.
Code:
;LCD-Ansteuerung im 8-Bit-Modus
;PORTC -- Datenbits DB0-DB7
;Enable -- PD6
;R/S -- PD7
;R/W -- GND
.INCLUDE "m16def.inc"
.EQU XTAL=1000000
.DEF temp1=r16
.DEF temp2=r17
.DEF temp3=r18
.DEF temp4=r19
.DEF temp5=r20
.CSEG
rjmp main
.ORG $2A
main: ldi temp1,LOW(RAMEND)
out SPL,temp1
ldi temp1,HIGH(RAMEND)
out SPH,temp1
ldi temp1,0x0F
out DDRD,temp1
ldi temp1,0xFF
out DDRB,temp1
out DDRC,temp1
rcall lcd_init
rcall lcd_clear
rcall lcd_home
loop: ldi temp1,0x55
rcall lcd_data
out PORTB,temp1 ;bloß Kontrolle
rjmp loop
lcd_enable: sbi PORTD,PD6 ;E setzten
nop
nop
cbi PORTD,PD6 ;E zurück
ret
;sendet ein Datenbyte an LCD
lcd_data: sbi PORTD,PD7 ;R/S-Bit
out PORTC,temp1
rcall lcd_enable
rcall delay_5ms
cbi PORTD,PD7 ;R/S-Bit
ret
;sendet ein Befehl an LCD
lcd_command: cbi PORTD,PD7 ;R/S-Bit
out PORTC,temp1
rcall lcd_enable
rcall delay_5ms
ret
;initialisiert LCD
lcd_init: push temp1
push temp3
ldi temp3,5
pow_upwait: rcall delay_5ms
dec temp3
brne pow_upwait
ldi temp1,0b00110000
out PORTC,temp1
cbi PORTD,PD7
rcall lcd_enable
rcall delay_5ms
ldi temp1, 0b00110000 ; 8bit-Modus einstellen
out PORTC,temp1
rcall lcd_enable
rcall delay_5ms
ldi temp1,0b00110000 ; Functoin set
rcall lcd_enable
rcall delay_5ms
ldi temp1,0b00010100 ; Cursor,Display,Shift
rcall lcd_enable
rcall delay_5ms
ldi temp1,0b00001100 ; Display,on/off
rcall lcd_enable
rcall delay_5ms
ldi temp1,0b00000110 ; Entry mode
rcall lcd_enable
rcall delay_5ms
pop temp3
pop temp1
ret
;löscht LCD
lcd_clear: push temp1
ldi temp1,0b00000001 ;Display löschen
rcall lcd_command
rcall delay_5ms
pop temp1
ret
;cursor home
lcd_home: push temp1
ldi temp1,0b00000010 ;cursor home
rcall lcd_command
rcall delay_5ms
pop temp1
ret
;Warteschleifen
delay_50us: push temp1
ldi temp1,20 ;Takt=1MHz
delay_50us_: nop
dec temp1
brne delay_50us ;verzweige bei=0 pop temp1
ret
delay_5ms: push temp1
push temp2
ldi temp1,5
d_5ms_a: ldi temp2,100 ;100 dezimal
d_5ms_i: nop ;interne Schleife=5Takte
nop
dec temp2
brne d_5ms_i ;gibt 500 Durchläufe=500us
dec temp1
brne d_5ms_a
nop
pop temp2
pop temp1
ret
.EXIT
@Dolfo
hab nochmal alles gecheckt - Verdrahtungs- und Hardwarefehler kann man fast ausschliessen.
Chip-Select ("Enable") Signal schaltet auch mit acitve high (eigentlich wie alle anderen Pins)
R/W Signal aktiviert (Befehle werden nur beim Pegelwechsel übernommen, müssen also schon vorher am Bus anliegen)?
du meinst wahrscheinlich R/S oder? weil R/W habe ich einfach auf GND gelegt.
und RS aktiviere ich nur wenn ich Daten senden will und keine Befehle.
Lesezeichen