📄 mcs51_list_11_2.asm
字号:
; ========================================================================
;
; Tomasz Starecki: "Mikrokontrolery 8051 w praktyce"
; Wydawnictwo BTC - http://www.btc.pl
;
; ========================================================================
; obsluga wyswietlacza LED, klawiatury
; i programowa realizacjaa lacza szeregowego 1200 bod體
;
; modul glowny
; ========================================================================
; === === === === === === === === === === === === === === ===
;
; deklaracje okreslajace parametry istotne dla komunikacji
; pomiedzy modulem glownym i pozostalymi modulami
EXTERN nadawanie_RS
PUBLIC zacznij_nadawanie, TX_aktywny, TX_buf, TX_pin
EXTERN odbior_RS
PUBLIC RX_aktywny, RX_buf, RX_temp, RX_pin, nr_szpilki, RX_gotowy
PUBLIC l_szpilek, polowa_l_szpilek
EXTERN klawiatura
PUBLIC port_klawiatury, klawisz, licznik_klawiatury, puszczony, wcisniety, kb_tick
EXTERN wyswietlacz_LED, cyfra_na_7_seg
PUBLIC nr_LED, liczba_LEDow, anody, segmenty
; ============ stale =================
soft_baud_rate EQU 48 ; dla 12 MHz i 1200 bodow
wygaszony EQU 16 ; numer kodu wygaszenia w tabeli kodow 7-seg
anody EQU P3 ; port sterujacego anodami
liczba_LEDow EQU 4
segmenty EQU P2
port_klawiatury EQU P0
kb_tick EQU 60 ; do obslugi klawiatury
l_szpilek EQU 4 ; do obslugi programowego RS (odbiornik)
polowa_l_szpilek EQU 2 ; j.w.
; ============ RAM ===================
nr_LED EQU 30H ; adres bajtu z numerem aktywnego wyswietlacza
; 31 - 35H bufor wyswietlacza (+1 na podglad klawiatury)
; 36 - 39H zegar czasu rzeczywistego (tick, s, min, godz)
klawisz EQU 60H
licznik_klawiatury EQU 61H
TX_aktywny EQU 62H
TX_buf EQU 63H
licznik_TX EQU 64H
RX_aktywny EQU 66H
nr_szpilki EQU 67H
RX_temp EQU 68H
RX_buf EQU 69H
; =========== bity ===================
wcisniety EQU 07FH
puszczony EQU 07EH
zacznij_nadawanie EQU 07DH
TX_pin EQU P3.1
RX_pin EQU P3.0
RX_gotowy EQU 079H
pokazuje_8051 EQU 077H
;******************************************
; start i wektory przerwan
;******************************************
ORG 0000H ; restart systemu
JMP inicjalizacja
ORG 0BH ; przerwanie od licznika T0
T0_int: ; procedura obslugi przerwania od T0
CALL odbior_RS
DJNZ licznik_TX, koniec_TX
MOV licznik_TX, #4
CALL nadawanie_RS ; obsluga nadajnika wywolywana jest 4 x rzadziej
CALL wyswietlacz_LED ; wywolanie procedury obslugi wyswietlacza LED
CALL klawiatura ; wywolanie procedury obslugi klawiatury
CALL pokaz_numer_klawisza
koniec_TX:
RETI
;******************************************
; inicjalizacja i petla glowna programu
;******************************************
ORG 100H
inicjalizacja:
MOV 2FH, #0 ; zerowanie kompletu wskaznikow bitowych
MOV nr_LED, #1 ; inicjalizacja numeru aktywnej anody wyswietlacza
ORL TMOD, #2 ; praca T0 w trybie 2 (z automatycznym przeladowywaniem)
MOV TH0, #soft_baud_rate ; okresla czestotliwosc przerwan od T0
ORL IE, #82H ; wlaczenie przerwan od licznika T0
SETB TR0 ; uruchomienie licznika T0
; zaladowanie do bufora LED stringu "8051" (juz w kodzie 7-segmentowym)
MOV A, #8
CALL cyfra_na_7_seg
MOV 31H, A
MOV A, #0
CALL cyfra_na_7_seg
MOV 32H, A
MOV A, #5
CALL cyfra_na_7_seg
MOV 33H, A
MOV A, #1
CALL cyfra_na_7_seg
MOV 34H, A
SETB pokazuje_8051
MOV TX_aktywny, #0
MOV licznik_TX, #2
MOV RX_aktywny, #0
MOV nr_szpilki, #0
main_loop:
JBC RX_gotowy, zwrotne_nadawanie ; jesli odebrano cos z RS 232, nadaj zwrotnie
JMP main_loop ; jesli nie to nic nie rob
zwrotne_nadawanie:
JB wcisniety, nie_wygaszaj ; jesli zaden klawisz nie jest wcisniety
MOV A, #wygaszony ; wygas prawe dwa wskazniki
CALL cyfra_na_7_seg ; konwersja na kod 7-segmentowy
MOV nr_LED+4, A
MOV nr_LED+3, A ; (zeby juz dluzej nie wyswietlac "8051")
nie_wygaszaj:
MOV TX_buf, RX_buf ; odebrany przez RS bajt do bufora nadawania
INC TX_buf ; i jego inkrementacja
MOV A, RX_buf ; jednoczesnie odebrany bajt
MOV B, #16
CALL pokaz_rejestr ; pokazany (w HEX) na wyswietlaczu LED
SETB zacznij_nadawanie ; wyslanie zwrotne wartosci otrzymanego bajtu+1
JMP main_loop
;=================================================================
; procedura pomocnicza - wyswietla numer klawisza, gdy jakis jest wcisniety
; niszczy ACC
;=================================================================
pokaz_numer_klawisza:
JNB wcisniety, nie_pokazuj
JBC pokazuje_8051, wyczysc_LEDy
SJMP pokaz_numer
wyczysc_LEDy:
MOV A, #wygaszony
CALL cyfra_na_7_seg ; konwersja na kod 7-segmentowy
MOV nr_LED+1, A
MOV nr_LED+2, A
MOV nr_LED+3, A
pokaz_numer:
MOV A, klawisz
CALL cyfra_na_7_seg ; konwersja na kod 7-segmentowy
MOV nr_LED+4, A ; i umieszczenie go w buforze ostatniego
RET ; wskaznika
nie_pokazuj:
JB pokazuje_8051, koniec
MOV A, #wygaszony
CALL cyfra_na_7_seg ; konwersja na kod 7-segmentowy
MOV nr_LED+4, A ; i umieszczenie go w buforze ostatniego
koniec: ; wskaznika
RET
;=================================================================
; procedura pomocnicza - wyswietla stan rejestru
; niszczy ACC, B, CY
;=================================================================
pokaz_rejestr:
DIV AB
CALL cyfra_na_7_seg
MOV nr_LED+1, A
MOV A, B
CALL cyfra_na_7_seg
MOV nr_LED+2, A
RET
END ; koniec modulu gl體nego
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -