📄 万年历.asm
字号:
;;;;;;;;;;;;;;;;;;;;;AT89S51,F=6MHz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;影响第0组的R1,R2,R3,R4,R5,R6,R7;;;;;;;;;;;;;;;;
;;;20H,21H,30H,31H,32H,35H,36H,37H,38H,39H,3AH,3BH,3CH,3DH,3EH;;
ORG 00H ;程序从这里开始
SJMP MAIN ;主程序
ORG 0BH ;定时器0中断入口
LJMP GOTO
ORG 40H
;初始化
MAIN:MOV SP,#5FH ;设堆栈
MOV 30H,#12H ;存放小时,设初值
MOV 31H,#00H ;存放分钟,设初值
MOV 32H,#00H ;存放秒,设初值
MOV 35H,#06H ;第一个闹钟的小时位,设初值
MOV 36H,#30H ;第一个闹钟的分钟位,设初值
MOV 37H,#09H ;第二个闹钟的小时位,设初值
MOV 38H,#00H ;第二个闹钟的分钟位,设初值
MOV 39H,#06H ;存放年
MOV 3AH,#11H ;存放月
MOV 3BH,#05H ;存放日
MOV 3CH,#00H ;显示缓存,第1,2位
MOV 3DH,#00H ;显示缓存,第3,4位
MOV 3EH,#00H ;显示缓存,第5,6位
CLR 00H ;秒闪烁暂存 20H.0
SETB 01H ;闹钟1输出位 20H.1
SETB 02H ;闹钟2输出位 20H.2
CLR 03H ;按键2是否有效标致位 20H.3
CLR 04H ;按键3是否有效标致位 20H.4
CLR 05H ;按键2是否有效标致位 20H.5
CLR 06H ;闹钟开关标致 20H.6 "0"为开"1"为关
SETB 07H ;显示缓存,小数点1
SETB 08H ;显示缓存,小数点2
SETB 09H ;时钟加减标致位 "0"为小时,"1"为分钟
SETB 0AH ;闹钟1加减标致位"0"为小时,"1"为分钟
SETB 0BH ;闹钟2加减标致位"0"为小时,"1"为分钟
MOV R2,#2 ;设定时次数
MOV R3,#50
MOV R4,#25
MOV TMOD,#02H ;设定时器0工作方式为方式2
MOV TH0,#56 ;设初始值
MOV TL0,#56
SETB TR0 ;启动定时器和中断
SETB ET0
SETB EA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MMAIN:JNB P2.0,MMAIN ;时钟主程序
MMAIN2:LCALL XIAN ;显示
LCALL CS ;按键秒清零
LCALL DAT ;是否显示年月日
LCALL DSQ ;定时器
LCALL T1T2 ;闹钟开关
CLR P2.6 ;按键有效
JNB P2.0,MENU1
SJMP MMAIN2
MENU1:JNB P2.0,$ ;时钟调整
SETB P1.0
MOV 3CH,30H ;将暂存的数转成字形 显示30H
MOV 3DH,31H ;将暂存的数转成字形 显示31H
MOV 3EH,#0ABH ;将暂存的数转成字形 显示" t"
CLR 07H ;显示小数点1
SETB 08H ;不显示小数点2
LCALL MXIAN ;显示菜单1
LCALL ADDM1 ;按键加一分钟
LCALL ADDH1 ;按键加一小时
LCALL DECMH ;减一分钟/一小时
CLR P2.6
JNB P2.0,MENU2
SJMP MENU1
MENU2:JNB P2.0,$ ;日期调整
SETB P1.0
MOV 3CH,39H ;将暂存的数转成字形 显示39H
MOV 3DH,3AH ;将暂存的数转成字形 显示3AH
MOV 3EH,3BH ;将暂存的数转成字形 显示3BH
CLR 07H ;显示小数点1
CLR 08H ;显示小数点2
LCALL MXIAN ;显示菜单2
LCALL DATEN ;年份+1
LCALL DATEM ;月份+1
LCALL DATED ;+1日
CLR P2.6
JNB P2.0,MENU3
SJMP MENU2
MENU3:JNB P2.0,$ ;闹钟1
SETB P1.0
MOV 3CH,35H ;将暂存的数转成字形 显示35H
MOV 3DH,36H ;将暂存的数转成字形 显示36H
MOV 3EH,#0A1H ;将暂存的数转成字形 显示" 1"
CLR 07H ;显示小数点1
SETB 08H ;不显示小数点2
LCALL MXIAN ;显示菜单3
LCALL T1M1 ;闹钟1分钟+1
LCALL T1H1 ;闹钟1小时+1
LCALL DECT1 ;闹钟1减1小时/1分钟
CLR P2.6
JNB P2.0,MENU4
SJMP MENU3
MENU4:JNB P2.0,$ ;闹钟2
SETB P1.0
MOV 3CH,37H ;将暂存的数转成字形 显示37H
MOV 3DH,38H ;将暂存的数转成字形 显示38H
MOV 3EH,#0A2H ;将暂存的数转成字形 显示" 2"
CLR 07H ;显示小数点1
SETB 08H ;不显示小数点2
LCALL MXIAN ;显示菜单4
LCALL T2M1 ;闹钟2分钟+1
LCALL T2H1 ;闹钟2小时+1
LCALL DECT2 ;闹钟减2小时/1分钟
CLR P2.6
JNB P2.0,MENU5
SJMP MENU4
MENU5:LJMP MMAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;中断处理;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GOTO:PUSH A ;保护现场
DJNZ R3,GOTO1
MOV R3,#50
DJNZ R4,GOTO1
MOV R4,#25
CPL 00H ;20H.0 用于秒闪烁
DJNZ R2,GOTO1
MOV R2,#02H ;配合定时器定时一秒
MOV A,32H ;秒位是否为59秒,是:秒清零,分钟+1,判断分钟...
CJNE A,#59H,M1 ;否:跳转到秒+1
MOV 32H,#00H
MOV A,31H ;分钟位同上
CJNE A,#59H,M2
MOV 31H,#00H
MOV A,30H ; 小时位同上
CJNE A,#23H,M3
MOV 30H,#00H
LCALL ADDD
SJMP GOTO1
M1:ADD A,#01 ;秒+1
DA A
MOV 32H,A
SJMP GOTO1
M2:ADD A,#01 ;分钟+1
DA A
MOV 31H,A
SJMP GOTO1
M3:ADD A,#01 ; 小时+1
DA A
MOV 30H,A
SJMP GOTO1
GOTO1:POP A ;恢复现场
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;时钟显示专用子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;
XIAN:MOV A,32H ;将暂存的数转成字形
SWAP A
MOV B,#10H
DIV AB
LCALL ZH
MOV P0,A ;LED显示秒位
MOV P2,#0FEH
LCALL DELAY
MOV A,B
LCALL ZH
MOV P0,A
MOV P2,#0FDH
LCALL DELAY
MOV A,31H ;将暂存的数转成字形
SWAP A
MOV B,#10H
DIV AB
LCALL ZH
MOV P0,A ;LED显示分钟位
MOV C,00H
MOV P0.7,C ;秒闪烁
MOV P2,#0FBH
LCALL DELAY
SETB P0.7 ; 取消显示小数点
MOV A,B
LCALL ZH
MOV P0,A
MOV P2,#0F7H
LCALL DELAY
MOV A,30H ;将暂存的数转成字形
SWAP A
MOV B,#10H
DIV AB
LCALL ZH
MOV P0,A ;LED显示小时位
CLR P0.7 ;显示小数点
MOV P2,#0EFH
LCALL DELAY
SETB P0.7 ;取消显示小数点
MOV A,B
LCALL ZH
MOV P0,A
MOV P2,#0DFH
LCALL DELAY
RET
DELAY:MOV R5,#0AH ;延时1mS(6MHz)
L1:MOV R6,#19H
L2:DJNZ R6,L2
DJNZ R5,L1
RET
ZH:MOV DPTR,#TAB ;字形转换
MOVC A,@A+DPTR
MOV P2,#0FFH ;消影
RET
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;字形0~9
DB 0FFH,87H,0C8H,0A1H,86H,8EH ;字形 A=" ",B="t",C="n",F="F",-hsz
TAB2:DB 30H,31H,28H,31H,30H,31H,30H,31H,31H,30H,31H,30H,31H ;每个月的天数,平年
TAB3:DB 30H,31H,29H,31H,30H,31H,30H,31H,31H,30H,31H,30H,31H ;每个月的天数,闰年
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示子程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;菜单显示子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MXIAN:MOV A,3EH ;将暂存的数转成字形
SWAP A
MOV B,#10H
DIV AB
LCALL ZH
MOV P0,A ;LED显示5,6位
MOV P2,#0FEH
LCALL DELAY
MOV A,B
LCALL ZH
MOV P0,A
MOV P2,#0FDH
LCALL DELAY
MOV A,3DH ;将暂存的数转成字形
SWAP A
MOV B,#10H
DIV AB
LCALL ZH
MOV P0,A ;LED显示3,4位
MOV C,08H
MOV P0.7,C ;是否显示小数点2
MOV P2,#0FBH
LCALL DELAY
SETB P0.7 ; 取消显示小数点
MOV A,B
LCALL ZH
MOV P0,A
MOV P2,#0F7H
LCALL DELAY
MOV A,3CH ;将暂存的数转成字形
SWAP A
MOV B,#10H
DIV AB
LCALL ZH
MOV P0,A ;LED显示1,2位
MOV C,07H
MOV P0.7,C ;是否显示小数点1
MOV P2,#0EFH
LCALL DELAY
SETB P0.7 ; 取消显示小数点
MOV A,B
LCALL ZH
MOV P0,A
MOV P2,#0DFH
LCALL DELAY
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;按键子程序开始;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CS:MOV P0,#0FFH ;秒清零
MOV P2,#10111111B
JB P2.1,CS1
MOV 32H,#00H
CS1:SETB P2.6
RET
;-------------------------------------------------------------------
ADDM1:MOV P0,#0FFH ;加一分钟
MOV P2,#10111111B
JNB P2.2,ADDM11
CLR 03H ;按键2是否有效
ADDM11:JB 03H,ADDM12
JB P2.2,ADDM12
LCALL MXIAN ;这四个为去抖动
MOV P0,#0FFH
MOV P2,#10111111B
JB P2.2,ADDM12
SETB 03H ;按键2是否有效
SETB 09H ;时钟加减标致位
MOV A,31H ;分钟 +1
CJNE A,#59H,M21
MOV 31H,#00H
SJMP ADDM12
M21:ADD A,#01
DA A
MOV 31H,A
SJMP ADDM12
ADDM12:SETB P2.6
RET
;-------------------------------------------------------------------
ADDH1:MOV P0,#0FFH ;加一小时
MOV P2,#10111111B
JNB P2.3,ADDH11
CLR 04H ;按键3是否有效
ADDH11:JB 04H,ADDH12
JB P2.3,ADDH12
LCALL MXIAN ;这四个为去抖动
MOV P0,#0FFH
MOV P2,#10111111B
JB P2.3,ADDH12
SETB 04H ;按键3是否有效
CLR 09H ;时钟加减标致位
MOV A,30H ; 小时 +1
CJNE A,#23H,H31
MOV 30H,#00H
SJMP ADDH12
H31:ADD A,#01
DA A
MOV 30H,A
ADDH12:SETB P2.6
RET
;-------------------------------------------------------------------
DECMH:MOV P0,#0FFH ;减一分钟/一小时
MOV P2,#10111111B
JNB P2.1,DECM11
CLR 05H ;按键1是否有效
DECM11:JB 05H,DECM12
JB P2.1,DECM12
LCALL MXIAN ;这四个为去抖动
MOV P0,#0FFH
MOV P2,#10111111B
JB P2.1,DECM12
SETB 05H ;按键1是否有效
JNB 09H,DECMH3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -