?? clock.asm
字號(hào):
SCL EQU P1.2
SDA EQU P1.3
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIME
ORG 0300H
MAIN:
MOV 20H,#00H ;25ms定時(shí)計(jì)數(shù)器
MOV 21H,#50H ;秒
MOV 22H,#30H ;分
MOV 23H,#12H ;時(shí)
MOV 24H,#08H ;日
MOV 25H,#06H ;月
MOV 26H,#07H ;
MOV 27H,#20H ;年
MOV 30H,#00H ;當(dāng)30H里的值為00H時(shí),數(shù)碼管顯示時(shí)間;
;當(dāng)30H里的值為0FFH時(shí),數(shù)碼管顯示日期;
;默認(rèn)顯示時(shí)間
MOV 31H,#00H ;但31H里的值為00H時(shí),鬧鐘關(guān)閉
;但31H里的值為0FFH時(shí),鬧鐘打開(kāi)
;默認(rèn)為關(guān)閉,通過(guò)按鍵P3.7打開(kāi)
MOV 32H,#00H ;若32H為0FFH,則啟動(dòng)鬧鐘計(jì)數(shù)器,使鬧鐘響5秒
MOV 33H,#00H ;鬧鐘計(jì)數(shù)器
MOV 34H,#00H ;鬧鐘調(diào)整:若為0FFH則進(jìn)入調(diào)整,使數(shù)碼管顯示鬧鐘時(shí)刻
MOV 40H,#00H ;鬧鐘,分
MOV 41H,#00H ;鬧鐘,時(shí)
MOV A,#00H ;24c02的讀地址,讀到數(shù)據(jù)為分
LCALL RD24
MOV 40H,A
NOP
MOV A,#01H ;讀地址,讀到數(shù)據(jù)為時(shí)
LCALL RD24
MOV 41H,A
MOV IP,#02H ;設(shè)置中斷優(yōu)先級(jí)
MOV IE,#82H ;設(shè)置中斷允許
MOV TMOD,#01H ;設(shè)置定時(shí)器T0的工作方式,16位計(jì)數(shù)器
MOV TL0,#00H ;定時(shí)器的間隔為25ms,初值為A600H,晶振頻率為11.0592MHz
MOV TH0,#0A6H
SETB TR0 ;啟動(dòng)定時(shí)器T0
MOV SP,#50H ;重新設(shè)置堆棧指針
CLR P1.0
NEXT:
MOV A,31H ;判斷是否允許鬧鐘
CJNE A,#0FFH,NOSPEAKER
LCALL NAOZHONG
MOV A,32H ;判斷是否到了鬧鐘時(shí)刻
CJNE A,#0FFH,NOSPEAKER
LCALL SPEAKER
NOSPEAKER:
MOV A,31H ;鬧鐘開(kāi),LED燈點(diǎn)亮
CJNE A,#0FFH,N_LED
CLR P1.1
AJMP LED_END
N_LED:
SETB P1.1
LED_END:
;檢測(cè)是否有按鍵按下
LCALL KEY
;MOV A,R6
JNZ ANSKEY ;P3口有按鍵按下
MOV A,B
JZ DISP ;P1口沒(méi)有按鍵按下
MOV A,#00H
ANSKEY:
LCALL ANKEY
DISP:
MOV A,34H
JNZ G2
MOV A,30H
JNZ G0 ;顯示年、月、日
LCALL DISP2 ;調(diào)用時(shí)、分、秒顯示子程序
SJMP G1
G0:
LCALL DISP1 ;調(diào)用年、月、日顯示子程序
SJMP G1
G2:
LCALL DISP3 ;顯示鬧鐘時(shí)刻
G1:
SJMP NEXT ;循環(huán)顯示
;主程序結(jié)束
;定時(shí)器處理子程序
TIME:
PUSH ACC
PUSH PSW
MOV TL0,#00H ;重置定時(shí)器初值
MOV TH0,#0A6H
INC 20H
MOV A,20H
CJNE A,#40,RETITIME ;如果25ms計(jì)數(shù)器的值為40時(shí),即1秒到
MOV 20H,#00H
;--------------------------------------------
;鬧鐘計(jì)數(shù)器處理模塊
MOV A,32H
CJNE A,#0FFH,N_NAOZHONG
MOV A,33H
INC A
MOV 33H,A
CJNE A,#05H,N_NAOZHONG
MOV 31H,#00H
MOV 32H,#00H
MOV 33H,#00H
N_NAOZHONG:
;--------------------------------------------
MOV A,21H ;秒處理
ADD A,#01H
DA A
MOV 21H,A
CJNE A,#60H,RETITIME ;1分到
MOV 21H,#00H
MOV A,22H ;分處理
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,RETITIME ;1時(shí)到
MOV 22H,#00H
MOV A,23H ;時(shí)處理
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,RETITIME ;1天到
MOV 23H,#00H
MOV A,24H ;天處理
ADD A,#01H
DA A
MOV 24H,A
ACALL MONTH
CJNE A,24H,RETITIME ;1月到
MOV 24H,#01H
MOV A,25H ;月處理
ADD A,#01H
DA A
MOV 25H,A
CJNE A,#13H,RETITIME ;1年到
MOV 25H,#01H
MOV A,26H ;年處理
CJNE A,#99H,NO_OH_YEAR ;
MOV 26H,#00H ;100年到
AJMP OH_YEAR
NO_OH_YEAR:
ADD A,#01H
DA A
MOV 26H,A
AJMP RETITIME
OH_YEAR:
MOV A,27H
ADD A,#01H
DA A
MOV 27H,A
RETITIME:
POP PSW
POP ACC
RETI ;時(shí)間處理子程序結(jié)束
;月份處理子程序,返回值為當(dāng)前月份數(shù),存在A中
MONTH:
MOV A,25H
XRL A,#01H
JZ LAB1 ;一月
MOV A,25H
XRL A,#02H
JZ LAB2
MOV A,25H
XRL A,#03H
JZ LAB1
MOV A,25H
XRL A,#04H
JZ LAB3
MOV A,25H
XRL A,#05H
JZ LAB1
MOV A,25H
XRL A,#06H
JZ LAB3
MOV A,25H
XRL A,#07H
JZ LAB1
MOV A,25H
XRL A,#08H
JZ LAB1
MOV A,25H
XRL A,#09H
JZ LAB3
MOV A,25H
XRL A,#10H
JZ LAB1
MOV A,25H
XRL A,#11H
JZ LAB3
MOV A,25H
XRL A,#12H
LAB1:
MOV A,#32H
AJMP RETMONTH
LAB2:
MOV A,#29H
AJMP RETMONTH
LAB3:
MOV A,#31H
RETMONTH:
RET ;月份處理子程序結(jié)束
;年、月、日顯示子程序
DISP1:
MOV A,24H ;處理日數(shù)
ANL A,#0FH
MOV 2FH,A ;2FH里為日的低4位譯碼
MOV A,24H
ANL A,#0F0H
SWAP A
MOV 2EH,A ;2EH里為日的高4位譯碼
MOV A,25H ;處理月數(shù)
ANL A,#0FH
MOV 2DH,A
MOV A,25H
ANL A,#0F0H
SWAP A
MOV 2CH,A
MOV A,26H ;處理年數(shù)
ANL A,#0FH
MOV 2BH,A
MOV A,26H
ANL A,#0F0H
SWAP A
MOV 2AH,A
MOV A,27H
ANL A,#0FH
MOV 29H,A
MOV A,27H
ANL A,#0F0H
SWAP A
MOV 28H,A
;對(duì)顯示數(shù)據(jù)譯碼
MOV R0,#2FH ;顯示數(shù)據(jù)的地址為:2FH--28H
MOV R3,#08H ;顯示在8個(gè)數(shù)碼管上
MOV DPTR,#TABLE
MOV A,#80H ;顯示數(shù)碼管地址
LOOP1:
MOV B,A
MOV P2,A ;送出數(shù)碼管地址
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
MOV R2,#40H ;延時(shí)
DJNZ R2,$ ;在當(dāng)前位置循環(huán)
DEC R0 ;指向下一個(gè)顯示數(shù)據(jù)地址
MOV A,B
RR A ;改變數(shù)碼管顯示地址
DJNZ R3,LOOP1
RET ;年、月、日顯示子程序結(jié)束
;時(shí)、分、秒顯示子程序
DISP2:
MOV A,21H ;秒處理
ANL A,#0FH
MOV 2FH,A ;低4位存在2FH里
MOV A,21H
ANL A,#0F0H
SWAP A
MOV 2EH,A
MOV 2DH,#0AH ;顯示一個(gè)“-”
MOV A,22H ;分處理
ANL A,#0FH
MOV 2CH,A
MOV A,22H
ANL A,#0F0H
SWAP A
MOV 2BH,A
MOV 2AH,#0AH ;顯示一個(gè)“-”
MOV A,23H ;時(shí)處理
ANL A,#0FH
MOV 29H,A
MOV A,23H
ANL A,#0F0H
SWAP A
MOV 28H,A
;對(duì)顯示數(shù)據(jù)譯碼
MOV R0,#2FH
MOV R3,#08H
MOV DPTR,#TABLE
MOV A,#80H
LOOP2:
MOV B,A
MOV P2,A
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
MOV R2,#40H
DJNZ R2,$
DEC R0
MOV A,B
RR A
DJNZ R3,LOOP2
RET ;時(shí)、分、秒顯示子程序結(jié)束
;鬧鐘時(shí)刻顯示子程序
DISP3:
MOV 2FH,#0BH ;秒位置的數(shù)碼管滅
MOV 2EH,#0BH
MOV 2DH,#0BH
MOV A,40H ;分處理
ANL A,#0FH
MOV 2CH,A
MOV A,40H
ANL A,#0F0H
SWAP A
MOV 2BH,A
MOV 2AH,#0AH ;顯示一個(gè)“-”
MOV A,41H ;時(shí)處理
ANL A,#0FH
MOV 29H,A
MOV A,41H
ANL A,#0F0H
SWAP A
MOV 28H,A
;對(duì)顯示數(shù)據(jù)譯碼
MOV R0,#2FH
MOV R3,#08H
MOV DPTR,#TABLE
MOV A,#80H
LOOP3:
MOV B,A
MOV P2,A
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
MOV R2,#40H
DJNZ R2,$
DEC R0
MOV A,B
RR A
DJNZ R3,LOOP3
RET ;時(shí)、分、秒顯示子程序結(jié)束
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH,0FFH ;0,1,2,3,4,5,6,7,8,9,-, ;
;清除數(shù)碼管顯示子程序
CLEAR:
MOV R3,#08H
MOV A,#80H
LOOP4:
MOV B,A
MOV P2,A
MOV P0,#0FFH
MOV A,B
RR A
DJNZ R3,LOOP4
RET ;清除數(shù)碼管顯示子程序結(jié)束
;按鍵掃描子程序(思路:連續(xù)兩次讀入按鍵值,判斷是否為按鍵抖動(dòng),然后等待釋放按鍵)
KEY:
ACALL CLEAR ;按下按鍵時(shí),數(shù)碼管不顯示
MOV P3,#0FFH ;第一次讀入按鍵值
MOV A,P3
CPL A
JZ KEYTIAO ;P3口無(wú)按鍵按下
MOV P3,#0FFH ;第二次讀入按鍵值
MOV A,P3
CPL A
JZ KEYTIAO ;按鍵抖動(dòng),非期望
MOV R6,A ;保存鍵值
LOOPKEY:
MOV P3,#0FFH ;等待釋放按鍵
MOV A,P3
CPL A
JNZ LOOPKEY
MOV A,R6 ;按鍵值存在A中
MOV B,#00H
SJMP RETKEY
KEYTIAO:
;MOV P1,#0FFH ;第一次讀入按鍵值
MOV A,P1
CPL A
ANL A,#0C0H
MOV B,A
JZ RETKEY ;P1口無(wú)按鍵按下
;MOV P1,#0FFH ;第二次讀入按鍵值
MOV A,P1
CPL A
ANL A,#0C0H
MOV B,A
JZ RETKEY ;按鍵抖動(dòng),非期望
MOV R5,B ;保存鍵值
LOOPKEYTIAO:
;MOV P1,#0FFH ;等待釋放按鍵
MOV A,P1
CPL A
ANL A,#0C0H
MOV B,A
JNZ LOOPKEYTIAO
MOV B,R5 ;按鍵值存在B中
MOV A,#00H
RETKEY:
RET ;按鍵掃描子程序結(jié)束
;按鍵處理子程序(按鍵值從A中讀入)
ANKEY:
;MOV A,R6
JB ACC.0,K0
JB ACC.1,K1
JB ACC.2,K2
JB ACC.3,K3
JB ACC.4,K4
JB ACC.5,K5
JB ACC.6,K6
JB ACC.7,K7
MOV A,B
JB ACC.6,KT
JB ACC.7,KQ
AJMP RETANKEY
K0:
LCALL KEY0
AJMP RETANKEY
K1:
LCALL KEY1
AJMP RETANKEY
K2:
LCALL KEY2
AJMP RETANKEY
K3:
LCALL KEY3
AJMP RETANKEY
K4:
LCALL KEY4
AJMP RETANKEY
K5:
LCALL KEY5
AJMP RETANKEY
K6:
LCALL KEY6
AJMP RETANKEY
K7:
LCALL KEY7
AJMP RETANKEY
KT:
LCALL KEYTIAOZHENG
AJMP RETANKEY
KQ:
LCALL KEYQUEREN
RETANKEY:
RET ;按鍵處理子程序結(jié)束
;按鍵P3.0執(zhí)行的內(nèi)容:改變30H里的數(shù)值,使數(shù)碼管顯示年、月、日或者時(shí)、分、秒
KEY0:
MOV A,30H
CPL A
MOV 30H,A
RET ;按鍵P3.0子程序結(jié)束
;按鍵P3.1執(zhí)行的內(nèi)容:年或者時(shí)+1
KEY1:
MOV A,30H
CJNE A,#0FFH,TA_HOUR
;進(jìn)行年+1
MOV A,26H
CJNE A,#99H,TA_NO_OH_YEAR
MOV 26H,#00H
AJMP TA_OH_YEAR
TA_NO_OH_YEAR:
ADD A,#01H
DA A
MOV 26H,A
AJMP RETKEY1
TA_OH_YEAR:
MOV A,27H
ADD A,#01H
DA A
MOV 27H,A
AJMP RETKEY1
;進(jìn)行時(shí)+1
TA_HOUR:
MOV A,34H
JNZ TA_HOUR_NAOZH
;時(shí)鐘時(shí)+1
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,RETKEY1
MOV 23H,#00H
AJMP RETKEY1
;鬧鐘時(shí)+1
TA_HOUR_NAOZH:
MOV A,41H
ADD A,#01H
DA A
MOV 41H,A
CJNE A,#24H,RETKEY1
MOV 41H,#00H
RETKEY1:
RET ;按鍵P3.1子程序結(jié)束
;按鍵P3.2執(zhí)行的內(nèi)容::年或者時(shí)-1
KEY2:
MOV A,30H
CJNE A,#0FFH,TD_HOUR
;進(jìn)行年-1
MOV A,26H
CJNE A,#00H,TD_NO_OH_YEAR
MOV 26H,#99H
AJMP TD_OH_YEAR
TD_NO_OH_YEAR:
CLR C
LCALL BCDBIN
SUBB A,#01H
LCALL BINBCD
MOV 26H,A
AJMP RETKEY2
TD_OH_YEAR:
MOV A,27H
LCALL BCDBIN
CLR C
SUBB A,#01H
LCALL BINBCD
MOV 27H,A
AJMP RETKEY2
;進(jìn)行時(shí)-1
TD_HOUR:
MOV A,34H
JNZ TD_HOUR_NAOZH
;時(shí)鐘時(shí)-1
MOV A,23H
CJNE A,#00H,TD_NO_OD
MOV 23H,#23H
AJMP RETKEY2
TD_NO_OD:
LCALL BCDBIN
CLR C
SUBB A,#01H
LCALL BINBCD
MOV 23H,A
AJMP RETKEY2
;鬧鐘時(shí)-1
TD_HOUR_NAOZH:
MOV A,41H
CJNE A,#00H,TD_NO_OD_NAOZH
MOV 41H,#23H
AJMP RETKEY2
TD_NO_OD_NAOZH:
LCALL BCDBIN
CLR C
SUBB A,#01H
LCALL BINBCD
MOV 41H,A
RETKEY2:
RET ;按鍵P3.2子程序結(jié)束
;按鍵P3.3執(zhí)行的內(nèi)容:月或者分+1
KEY3:
MOV A,30H
CJNE A,#0FFH,TA_MIN
;進(jìn)行月+1
MOV A,25H
ADD A,#01H
DA A
MOV 25H,A
CJNE A,#13H,RETKEY3
MOV 25H,#01H
AJMP RETKEY3
;進(jìn)行分+1
TA_MIN:
MOV A,34H
JNZ TA_MIN_NAOZH
;時(shí)鐘分+1
MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,RETKEY3
MOV 22H,#00H
AJMP RETKEY3
TA_MIN_NAOZH:
;鬧鐘分+1
MOV A,40H
ADD A,#01H
DA A
MOV 40H,A
CJNE A,#60H,RETKEY3
MOV 40H,#00H
RETKEY3:
RET ;按鍵P3.3子程序結(jié)束
;按鍵P3.4執(zhí)行的內(nèi)容:月或者分-1
KEY4:
MOV A,30H
CJNE A,#0FFH,TD_MIN
;進(jìn)行月-1
MOV A,25H
CJNE A,#01H,TD_NO_OM
MOV 25H,#12H
AJMP RETKEY4
TD_NO_OM:
CLR C
LCALL BCDBIN
SUBB A,#01H
LCALL BINBCD
MOV 25H,A
AJMP RETKEY4
;進(jìn)行分-1
TD_MIN:
MOV A,34H
JNZ TD_MIN_NAOZH
;時(shí)鐘的分-1
MOV A,22H
CJNE A,#00H,TD_NO_OH
MOV 22H,#59H
AJMP RETKEY4
TD_NO_OH:
LCALL BCDBIN
CLR C
SUBB A,#01H
LCALL BINBCD
MOV 22H,A
AJMP RETKEY4
TD_MIN_NAOZH:
;鬧鐘的分-1
MOV A,40H
CJNE A,#00H,TD_NO_OH_NAOZH
MOV 40H,#59H
AJMP RETKEY4
TD_NO_OH_NAOZH:
LCALL BCDBIN
CLR C
SUBB A,#01H
LCALL BINBCD
MOV 40H,A
RETKEY4:
RET ;按鍵P3.4子程序結(jié)束
;按鍵P3.5執(zhí)行的內(nèi)容:日或者秒+1
KEY5:
MOV A,30H
CJNE A,#0FFH,TA_SEC
;進(jìn)行日+1
MOV A,24H
ADD A,#01H
DA A
MOV 24H,A
ACALL MONTH
CJNE A,24H,RETKEY5
MOV 24H,#01H
AJMP RETKEY5
;進(jìn)行秒+1
TA_SEC:
MOV A,21H
ADD A,#01H
DA A
MOV 21H,A
CJNE A,#60H,RETKEY3
MOV 21H,#00H
RETKEY5:
RET ;按鍵P3.5子程序結(jié)束
;按鍵P3.6執(zhí)行的內(nèi)容:日或者秒-1
KEY6:
MOV A,30H
CJNE A,#0FFH,TD_SEC
;進(jìn)行日-1
MOV A,24H
CJNE A,#01H,TD_NO_ODAY
LCALL MONTH
DEC A
MOV 24H,A
AJMP RETKEY6
TD_NO_ODAY:
CLR C
LCALL BCDBIN
SUBB A,#01H
LCALL BINBCD
MOV 24H,A
AJMP RETKEY4
;進(jìn)行秒-1
TD_SEC:
MOV A,21H
CJNE A,#00H,TD_NO_OMS
MOV 21H,#59H
AJMP RETKEY6
TD_NO_OMS:
LCALL BCDBIN
CLR C
SUBB A,#01H
LCALL BINBCD
MOV 21H,A
RETKEY6:
RET ;按鍵P3.6子程序結(jié)束
;按鍵P3.7子程序
KEY7:
MOV A,31H
CPL A
MOV 31H,A
MOV 32H,#00H
MOV 33H,#00H
RET ;按鍵P3.7子程序結(jié)束
;按鍵P1.6,進(jìn)入鬧鐘調(diào)整
KEYTIAOZHENG:
MOV 34H,#0FFH
RET
;按鍵P1.7,確認(rèn)鬧鐘調(diào)整
KEYQUEREN:
MOV 34H,#00H
;---------------------------
;把鬧鐘設(shè)置寫(xiě)入24c02
;寫(xiě)分
MOV A,40H
MOV B,A
MOV A,#00H
LCALL WT24
;寫(xiě)時(shí)
MOV B,41H
MOV A,#01H
LCALL WT24
RET
;BCD碼轉(zhuǎn)換成BIN碼
BCDBIN:
PUSH B
PUSH PSW
PUSH ACC
ANL A,#0F0H
SWAP A
MOV B,#0AH
MUL AB
MOV B,A
POP ACC
ANL A,#0FH
ADD A,B
POP PSW
POP B
RET
;BIN碼轉(zhuǎn)換成BCD碼
BINBCD:
PUSH PSW
PUSH B
MOV B,#10
DIV AB
SWAP A
ADD A,B
POP B
POP PSW
RET
;蜂鳴器子程序
SPEAKER:
MOV R0,#0FFH
DJNZ R0,$
SETB P1.0
MOV R0,#0FFH
DJNZ R0,$
CLR P1.0
RET ;蜂鳴器子程序結(jié)束
;鬧鐘子程序
NAOZHONG:
MOV A,40H
CJNE A,22H,RETNAOZHONG
MOV A,41H
CJNE A,23H,RETNAOZHONG
MOV 32H,#0FFH
RETNAOZHONG:
RET
;-------------------------------------------------------------
;24c02讀寫(xiě)相關(guān)子程序
RD24:
PUSH ACC ;讀24C02子程序。
SETB SDA
CLR SCL
CALL START24
MOV A,#0A0H
CALL SHIFT8
CALL ACK
POP ACC
CALL SHIFT8
CALL ACK
CALL START24
MOV A,#0A1H
CALL SHIFT8
CALL ACK
SETB SDA
MOV R7,#8
CLR A
SETB SDA
RD000:
RL A
SETB SCL
MOV C,SDA
MOV ACC.0,C
CLR SCL
DJNZ R7,RD000
RET
;-------------------------------
;寫(xiě)入24C02程序:
WT24:
PUSH ACC
SETB SDA
CLR SCL
CALL START24
MOV A,#0A0H
CALL SHIFT8
CALL ACK
POP ACC
CALL SHIFT8
CALL ACK
MOV A,B
CALL SHIFT8
CALL ACK
CALL STOP
CALL DELAY2
MOV 46H,#0FFH
DELAY:
CALL DELAY1
DJNZ 46H,DELAY
RET
; -------------------------------
;開(kāi)始條件
START24:
CLR SDA
SETB SDA
SETB SCL
CLR SDA
CLR SCL
RET
;停止條件
STOP:
CLR SDA
SETB SCL
SETB SDA
RET
;應(yīng)答信號(hào)
ACK:
SETB SCL
CLR SCL
RET
;讀、寫(xiě)數(shù)據(jù)
SHIFT8:
MOV R7,#8
SH01:
RLC A
MOV SDA,C
SETB SCL
CLR SCL
DJNZ R7,SH01
RET
DELAY2:
NOP
NOP
NOP
NOP
RET
DELAY1:
MOV 45H,#01H
C_DELAY:
MOV 44H,#0FFH
DJNZ 44H,$
DJNZ 45H,C_DELAY
RET
END ;程序結(jié)束
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -