Witam !! Wiem, że temat ten był już niejednokrotnie wałkowany tu na forum, ale ja już mam dosyć, 3 dni siedzenia nad jednym i tym samym trochę męczy i zniechęca. Poniżej zamieściłem kod mojego programu obsługi LCD i prosiłbym, aby ktoś powiedział mi dlaczego on nie chce działać. Inicjalizację robiłem na podstawie algorytmu z książki "Mikrokontrolery 8051 w praktyce" dla 4 - bitowej magistrali.
;Obsluga wyswietlacza
Data_LCD EQU P2
EN EQU P2.3
RW EQU P2.2
RS EQU P2.1
LED EQU P1.0
lcall LCD_INIT
lcall LCD_CLR
mov A,#'X'
lcall WYSW_ZNAK
Blink:
cpl LED
loop2:
djnz R5,$
djnz R6,loop2
ljmp blink
WYSW_ZNAK:
setb RS
clr RW
lcall LCD_ZAPIS
lcall Readbusy
ret
LCD_ZAPIS:
push ACC
orl Data_LCD,#0F0h
orl A,#0Fh
anl Data_LCD,A
setb En
mov R3,#5d
lcall Delay_ms
clr En
pop ACC
swap A
orl Data_LCD,#0F0h
orl A,#0Fh
anl Data_LCD,A
setb En
mov R3,#5d
lcall Delay_ms
clr En
ret
LCD_CLR:
clr RS
clr RW
setb En
orl Data_LCD,#0F0h
anl Data_LCD,#0Fh
clr En
mov R3,#5d
lcall Delay_ms
setb En
lcall Readbusy
ret
LCD_INIT:
clr RS
clr RW
setb En
mov R3,#50d ;czeka 50 ms
lcall Delay_ms ;
anl Data_LCD,#3Fh ;wpisuje do portu 3Fh
clr En ;zapisuje wartosc 3 do wyswietlacza (8-bit)
mov R3,#5d ;czeka 5 ms
lcall Delay_ms ;
setb En
mov R3,#10d ;czeka 10 ms
lcall Delay_ms
clr En ;zapisuje 3 do wyswietlacza (8-bit)
mov R3,#5d ;czeka 5 ms
lcall Delay_ms
setb En
mov R3,#1d ;czeka 1 ms
lcall Delay_ms
clr En ;zapisuje 3 do wyswietlacza (8-bit)
mov R3,#5d
lcall Delay_ms
setb En
clr RS
clr RW
orl Data_LCD,#0F0h
anl Data_LCD,#2Fh
clr En ;wpisanie do LCD 2 (4-bit)
mov R3,#5d
lcall Delay_ms
setb En
lcall Readbusy
clr En ;Function set (4-bit)
mov R3,#5d ;
lcall Delay_ms ;
setb En ;
mov R3,#5d ;
lcall Delay_ms ;
orl Data_LCD,#0F0h ;Function set N=1-dwie linie
anl Data_LCD,#8Fh ;F=0-znaki 5x7 punktow
clr En ;wpisanie do LCD
mov R3,#5d
lcall Delay_ms
setb En
lcall Readbusy
orl Data_LCD,#0F0h ;Display ON/OFF
anl Data_LCD,#0Fh ;
clr En ;wpisanie do LCD
mov R3,#5d
lcall Delay_ms
setb En
lcall Readbusy
orl Data_LCD,#0F0h ;Display ON/OFF
anl Data_LCD,#8Fh ;
clr En ;wpisanie do LCD
mov R3,#5d
lcall Delay_ms
setb En
lcall Readbusy
orl Data_LCD,#0F0h ;
anl Data_LCD,#0Fh ;
clr En ;wpisanie do LCD
mov R3,#5d
lcall Delay_ms
setb En
lcall Readbusy
orl Data_LCD,#0F0h ;
anl Data_LCD,#1Fh ;
clr En ;wpisanie do LCD
mov R3,#5d
lcall Delay_ms
setb En
lcall Readbusy
orl Data_LCD,#0F0h ;Entry mode set
anl Data_LCD,#0Fh ;
clr En ;wpisanie do LCD
mov R3,#5d
lcall Delay_ms
setb En
lcall Readbusy
orl Data_LCD,#0F0h
anl Data_LCD,#6Fh
clr En ;wpisanie do LCD
mov R3,#5d
lcall Delay_ms
setb En
lcall Readbusy
ret
ReadBusy:
clr RS
setb RW
orl Data_LCD,#0F0h
Busy:
setb En
mov A,Data_LCD
clr En
JB ACC.7,Busy
clr RW
ret
Delay_ms:
mov R1,#45d
mov R2,#10d
Loop:
DJNZ R1,$;trwa 0,0001 sekundy przy zegarze 11,0592MHz
DJNZ R2,loop; calosc trwa w przyblizeniu 1 ms
DJNZ R3,loop; w zaleznosci od zawartosci rejestru R3
ret
end