logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

LCD 2x16 HD44780 - Błędne pozycjonowanie tekstu na wyświetlaczu 89s52

No Comprende 05 Cze 2005 12:03 1397 3
REKLAMA
  • #1 1551766
    No Comprende
    Poziom 12  
    Posty: 93
    Pomógł: 4
    Ocena: 2
    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:
    
    ;***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
  • REKLAMA
  • #2 1551961
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    W tym watku https://www.elektroda.pl/rtvforum/topic119911.html zapodałem procedurki do LCD na interfejs 8 bitowy (działają bo wielokrotnie sprawdzone), inne są tylko porty ale jak widzę oreirntujesz się w temacie to powinieneś dać sobie radę.
  • REKLAMA
  • #3 1552312
    No Comprende
    Poziom 12  
    Posty: 93
    Pomógł: 4
    Ocena: 2
    No wyglada na to ze znalazlem blad, a prznajmniej jeden z bledow. W procedurze goto_xy zapomnialem wyrzucic na port lcd-ka pozycje na ktora ma isc kursor i tak zostawaly sobie te dane w akumie :) Mam nadzieje ze to jedyny blad, bo procedura init chociaz inna niz twoja powinna dzialac, w koncu byla na necie:P
  • #4 1557802
    No Comprende
    Poziom 12  
    Posty: 93
    Pomógł: 4
    Ocena: 2
    Wszystko bylo by pieknie gdyby nie jeszcze jeden problem, 2 linia wyswietlacza nie daje znakow zycia, kolega kupil identyczny wyswietlacz i ma ten sam problem tzn: na poczatku 2 linia dzialala (tekst sie pojawial), pozniej bez wyraznej przyczyny przestala dzialac, a teraz losowo raz na jakis czas ozywa. Czy ktos orientuje sie co moze byc tego przyczna? Wolalbym uniknac kupowania nowego wysw. jesli nie ma takiej potrzeby.
REKLAMA