?? 電子鬧鐘.asm
字號(hào):
;**********************電子鬧鐘*******************
;本電子鬧鐘最多可設(shè)定10個(gè)鬧鈴時(shí)間,還具有秒表功能.
;編程環(huán)境:WAVE6000
;MCU: AT89S51
;*************************************************
STATEH EQU 2AH ;狀態(tài)碼高8位
STATEL EQU 2BH ;狀態(tài)碼低8位
B_ON BIT STATEH.5;蜂鳴器軟開關(guān)
FLAG EQU 2CH ;輔助標(biāo)志字節(jié)
DISP_P EQU 30H ;顯示掃描指針
KEYC EQU 2DH ;鍵碼
KEYT EQU 33H ;鍵齡
KEYOK BIT FLAG.0 ;按鍵已響應(yīng)標(biāo)志位
DHEAD EQU 3AH ;顯存首地址(3AH-3FH為顯存)
HOUR EQU 40H ;時(shí)
MINUTE EQU 41H ;分
SEC EQU 42H ;秒
SECD EQU 43H ;0.01秒
SECD2 EQU 44H ;2ms
MMIN EQU 45H ;秒表分
MSEC EQU 46H ;秒表秒
MSECD EQU 47H ;秒表0.01秒
MSTA BIT STATEH.3;秒表啟動(dòng)標(biāo)志位
ALARM EQU 48H ;鬧鈴時(shí)間表首地址(48H-5BH為鬧鈴時(shí)間表)
M_1S BIT FLAG.1 ;秒時(shí)鐘
BUZZER BIT P1.5 ;蜂鳴器控制端
;注:
;STATEH的高2位=00,01,10時(shí)分別表示當(dāng)前顯示的數(shù)據(jù)為時(shí)鐘,秒表,鬧鐘.
;STATEH.5為蜂鳴器響標(biāo)志位.STATEH.4為修改標(biāo)志位.STATEH.3為秒表
;啟動(dòng)標(biāo)志位.在修改狀態(tài)時(shí),STATEH的低3位=0,1,2分別表示修改時(shí),分,秒.
;在顯示鬧鐘表狀態(tài)時(shí)STATEL表示當(dāng)前顯示的鬧鈴時(shí)間在鬧鐘表中的序號(hào).
;在鬧鈴時(shí)間表中,每一個(gè)時(shí)間用2個(gè)字節(jié)表示,地址小的字節(jié)的最高為表示
;該時(shí)間是否已打開,低7為表示時(shí),還有一個(gè)字節(jié)表示分.
;--------------------------------------------------
ORG 0000H
AJMP START
ORG 000BH
AJMP TIME
ORG 0030H
;--------------------初始化------------------
START: MOV SP,#60H
MOV R0,#30H
MOV @R0,#0
INC R0
CJNE R0,#61H,$-3
MOV TMOD,#01H
MOV TL0,#30H ;2ms中斷(12M晶振)
MOV TH0,#0E8H
MOV HOUR,#12H
MOV MINUTE,#00H
MOV SEC,#00H
MOV STATEH,#0
MOV STATEL,#0
MOV DISP_P,#0
SETB TR0
SETB ET0
SETB EA
ACALL DISP
;-----------------------------------------
MAIN: SJMP MAIN ;等待中斷
;--------------T0 中斷服務(wù)子程序--------------
TIME: ORL TL0,#30H ;用ORL可提高計(jì)時(shí)精度
MOV TH0,#0F8H
INC SECD2
NOP
MOV A,SECD2
CJNE A,#5,TIME1
MOV SECD2,#0 ;10ms到
;--------------------------------------------
;運(yùn)行時(shí)鐘
CLR F0 ;時(shí)間改變標(biāo)志
CLR F1 ;秒為0標(biāo)志位
MOV A,SECD ;加0.01秒
ADD A,#1
DA A
MOV SECD,A
CJNE A,#50H,$+3
MOV M_1S,C ;產(chǎn)生秒方波
JNZ TIME0
MOV A,SEC ;秒加1
ADD A,#1
DA A
MOV SEC,A
SETB F0 ;標(biāo)志時(shí)間改變
CJNE A,#60H,TIME0
MOV SEC,#0
SETB F1 ;標(biāo)志秒為0
MOV A,MINUTE ;分加1
ADD A,#1
DA A
MOV MINUTE,A
CJNE A,#60H,TIME0
MOV MINUTE,#0
MOV A,HOUR ;時(shí)加1
ADD A,#1
DA A
MOV HOUR,A
CJNE A,#24H,TIME0
MOV HOUR,#0
TIME0: JNB F0,TMB ;時(shí)間未改變,轉(zhuǎn)
JNB F1,$+5
ACALL BJIAO ;秒為0,比較
MOV A,STATEH
ANL A,#0C0H
JNZ TMB ;不是顯示時(shí)間,轉(zhuǎn)
ACALL DISP ;刷新顯示
;運(yùn)行秒表
TMB: JNB MSTA,FMQI ;秒表未開,轉(zhuǎn)
CLR F0
MOV A,MSECD
ADD A,#1 ;加0.01秒
DA A
SETB F0
MOV MSECD,A
JNZ TIME1
MOV A,MSEC ;加1秒
ADD A,#1
DA A
MOV MSEC,A
CJNE A,#60H,TIME1
MOV MSEC,#0
MOV A,MMIN
ADD A,#1
DA A
MOV MMIN,A
TIME1: JNB F0,FMQI
MOV A,STATEH
ANL A,#0C0H
CJNE A,#40H,FMQI
ACALL DISP
;----------------------------------------
;蜂鳴器控制
FMQI: MOV C,B_ON
ANL C,M_1S
CPL C
MOV BUZZER,C
;--------------------
ACALL SCAN
RETI
;--------------------動(dòng)態(tài)掃描---------------------
SCAN: MOV P2,#0FFH ;關(guān)顯示器
INC DISP_P ;指向下一位
MOV A,DISP_P
CJNE A,#6,SCAN0
MOV DISP_P,#0FFH
AJMP SCNKEY ;每掃完一遍顯示器就掃描一次按鍵
SCAN0: MOV A,DISP_P
ADD A,#DHEAD ;加上顯存首地址,得到實(shí)際地址
MOV R0,A
MOV A,@R0
ADD A,#2
MOVC A,@A+PC ;查段碼
SJMP SCAN1
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;0-9
DB 0BFH,0FFH ;-,"滅"
SCAN1: MOV P0,A
MOV A,DISP_P
ADD A,#2
MOVC A,@A+PC ;查位碼
SJMP SCAN2
DB 0DFH,0EFH,0F7H,0FBH,0FDH,0FEH ;位碼
;閃亮控制
SCAN2: JNB STATEH.4,SCAN3 ;非修改狀態(tài),不用控制
JB M_1S,SCAN3 ;全亮,轉(zhuǎn)
JNB KEYOK,SCAN3
MOV R7,A ;保存位碼
MOV A,STATEH
ANL A,#07H
ADD A,#3
MOVC A,@A+PC
ORL A,R7
SJMP SCAN3
DB 30H,0CH,03H
;-----------
SCAN3: MOV P2,A
RET
;-----------------掃描鍵盤-------------------
SCNKEY: MOV A,P1
CPL A
ANL A,#5FH
JZ NOKEY ;無按鍵,轉(zhuǎn)
MOV KEYC,A
DEC KEYT ;鍵齡減1
MOV A,KEYT
JNZ SKEND
MOV KEYT,#70 ;連擊延時(shí)的時(shí)間
JBC KEYOK,SKEY1 ;未響應(yīng)則標(biāo)志已響應(yīng),并轉(zhuǎn)移
MOV KEYT,#5 ;連擊的速度
JB KEYC.0,SKEY1
JB KEYC.1,SKEY1
SJMP SKEND ;不允許連擊,轉(zhuǎn)
SKEY1: SJMP KEYJX ;解釋按鍵
NOKEY: SETB KEYOK ;清響應(yīng)標(biāo)志位
MOV KEYT,#2 ;消抖時(shí)間
MOV KEYC,#00H
SKEND: RET
;----------------------解釋按鍵------------------
KEYJX: JNB B_ON,KEYJX1
CLR B_ON ;若蜂鳴器開
RET
KEYJX1: MOV A,STATEH ;判斷當(dāng)前狀態(tài)
RL A
RL A
ANL A,#03H
CJNE A,#1,$+5
AJMP MBIAO ;顯示秒表狀態(tài)
CJNE A,#2,SZHONG
AJMP NZHONG ;顯示鬧鐘表狀態(tài)
;---------------顯示時(shí)鐘狀態(tài)-----------------
SZHONG: JNB STATEH.4,SZ
AJMP SZ_XIU ;修改時(shí)鐘狀態(tài)
;-------正常運(yùn)行-----
SZ: JNB KEYC.2,$+5
AJMP SZK2
JNB KEYC.6,$+5
AJMP SZK5
RET
;"修改/確定"鍵
SZK2: SETB STATEH.4 ;進(jìn)入修改狀態(tài)
ANL STATEH,#0F8H ;修改"時(shí)"
RET
;"切換"鍵
SZK5: ACALL QHUAN
ACALL DISP ;刷新顯示
RET
;----切換顯示狀態(tài)子程序-----
QHUAN: MOV A,STATEH
ANL A,#0C0H
ADD A,#40H
CJNE A,#0C0H,$+4
CLR A
ANL STATEH,#3FH
ORL A,STATEH
MOV STATEH,A
RET
;--------修改時(shí)鐘-------
SZ_XIU: JNB KEYC.0,$+5
AJMP SXK0
JNB KEYC.1,$+5
AJMP SXK1
JNB KEYC.2,$+5
AJMP SXK2 ;修改/確定
RET
;"加"鍵
SXK0: CLR C ;設(shè)立加1標(biāo)志
ACALL S_ADD ;修改
ACALL DISP
RET
;"減"鍵
SXK1: SETB C ;設(shè)立減1標(biāo)志
ACALL S_ADD ;修改
ACALL DISP
RET
;"修改/確定"鍵
SXK2: MOV B,#2 ;修改完"秒"后,退出修改狀態(tài)
ACALL W_G
RET
;-----------改變修改位置子程序-----------
;修改完第(B)位后,退出修改狀態(tài).
W_G: MOV A,STATEH
ANL A,#07H
CJNE A,B,W_G1
CLR STATEH.4 ;退出修改狀態(tài)
RET
W_G1: INC STATEH ;修改下一位
RET
;---------------顯示秒表狀態(tài)----------------
MBIAO: JB MSTA,MBRUN ;運(yùn)行狀態(tài)
AJMP MBSTOR ;停止?fàn)顟B(tài)
;------運(yùn)行狀態(tài)------
MBRUN: JNB KEYC.3,$+5
AJMP MBRUN1
JNB KEYC.6,$+5
ACALL QHUAN ;切換顯示狀態(tài)
ACALL DISP
RET
;"開/關(guān)"鍵
MBRUN1: CLR MSTA ;停秒表
RET
;------停止?fàn)顟B(tài)------
MBSTOR: JNB KEYC.3,$+5
AJMP MSTK3
JNB KEYC.4,$+5
AJMP MSTK4
JNB KEYC.6,$+5
AJMP MSTK5
RET
;"開/關(guān)"鍵
MSTK3: SETB MSTA ;開秒表
RET
;"清0"鍵
MSTK4: MOV MMIN,#0
MOV MSEC,#0
MOV MSECD,#0
ACALL DISP
RET
;"切換"鍵
MSTK5: ACALL QHUAN
ACALL DISP
RET
;-----------------顯示鬧鐘表狀態(tài)--------------
NZHONG: JNB STATEH.4,NZ
AJMP NZ_XIU
;---------查看鬧鐘表狀態(tài)--------
NZ: JNB KEYC.0,$+5
AJMP NZK0
JNB KEYC.1,$+5
AJMP NZK1
JNB KEYC.2,$+5
AJMP NZK2
JNB KEYC.3,$+5
AJMP NZK3
JNB KEYC.6,$+5
AJMP NZK5
RET
;"加"鍵
NZK0: MOV A,STATEL ;查看上一個(gè)時(shí)間
ADD A,#1
DA A
ANL A,#0FH ;只有10個(gè)時(shí)間,從0-9循環(huán)翻看
MOV STATEL,A
ACALL DISP
RET
;"減"鍵
NZK1: MOV A,STATEL ;查看下一個(gè)時(shí)間
ADD A,#99H
DA A
ANL A,#0FH
MOV STATEL,A
ACALL DISP
RET
;"修改/確定"鍵
NZK2: SETB STATEH.4 ;進(jìn)入修改狀態(tài)
ANL STATEH,#0F8H ;修改"時(shí)"
RET
;"開/關(guān)"鍵
NZK3: MOV A,STATEL
RL A
ADD A,#ALARM
MOV R0,A
MOV A,@R0
CPL ACC.7 ;開/關(guān)當(dāng)前顯示的那個(gè)鬧鈴時(shí)間
MOV @R0,A
ACALL DISP
RET
;"切換"鍵
NZK5: ACALL QHUAN
ACALL DISP
RET
;-------修改鬧鐘表狀態(tài)------
NZ_XIU: JNB KEYC.0,$+5
ACALL NXK0
JNB KEYC.1,$+5
ACALL NXK1
JNB KEYC.2,$+5
ACALL NXK2
RET
;"加"鍵
NXK0: CLR C ;設(shè)立加1標(biāo)志
ACALL S_ADD ;修改
ACALL DISP
RET
;"減"鍵
NXK1: SETB C ;設(shè)立減1標(biāo)志
ACALL S_ADD ;修改
ACALL DISP
RET
;"修改/確定"鍵
NXK2: MOV B,#1 ;修改完"分"后,退出修改狀態(tài)
ACALL W_G ;改變修改位置
RET
;_______________________按鍵解釋完畢_______________________
;----------------顯示模塊---------------
DISP: MOV A,STATEH
RL A
RL A
ANL A,#03H
CJNE A,#0,$+5
AJMP DIS0
CJNE A,#1,$+5
AJMP DIS1
CJNE A,#2,$+5
AJMP DIS2
RET
;顯示時(shí)鐘狀態(tài)
DIS0: MOV R0,#HOUR
MOV R2,#3
SJMP DIS
;顯示秒表狀態(tài)
DIS1: MOV R0,#MMIN
MOV R2,#3
SJMP DIS
;顯示鬧鐘表狀態(tài)
DIS2: MOV A,STATEL
RL A
ADD A,#ALARM
MOV R0,A
MOV R1,#DHEAD+4
MOV @R1,#0AH ;插入鬧鐘開標(biāo)志
MOV A,@R0
JB ACC.7,DIS2_1
MOV @R1,#0BH ;插入鬧鐘關(guān)標(biāo)志
DIS2_1: INC R1
MOV A,STATEL
MOV @R1,A ;插入序號(hào)
MOV R2,#2
;-----------------
DIS: MOV R1,#DHEAD
DISL: MOV A,@R0
CLR ACC.7
SWAP A
ANL A,#0FH
MOV @R1,A
INC R1
MOV A,@R0
ANL A,#0FH
MOV @R1,A
INC R0
INC R1
DJNZ R2,DISL
RET
;-----------------比較模塊---------------
BJIAO: MOV A,HOUR
SETB ACC.7
MOV R6,A
MOV R7,MINUTE
ACALL FIND ;查找
MOV B_ON,C ;若找到則開鬧鈴
RET
;查找
FIND: MOV R2,#10
MOV R0,#ALARM
FIND0: MOV A,@R0
INC R0
XRL A,R6
JNZ FIND1
MOV A,@R0
XRL A,R7
JNZ FIND1
SETB C ;設(shè)立找到標(biāo)志
RET
FIND1: INC R0
DJNZ R2,FIND0
CLR C ;標(biāo)志未找到
RET
;---------------修改閃亮位子程序---------------
;入口條件:加1 C=0,減1 C=1.
S_ADD: MOV R7,#01H
JNC S_AD
MOV R7,#99H ;-1的BCD碼補(bǔ)碼
;求閃亮位地址
S_AD: MOV A,STATEH
RL A
RL A
ANL A,#3
JNZ S_ADD0
MOV R0,#HOUR ;修改時(shí)鐘
SJMP S_ADD1
S_ADD0: CJNE A,#2,S_ADD5
MOV A,STATEL ;修改鬧鐘表
RL A
ADD A,#ALARM
MOV R0,A
S_ADD1: MOV A,STATEH
ANL A,#07H
ADD A,R0
MOV R0,A
;求進(jìn)制值
S_ADD2: MOV A,STATEH
ANL A,#07H
ADD A,#2
MOVC A,@A+PC
SJMP S_ADD3
DB 24H,60H,60H
S_ADD3: MOV B,A ;保存進(jìn)制值
;修改閃亮位
MOV A,@R0
CLR ACC.7
ADD A,R7
DA A
MOV @R0,A
CJNE A,B,S_ADD4
MOV @R0,#0 ;上溢,清0?
RET
S_ADD4: CJNE A,#99H,S_ADD5
ADD A,B ;下溢,付與最大值
DA A
MOV @R0,A
S_ADD5: RET
;**************************************************
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -