Witam, problem mam nastepujacy:
Kupilem wyswietlacz 2x16, kontroler zgodny z HD44780. Napisalem (przepisalem z 8052.com) procedury obslugi i zaprogramowalem proca (89s52) zeby wyswietlal przykladowy tekst. Zamiast wyswietlic jeden wyraz w 1 lini (od 3go miejsca) a drugi w drugiej (od 5tego), oba zostaly wyswietlone w 1 od 0go - nadpisanie. Napis powinien wygladac tak:
___Taryfikator
_____b.beta
a wyglada tak:
v.betakator
czyli oba napisy od pozycji 00h
Nie wiem czy blad tkwi w programie czy to wina wyswietlacza, a ciezko mi samemu experymentowac bo mam zepsuty programator i z kazda zmiana programu musze chodzic do kolegi.
Prosze o rade jak w najprostszy sposob ustalic co jest zle i ew. propozycje poprawek
Ponizej zamieszczam kod:
P.S. Jesli ktos by mial mozliwosc sprawdzic ten prog u siebie to rowniez bede wdzieczny, albo ew. wkleic procedury dzialajce na 100% zebym mogl porownac
Kupilem wyswietlacz 2x16, kontroler zgodny z HD44780. Napisalem (przepisalem z 8052.com) procedury obslugi i zaprogramowalem proca (89s52) zeby wyswietlal przykladowy tekst. Zamiast wyswietlic jeden wyraz w 1 lini (od 3go miejsca) a drugi w drugiej (od 5tego), oba zostaly wyswietlone w 1 od 0go - nadpisanie. Napis powinien wygladac tak:
___Taryfikator
_____b.beta
a wyglada tak:
v.betakator
czyli oba napisy od pozycji 00h
Nie wiem czy blad tkwi w programie czy to wina wyswietlacza, a ciezko mi samemu experymentowac bo mam zepsuty programator i z kazda zmiana programu musze chodzic do kolegi.
Prosze o rade jak w najprostszy sposob ustalic co jest zle i ew. propozycje poprawek
Ponizej zamieszczam kod:
;***Dla LCD***
lcd equ p2 ;port LCD
en bit p3.7 ;strob
rw bit p3.6 ;zapis/odczyt
rs bit p3.5 ;komenda/dane
org 0h
ljmp start
org 100h
start: acall init_lcd
acall clr_lcd
mov a,#03h ;w tym miejscu wyswietle napis 'taryikator'
acall goto_xy ;przemieszczenie kursora do adresu z acc
mov dptr,#taryfikator ;adres napisu
acall wr_str ;wyswietlenie napisu
mov a,#45h ;dolna linijka
acall goto_xy
mov dptr,#v.beta ;adres napisu
acall wr_str ;wyswietlenie napisu
sjmp $
;***************************
;*******OBSLUGA LCD*********
;***************************
;***Ustawienie parametrow pracy LCD
;***Magistrala 8bit, 2 wiersze, okno nieruchome, kursor przesuwany w prawo, brak migotania znaku pod kursorem
init_lcd: clr rs ;niski rs - komenda
mov lcd,#38h ;function set (001DN0XX) D=1 - magistrala 8-bit,N=1 - wysw. ma 2 wiersze
setb en ;D=1 - mag. 4-bit, N=0 - ;wysw. ma 1 wiersz
clr en
acall wait_lcd
clr rs ;znowu komenda
mov lcd,#0eh ;display on/off (00001DCB) D=1 - LCD wlaczony, C=1 - kursor widoczny ;B=1 - miganie znaku w miejscu polozenia kursora wlaczone
setb en ;machniecie strobem
clr en
acall wait_lcd
clr rs
mov lcd,#06h ;entry mode set (000001IS) I=1 - kursor przesuwa sie w prawo, S=0 - przy kolejnych
;operacjach zapisu kursor sie przesuwa a okno jest nieruchome
setb en
clr en
acall wait_lcd
ret
;***Wyswietlacz wypelniany spacjami, ustawienie kursora w 00h (DDRAM), przejscie w tryb zapisu danych
;***Przesuwanie okna wylaczone
clr_lcd: clr rs ;niski rs - komenda
mov lcd,#01h ;display clear
setb en
clr en
acall wait_lcd
ret
;***Ustawienie kursora w pozycji okreslonej w acc (tylko 7*A -> adres DD RAM), niszczy acc***
goto_xy: clr rs ;niski rs oznacza komende
orl a,#80h ;kod komendy to 1AAAAAAA gdzie 7*A -> adres kursora przekazany wczesniej
setb en
clr en
acall wait_lcd
ret
;***Zapisanie znaku z acc do LCD
wr_txt: setb rs ;wysoki rs oznacza zapisywanie danych do lcd
mov lcd,a
setb en
clr en
acall wait_lcd
ret
;***Czekanie na gotowosc wyswietlacza
wait_lcd: clr en ;ustawienie bitow do odczytu wskaznika zajetosci
clr rs
setb rw
mov lcd,#0ffh ;ustawienie portu do odczytu
setb en
mov a,lcd ;pobranie stanu portu
jb acc.7,wait_lcd ;petla dopoki wyswietlacz zajety
clr en
clr rw
ret
;***wyswietal string o adr poczatkowym umieszczonym w dptr, niszczy acc
wr_str: clr a
movc a,@a+dptr ;pobranie znaku z offsetem 0
cjne a,#'$',nxt ;spr. czy koniec stringu (znak konca -> $)
ret ;wystapil znak konca, wyjscie
nxt: acall wr_txt ;wypisanie znaku
inc dptr ;przesuwamy sie do nastepnego znaku
sjmp wr_str
org 300h
;***Napisy dla LCD***
taryfikator: db 'Taryfikator$' ;10 znakow, zeby byl na srodku zaczac od 03h
v.beta: db 'v.beta$' ;6 znakow, 05h
P.S. Jesli ktos by mial mozliwosc sprawdzic ten prog u siebie to rowniez bede wdzieczny, albo ew. wkleic procedury dzialajce na 100% zebym mogl porownac