📄 mcs51_list_10_3.asm
字号:
;=======================================================
;
; Tomasz Starecki: "Mikrokontrolery 8051 w praktyce"
; Wydawnictwo BTC - http://www.btc.pl
;
;=======================================================
; podstawowe procedury obslugi 2-wierszowego
; alfanumerycznego wyswietlacza LCD
; komunikacja 8-bitowa (dowolny port mikrokontrolera)
; udostepniane sa procedury jak w deklaracji PUBLIC
; wymagane zdefiniowanie sposobu podlaczenia LCD
; (typowo w module glownym) - parametry jak w EXTERN
;=======================================================
PUBLIC init_LCD, zapisz_znak_LCD, LCD_XY, zapisz_string_LCD
EXTERN E_LCD, RW_LCD, RS_LCD, port_danych_LCD
;==================================================
; procedura pomocnicza, realizuje duze opoznienie
; wykorzystywana tylko podczas inicjalizacji LCD
; przy wywolaniu w DPTR musi byc wartosc opoznienia
; niszczy DPTR
;==================================================
delay: ; dla 12 MHz zegara
DJNZ DPL, delay ; przyblizony czas opoznienia to 2*DPTR [us]
DJNZ DPH, delay
RET
;==================================================
; procedura pomocnicza, realizuje male opoznienie
; przy wywolaniu w ACC musi byc wartosc opoznienia
; niszczy ACC
;==================================================
delay2:
DJNZ ACC, delay2 ; dla 12 MHz zegara
RET ; przyblizony czas opoznienia to 2*ACC [us]
;==================================================
; procedura zapisu pojedynczego znaku na LCD
; pod aktualne polozenie kursora
; znak do zapisu przy wywolaniu musi byc w ACC
; niszczy ACC
;==================================================
zapisz_znak_LCD: ; znak do zapisu w ACC
PUSH ACC ; znak do wyslania na stos
CALL check_busy ; czeka na mozliwosc dostepu do wyswietlacza
POP port_danych_LCD ; znak do wyslania ze stosu od razu na port LCD
zapis_danych:
CLR RW_LCD ; odpowiednie ustawienie linii sterujacych
SETB RS_LCD
SETB E_LCD ; i machniecie strobem E
CLR E_LCD
RET
;==================================================
; procedura zapisu na wyswietlaczu LCD stringu
; zdefiniowanego w pamieci programu mikrokontrolera
; pod aktualne polozenie kursora LCD
; znakiem konca stringu jest #
; przy wywolaniu w DPTR musi byc wskaznik (adres) stringu
; niszczy ACC, DPTR
;==================================================
zapisz_string_LCD:
CLR A ; zeby nastepna instrukcja miala zerowy offset
MOVC A, @A+DPTR ; pobranie znaku do wyswietlenia z pamieci programu
CJNE A, #'#', nastepny_znak ; jesli znak konca stringu (#),
RET ; to powrot z procedury
nastepny_znak: ; w przeciwnym razie zapis kolejnego znaku
PUSH DPH
PUSH DPL ; chowa na stos DPTR, bo jest niszczony przez
CALL zapisz_znak_LCD ; te wlasnie procedure zapisu znaku na LCD
POP DPL
POP DPH ; odzyskanie DPTR
INC DPTR ; zeby wskaznik DPTR pokazywal na kolejny znak
JMP zapisz_string_LCD
;===================================================
; procedura ustawienia kursora LCD w zadanym miejscu
; na ekranie
; przy wywolaniu w ACC zadane miejsce kursora
; zdefiniowane jak adres DD RAM wyswietlacza
; (czyli np. dla 2-wierszowego LCD pierwszy znak
; w dolnym wierszu ma adres 40H)
; niszczy ACC, DPTR
;===================================================
LCD_XY:
SETB ACC.7 ; modyfikacja bitu D7
; odpowiednio dla komendy Set DD RAM Address
PUSH ACC ; przyszla pozycja kursora na stos
CALL check_busy ; czekanie na mozliwosc dostepu do wyswietlacza
POP port_danych_LCD ; schowany na stos argument od razu na port
CALL zapis_komendy ; wyslanie komendy Set DD RAM Address
RET
;===================================================
; procedura sprawdzania zajetosci wyswietlacza LCD
; czeka az do momentu zwolnienia dostepu do LCD
; niszczy ACC
;===================================================
check_busy:
MOV port_danych_LCD, #0FFH ; port do odczytu
SETB RW_LCD ; ustawienie odczytu
CLR RS_LCD ; ustawienie RS = 0
sprawdz_ponownie:
SETB E_LCD ; strob E w stan aktywny
MOV A, port_danych_LCD ; odczyt szyny danych LCD
CLR E_LCD ; strob E w stan nieaktywny
JB ACC.7, sprawdz_ponownie ; jesli BF = 1, to czekaj (skok)
RET
;===================================================
; procedura pomocnicza
;===================================================
zapis_komendy:
CLR RW_LCD ; odpowiednie ustawienie linii sterujacych
CLR RS_LCD
SETB E_LCD ; i machniecie strobem
CLR E_LCD
RET
;====================================================
; procedura proramowej inicjalizacji wyswietlacza LCD
; niszczy DPTR, ACC
;====================================================
init_LCD:
CLR E_LCD
MOV DPTR, #0FFFFH ; ma byc opoznienie ok. 20 ms, jest ok. 100 ms
CALL delay
MOV port_danych_LCD, #30H
CALL zapis_komendy
MOV DPTR, #0FFFFH ; ma byc opoznienie ok. 4.2 ms, jest ok. 100 ms
CALL delay
CALL zapis_komendy
MOV DPTR, #0FFFFH ; ma byc opoznienie ok. 100 us, jest ok. 100 ms
CALL delay
CALL zapis_komendy
MOV DPTR, #0FFFFH ; ma byc opoznienie ok. 100 us, jest ok. 100 ms
CALL delay
MOV port_danych_LCD, #38H ; 8-bitowy interfejs, LCD 2-wierszowy
CALL zapis_komendy
CALL check_busy
MOV port_danych_LCD, #8H ; komenda Display Off
CALL zapis_komendy
CALL check_busy
MOV port_danych_LCD, #1H ; komenda Display Clear
CALL zapis_komendy
CALL check_busy
MOV port_danych_LCD, #6H ; autoinkrementacja polozenia kursora
CALL zapis_komendy
CALL check_busy
MOV port_danych_LCD, #0FH ; komenda Display On z
CALL zapis_komendy ; kursorem widocznym i migoczacym
RET
END ; koniec modulu
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -