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

📄 mcs51_list_11_2.asm

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