📄 casovac.asm
字号:
; ovladanie casovaca
; programator Jan Kadak
$NOMOD51
$include (89C2051.MCU)
;------------------------------------------------------------------
; Konfiguracia pinov, konstanty,definicia...
;------------------------------------------------------------------
; Konfiguracia pinov
;------------------------------------------------------------------
;
bodka_bit bit p3.1 ; blikajuca ledka
;
des_min_bit bit p1.0
jed_min_bit bit p1.1
des_sec_bit bit p1.2
jed_sec_bit bit p1.3
;
;------------------------------------------------------------------
; KONSTANTY
;------------------------------------------------------------------
;
; ------------------------------------------------------------------------------
; DEFINICIA BYTE/BITOV V INTERNEJ RAM
;------------------------------------------------------------------
;------------------------------------------------------------------
dseg ; datovy segment
;BITY
org 20h ; v ram od 32dec
key_flag bit 0 ; stlacena klavesa klavesa
;
;---------------------------------------------
;BYTE (bitovo adresovatelne)
org 24h ; v ram od 36dec
;
org 30h ; v ram od adr 48dec, adresovatelne po bajtoch
key_press: ds 1 ; cislo klavesy
minuty: ds 1
sekundy: ds 1
min_bcd: ds 1 ;ulozene minuty v BCD kode, horne styri bity su desiatky minut, spodne su jednotky
sec_bcd: ds 1 ; ulozene sekundy v BCD, plati to iste ako pri minutach
;
;------------------------------------------------------------------
cseg ; programovy segment
org 0h
sjmp start
org 00Bh
ajmp prerus_0
org 013h
reti
org 01Bh
ajmp prerus_1
;------------------------------------------------------------------
org 30h
start: mov sp,#90
mov th1,#high 45536 ; pri 24MHz asi 100Hz
mov tl1,#low 45536
mov th0,#high 25536 ; pri 24MHz asi 50Hz
mov tl0,#low 25536
mov tmod,#00010001b ; casovac 1 mod1; casovac 0 mod1
mov tcon,#01010000b ;
;mov ip,#00001100b ; int1 + c/c 1 vyssej urovne
mov 28,#4 ; pocitadlo > klavesnica
mov 27,#50 ; pomoc pre prerusenie od casovaca 0 pre dosiahnutie 1 sekundy
mov key_press,#0 ; ziadne tlacidlo
;
mov minuty,#0 ; zacneme od nuly
mov sekundy,#0
;
mov ie, #10001010b ; zapneme prerusenie
;
; ------------------------------------------------------------------------------
;------------------------------------------------------------------
;Hlavna slucka
;------------------------------------------------------------------
main: ;mov a, sekundy
acall porovnaj ; inkrement casu
sjmp main
;------------------------------------------------------------------
;Podprogamy pre ovladanie
;------------------------------------------------------------------
;-------------------------------------------------------------------
; prerata aktual cas na BCD
porovnaj: mov a, sekundy
cjne a, #60, porovnaj_end
mov sekundy,#0
inc minuty
mov a, minuty
cjne a, #60, porovnaj_end
mov sekundy, #0
mov minuty, #0
porovnaj_end: ret
;------------------------------------------------------------------
;-------------------------------------------------------------------
; prerata aktual cas na BCD
prerataj_cas_BCD: mov a, sekundy
mov b, #10
div ab
mov sec_bcd, b ; zvysok do ram [jednotky]
anl a, #00001111b ; desiatky Acc, vynulujeme horne stzri bity
swap a ; prehodime
orl sec_bcd, a
mov a, minuty
mov b, #10
div ab
mov min_bcd, b ; zvysok do ram [jednotky]
anl a, #00001111b ; desiatky Acc, vynulujeme horne stzri bity
swap a ; prehodime
orl min_bcd, a
ret
;------------------------------------------------------------------
; oneskorenie pre zobrazovanie na LED displeji
zobraz: mov r4,#50 ; oneskorenie 30*50=1500*1us=1,5ms - svieti segmentovka
zp1: mov r3,#30
zp2: djnz r3,zp2
djnz r4,zp1
ret
;------------------------------------------------------------------
;------------------------------------------------------------------
;obsluha prerusenia pre casovac 0 (pouziva sa pre inkrement sekund)
;------------------------------------------------------------------
prerus_0: ; inkrementacia premennych
;push acc
djnz 27, obnova_0
mov 27,#50
inc sekundy
obnova_0: mov th0,#high 32203 ; pri 24MHz asi 60Hz
mov tl0,#low 32203
;pop acc
reti
;------------------------------------------------------------------
;obsluha prerusenia pre casovac0 (obsluha pre klavesnicu)
;------------------------------------------------------------------
prerus_1: push acc
;
acall prerataj_cas_BCD
displej: ;multliplex rezim, zacneme sekundami
led_4: mov a, sec_bcd
swap a ; vymenime bity
orl a, #00001111b
mov p1, a
clr jed_sec_bit ; aktivuj segmentovku
acall zobraz
setb jed_sec_bit
led_3: mov a, sec_bcd
orl a, #00001111b
mov p1, a
clr des_sec_bit
acall zobraz
setb des_sec_bit
led_2: mov a, min_bcd
swap a ; prehodime bity
orl a, #00001111b
mov p1, a
clr bodka_bit ; ukaze aj bodku
clr jed_min_bit
acall zobraz
setb jed_min_bit
setb bodka_bit
led_1: mov a, min_bcd
orl a, #00001111b
mov p1, a
clr des_min_bit
acall zobraz
setb des_min_bit
obnova: mov th1,#high 45536 ; pri 24MHz asi 100Hz
mov tl1,#low 45536
pop acc
reti
;--------------------------------------------------------------------------------
;
;--------------------------------------------------------------------------------
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -