"); //-->
ORG 0000H
AJMP MAIN ; 转到主程序
ORG 000BH
AJMP SERVE ; 转到中断程序
;*********************主程序*************************
MAIN: MOV TMOD ,#1
MOV 30H ,#00
MOV R6 ,#00
MOV R7 ,#00
m_sec EQU 20H ;毫秒单元
sec EQU 21H ;秒单元
min EQU 22H ;分单元
hour EQU 23H ;时单元
SUWI EQU 31H ;冬季夏季标志位,0为冬季
SK44 EQU 32H ;按键SK4标志位
SPEAK BIT P1.3 ;蜂鸣器
LED BIT P3.3 ;按键指示灯
LED1 BIT P3.4 ;冬季时间指示灯
LED2 BIT P3.5 ;夏季时间指示灯
SK1 BIT P1.4 ;数字钟开始键
SK2 BIT P1.5 ;数字钟调整时间部分切换键
SK3 BIT P1.6 ;数字钟调整时间加1键
SK4 BIT P1.7 ;冬季夏季时间表切换键
SETB ET0 ;允许T0中断
SETB EA ;允许CPU中断
CLR LED1
MOV TH0 ,#0ECH
MOV TL0 ,#78H ;赋计数器初值
MOV 33H ,#00
MOV 34H ,#25
MOV 35H ,#50
MOV m_sec ,#00 ;毫秒单元清零
MOV sec ,#00 ;秒单元清零
MOV min ,#00 ;分单元清零
MOV hour ,#00 ;时单元清零
MOV SUWI ,#00 ;冬季夏季标志位清零
MOV SK44 ,#00 ;按键SK44标志位清零
SETB TR0
LCALL RETURN ;调用显示程序
;****************** 打铃时间判断*******************
NET11: MOV A ,SUWI
CJNE A ,#00 ,NET20
NET13: MOV DPTR ,#TMTAB
NET12: MOV A ,33H
MOVC A ,@A+DPTR
CJNE A ,hour ,NET10
INC 33H
MOV A ,33H
MOVC A ,@A+DPTR
CJNE A ,min ,NET15
CLR SPEAK
CLR LED ;铃声响
LCALL DL1min ;延时1分钟
SETB SPEAK
SETB LED ;铃声停
INC 33H
DEC 34H
MOV A ,34H
CJNE A ,#00 ,NET16
MOV 33H ,#00
SJMP NET16
NET10: INC 33H
NET15: INC 33H
NET16: LJMP S1
NET20: MOV DPTR ,#TMTAB
MOV A ,35H
MOVC A ,@A+DPTR
CJNE A ,hour ,NET18
INC 35H
MOV A ,35H
MOVC A ,@A+DPTR
CJNE A ,min ,NET19
INC 35H
SING1: CLR SPEAK
CLR LED ;铃声响
LCALL DL1min ;延时1分钟
SETB SPEAK
SETB LED ;铃声停
DEC 34H
MOV A ,34H
CJNE A ,#00 ,NET17
MOV 35H ,#50
SJMP NET17
NET18: INC 35H
NET19: INC 35H
NET17: LJMP S1
;************************************************
;*****************数字钟按键程序*****************
;************************************************
;*****************开始键************************
S1: JB SK1 ,S2 ;数字钟开始键
LCALL DL10ms
JB SK1 ,S2
CLR SPEAK
CLR LED
JNB SK1 ,$
SETB SPEAK
SETB LED
SETB TR0
MOV 30H ,#00
MOV R7 ,#00
;****************调整时间部分切换键********************
S2: MOV A ,30H
CJNE A ,#00 ,NET6
JB SK2 ,S3 ;数字钟调整时间部分切换键
LCALL DL10ms
JB SK2 ,S3
CLR SPEAK
CLR LED
INC 30H
JNB SK2 ,$
SETB SPEAK
SETB LED
INC R7
CLR TR0
SJMP NET7
NET6: JB SK2 ,NET7
LCALL DL10ms
JB SK2 ,NET7
CLR SPEAK
CLR LED
INC 30H
JNB SK2 ,$
SETB SPEAK
SETB LED
INC R7
NET7: CJNE R7 ,#1 ,NET1
LCALL MSH ;分闪烁
SJMP S3
NET1: MOV R7 ,#0
LCALL HSH ;时闪烁
SJMP S3
NET9: LCALL RETURN
;******************调整时间加1键*****************
S3: JB SK3 ,S4 ;数字钟调整时间键
LCALL DL10ms
JB SK3 ,S4
CLR SPEAK
CLR LED
CJNE R7 ,#1 ,NET2
SETB SPEAK
SETB LED
LCALL DL200ms
INC min ;分单元加1
MOV A ,min
CJNE A ,#60 ,NET9 ;不等60时跳转显示,等60时将分单元清零
MOV min ,#00
LCALL RETURN
JB SK3 ,NET4
LJMP S3
NET2: SETB SPEAK
SETB LED
LCALL DL200ms
INC hour ;时单元加1
MOV A ,hour
CJNE A ,#24 ,NET9 ;不等24时跳转显示,等24时将时单元清零
MOV hour ,#00
LCALL RETURN
JNB SK3 ,NET4
LJMP S3
NET4: SJMP S4
;****************冬季夏季时间表切换键**********************
S4: MOV A ,SK44
CJNE A ,#00 ,NET3
;CLR LED1 ;冬季时间指示灯亮
JB SK4 ,NET25
LCALL DL10ms
JB SK4 ,NET25
SETB LED1 ;冬季时间指示灯灭
CLR LED2 ; 夏季时间指示灯亮
CLR SPEAK
CLR LED
INC SK44 ;按键SK4标志位加1
INC SUWI ;冬季夏季时间标志位加1
SJMP NET5
NET3: JB SK4 ,NET25
LCALL DL10ms
JB SK4 ,NET25
SETB LED2 ; 夏季时间指示灯灭
CLR LED1 ;冬季时间指示灯亮
CLR SPEAK
CLR LED
CLR SK44 ;按键SK4标志位清零
CLR SUWI ;冬季夏季时间标志位清零
NET5: JNB SK4 ,$
SETB SPEAK
SETB LED
NET25: LJMP NET11
;********************中断程序*********************
SERVE: PUSH PSW
PUSH ACC ;保护现场
MOV TH0 ,#0ECH
MOV TL0 ,#78H ;重新赋计数初值
INC m_sec ;毫秒单元加1
MOV A ,m_sec
CJNE A ,#100 ,NEXT1
MOV m_sec ,#00
INC sec ;秒单元加1
MOV A ,sec
CJNE A ,#60 ,NEXT1
MOV sec ,#00
INC min ;
MOV A ,min
CJNE A ,#60 ,NEXT1
MOV min ,#00
INC hour ;
MOV A ,hour
CJNE A ,#24 ,NEXT1
MOV hour ,#00
NEXT1: LCALL RETURN
POP ACC
POP PSW ;恢复现场
RETI ;中断返回
;********************数字钟显示程序******************
RETURN: MOV A ,sec ;将秒送A
MOV B ,#10
DIV AB
MOV 24H ,B ;秒的个位
MOV 25H ,A ;秒的十位
MOV A ,min ;将分送A
MOV B ,#10
DIV AB
MOV 26H ,B ;分的个位
MOV 27H ,A ;分的十位
MOV A ,hour ;将时送A
MOV B ,#10
DIV AB
MOV 28H ,B ;时的个位
MOV 29H ,A ;时的十位
LCP: MOV R1 ,#24H
MOV R4 ,#6
MOV DPTR ,#TAB
BK: MOV A ,@R1
MOVC A ,@A+DPTR
MOV SBUF ,A
JNB TI ,$
CLR TI
INC R1
DJNZ R4 ,BK
RET
;******************字型码*********************
TMTAB: DB 6,20,7,0,7,50,8,0,8,50,9,0,9,50,10,10,11,00
DB 12,00,14,10,14,30,15,20,15,30,16,20,16,40,17
DB 30,17,40,18,30,19,20,19,30,20,20,20,30,21,20;冬季时间表
TMTABS: DB 6,20,7,0,7,50,8,0,8,50,9,0,9,50,10,10,11,00
DB 12,00,14,40,15,00,15,50,16,00,16,50,17,10,18
DB 00,18,10,19,00,19,50,20,00,20,50,21,00,21,50;夏季时间表
TAB: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D1H,10H,90H;0-9
DB 05H,1CH,39H,16H,38H,68H,70H,0FEH,0EFH,0FFH;A B, C, D, E, ,F ,P, -, ,. ,COLSE
DB 01H,0C7H,22H,82H,0C4H,88H,08H,0C3H,00H,80H;带小数点的字形码0.,1.,-----9.
;*******************延时10ms子程序******************
DL10ms: MOV R2 ,#10H
TS1: MOV R3 ,#0FFH
TS2: DJNZ R3 ,TS2
DJNZ R2 ,TS1
RET
;*******************延时200ms子程序*******************
DL200ms:MOV R3 ,#20
DL3: MOV R4 ,#10H
DL2: MOV R5 ,#0FFH
DL1: DJNZ R5 ,DL1
DJNZ R4 ,DL2
DJNZ R3 ,DL3
RET
;*******************延时1分钟子程序******************
DL1min: MOV 70H ,#100
DL6: MOV 71H ,#10H
DL5: MOV 72H ,#0FFH
DL4: DJNZ 72H ,DL4
DJNZ 71H ,DL5
DJNZ 70H ,DL6
RET
;****************分显示闪烁子程序********************
MSH: LCALL RETURN
LCALL DL200ms
MOV A ,#0FFH
MOV B ,#0FFH
MOV 26H ,B
MOV 27H ,A
LCALL LCP
LCALL DL200ms
RET
;****************时显示闪烁子程序********************
HSH: LCALL RETURN
LCALL DL200ms
MOV A ,#0FFH
MOV B ,#0FFH
MOV 28H ,B
MOV 29H ,A
LCALL LCP
LCALL DL200ms
RET
END
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。