⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcs51_list_10_3.asm

📁 source code from Starcki book
💻 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 + -