ATMEL AT89s8252 und 16x2 LCD HD 44780 comp.
Hi Folgendes ich habe ein Programm für meinen MC und mein Display geschrieben jedoch bekomme ich das LCD nicht initialisiert vieleicht kann mir jemand von euch helfen.
Pin1 GND
Pin2 VCC
Pin3 V0
Pin4 P1.0
Pin5 GND
Pin6 P1.1
Pin7 --
Pin8 --
Pin9 --
Pin10 --
Pin11 P1.2
Pin12 P1.3
Pin13 P1.4
Pin14 P1.5
Pin15
Pin16
So habe ich die Beiden Teile miteinander Verbunden
und mein Assembler Programm
; Autor : Zunker
; Projekt : LCD
; Datum : Thu Apr 28 13:59:12 UTC+0200 2005
; Quarz : 12.288 MHz
;---------------------------------------------------------------
; Konstanten-, Speicher- und Portbelegung
;---------------------------------------------------------------
LCD_RAM CODE 0Ah
LCD_RS EQU P1.0
LCD_RW EQU P1.1
LCD_ENABLE EQU P3.7
LCD_D4 EQU P1.2
LCD_D5 EQU P1.3
LCD_D6 EQU P1.4
LCD_D7 EQU P1.5
; Programmbeginn
;---------------------------------------------------------------
ORG 0000h
jmp start
; Interruptroutinen
;---------------------------------------------------------------
; Funktionen
;---------------------------------------------------------------
; LC-Display Ansteuerung
; LCD initialisieren
LCD_init:
; warten, bis sich das Display initialisiert hat
mov a,#50
LCD_init_sleepsometime:
call LCD_ws
djnz Acc,LCD_init_sleepsometime
; Steuercodes senden
clr LCD_RS
clr LCD_RW
clr LCD_ENABLE
mov a,#00101000b
call LCD_send_b
setb LCD_ENABLE
clr LCD_ENABLE
mov a,#00101000b
call LCD_send_b
mov a,#1100b
call LCD_send_b
call LCD_clear
ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LCD_returnhome:
push ACC
mov a,#128
call LCD_send_b
mov LCD_RAM,#0
pop ACC
ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LCD_clear:
push ACC
mov a,#1
call LCD_send_b
mov LCD_RAM,#0
pop ACC
ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LCD_printc:
; Ausgabe eines Charakters aus ACC
inc LCD_RAM
push ACC ; bei Überlauf der Spalten in
mov a,LCD_RAM ; nächste Zeile weitersetzen
cjne a,#17,LCD_no_change
mov a,#168
call LCD_send_b
LCD_no_change:
pop ACC
; Zeichen ausgeben
call LCD_send_d
ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LCD_prints:
; Ausgabe eines mit 0 terminierten Strings aus DPTR
push ACC
LCD_prints_anf:
clr a
movc a,@A+DPTR
jz LCD_prints_weiter
inc DPTR
call LCD_printc
jmp LCD_prints_anf
LCD_prints_weiter:
pop ACC
ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LCD_send_b:
;sendet Befehle aus ACC an Datenport des LCD (interne Funktion)
clr LCD_RS
clr LCD_RW
jmp LCD_send
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;sendet Daten aus ACC an Datenport des LCD (interne Funktion)
LCD_send_d:
clr LCD_RW
setb LCD_RS
LCD_send:
mov c,ACC.7 ; high-nibble ausgeben
mov LCD_D7,c
mov c,ACC.6
mov LCD_D6,c
mov c,ACC.5
mov LCD_D5,c
mov c,ACC.4
mov LCD_D4,c
setb LCD_ENABLE
call LCD_ws
clr LCD_ENABLE
mov c,ACC.3 ; low-nibble ausgeben
mov LCD_D7,c
mov c,ACC.2
mov LCD_D6,c
mov c,ACC.1
mov LCD_D5,c
mov c,ACC.0
mov LCD_D4,c
setb LCD_ENABLE
call LCD_ws
clr LCD_ENABLE
ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Warteschleife für das LC-Display: 1.64ms
; Anzahl Maschinenzyklen: 1679.36
LCD_ws:
push psw
push 0
mov 0,#185
LCD_ws_labelA:
nop
nop
nop
nop
nop
nop
nop
djnz 0,LCD_ws_labelA
nop
pop 0
pop psw
ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LCD_msg: db "LCD Ok.",0
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Initialisierung
;---------------------------------------------------------------
start:
; die SFR's initialisieren
mov SP, #20h
; LC-Display initialisieren
call LCD_init
mov DPTR,#LCD_msg
call LCD_prints
; Hauptprogramm
;---------------------------------------------------------------
main:
; [...]
; Programmende
;---------------------------------------------------------------
ende:
jmp ende
END
Vieleicht kann einer von euch nen Fehler finden. Wäre nett wenn ihr mich auf mögliche Fehkler hinweisst.
MFG
Zunker