📄 digital clock (2).asm
字号:
S_SET BIT P1.0 ;数字钟秒控制位
M_SET BIT P1.1 ;分钟控制位
H_SET BIT P1.2 ;小时控制位
A_DISP BIT P1.3
A_S_SET BIT P1.4
A_M_SET BIT P1.5
A_H_SET BIT P1.6
SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
TCNT EQU 34H
A_SEC EQU 36H
A_MIN EQU 37H
A_HOU EQU 38H
ALARM EQU 39H
ORG 00H
SJMP START
ORG 0BH
LJMP INT_T0
START:
MOV HOUR,#0 ;初始化
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
MOV A_SEC,#0 ;闹铃初始化为分隔符
MOV A_MIN,#0
MOV A_HOU,#0
MOV ALARM,#0 ;闹铃显示按钮
MOV TMOD,#01H
MOV TH0,#(65536-50000)/256 ;定时50毫秒
MOV TL0,#(65536-50000)MOD 256
MOV IE,#82H
SETB TR0
;****************************************************
;判断是否有控制键按下,是哪一个键按下
A1: LCALL DISPLAY
JNB S_SET,S1
JNB M_SET,S2
JNB H_SET,S3
JNB A_DISP,S4
JNB A_S_SET,S5
JNB A_M_SET,S6
JNB A_H_SET,S7
LJMP A1
S1: LCALL DELAY ;去抖动
JB S_SET,A1
INC SECOND ;秒值加1
MOV A,SECOND
CJNE A,#60,J0 ;判断是否加到60秒
MOV SECOND,#0
LJMP K1
S2: LCALL DELAY
JB M_SET,A1
K1: INC MINUTE ;分钟值加1
MOV A,MINUTE
CJNE A,#60,J1 ;判断是否加到60分
MOV MINUTE,#0
LJMP K2
S3: LCALL DELAY
JB H_SET,A1
K2: INC HOUR ;小时值加1
MOV A,HOUR
CJNE A,#24,J2 ;判断是否加到24小时
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
AJMP J2
S4: LCALL DELAY
JB A_DISP,A1
AJMP J3
S5: LCALL DELAY ;去抖动
JB A_S_SET,A1
INC A_SEC ;秒值加1
MOV A,A_SEC
CJNE A,#60,J4 ;判断是否加到60秒
MOV A_SEC,#0
AJMP J4
S6: LCALL DELAY
JB A_M_SET,A1
INC A_MIN ;分钟值加1
MOV A,A_MIN
CJNE A,#60,J5 ;判断是否加到60分
MOV A_MIN,#0
AJMP J5
S7: LCALL DELAY
JB A_H_SET,OVER
INC A_HOU ;小时值加1
MOV A,A_HOU
CJNE A,#24,J6 ;判断是否加到24小时
MOV A_HOU,#0
OVER: LJMP A1
;****************************************************
;等待按键抬起
J0: JB S_SET,N0
LCALL DISPLAY
;SJMP J0
N0: AJMP A1
J1: JB M_SET,N1
LCALL DISPLAY
SJMP J1
N1: AJMP A1
J2: JB H_SET,N2
LCALL DISPLAY
SJMP J2
N2: AJMP A1
J3: JB A_DISP,N3
LCALL INT_ALARM
SJMP J3
N3: AJMP A1
J4: JB A_S_SET,N4
LCALL DISPLAY_ALARM
SJMP J4
N4: AJMP A1
J5: JB A_M_SET,N5
LCALL DISPLAY_ALARM
SJMP J5
N5: AJMP A1
J6: JB A_H_SET,N6
LCALL DISPLAY_ALARM
SJMP J6
N6: AJMP A1
;***********************************************
;定时器中断服务程序,对秒,分钟和小时的计数
INT_T0: MOV TH0,#(65536-50000)/256
MOV TL0,#(65536-50000)MOD 256
INC TCNT
MOV A,TCNT
CJNE A,#20,RETUNE ;计时1秒
INC SECOND
MOV TCNT,#0
MOV A,SECOND
CJNE A,#60,RETUNE
INC MINUTE
MOV SECOND,#0
MOV A,MINUTE
CJNE A,#60,RETUNE
INC HOUR
MOV MINUTE,#0
MOV A,HOUR
CJNE A,#24,RETUNE
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
RETUNE: RETI
;******************************************
;显示控制子程序
DISPLAY: MOV DPTR,#TABLE
MOV A,SECOND ;显示秒
MOV B,#10
DIV AB
CLR P3.6
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.6
MOV A,B
CLR P3.7
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.7
CLR P3.5
MOV P0,#40H ;显示分隔符
LCALL DELAY
SETB P3.5
MOV A,HOUR ;显示分钟
MOV R1,ALARM
CJNE R1,#01H,B20
CJNE A,A_HOU,B20
MOV A,MINUTE
CJNE A,A_MIN,B20
CPL P1.7
B20: MOV A,MINUTE
MOV B,#10
DIV AB
CLR P3.3
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.3
MOV A,B
CLR P3.4
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.4
CLR P3.2
MOV P0,#40H ;显示分隔符
LCALL DELAY
SETB P3.2
MOV A,MINUTE
MOV R1,ALARM
CJNE R1,#01H,B30
CJNE A,A_MIN,B30
MOV A,HOUR ;显示小时
CJNE A,A_HOU,B30
CPL P1.7
B30: MOV A,HOUR
MOV B,#10
DIV AB
CLR P3.0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.0
MOV A,B
CLR P3.1
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
;****************************************************
;闹铃显示子程序
DISPLAY_ALARM: MOV ALARM,#1H
MOV DPTR,#TABLE
MOV A,A_SEC ;显示秒
MOV B,#10
DIV AB
CLR P3.6
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.6
MOV A,B
CLR P3.7
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.7
CLR P3.5
MOV P0,#40H ;显示分隔符
LCALL DELAY
SETB P3.5
MOV A,A_MIN ;显示分钟
MOV B,#10
DIV AB
CLR P3.3
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.3
MOV A,B
CLR P3.4
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.4
CLR P3.2
MOV P0,#40H ;显示分隔符
LCALL DELAY
SETB P3.2
MOV A,A_HOU ;显示小时
MOV B,#10
DIV AB
CLR P3.0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.0
MOV A,B
CLR P3.1
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.1
RET
;****************************************************
;闹铃清零显示子程序
INT_ALARM: MOV A_SEC,#0 ;闹铃初始化为分隔符
MOV A_MIN,#0
MOV A_HOU,#0
MOV ALARM,#0
CLR P3.6
MOV P0,#40H
LCALL DELAY
SETB P3.6
CLR P3.7
MOV P0,#40H
LCALL DELAY
SETB P3.7
CLR P3.5
MOV P0,#40H ;显示分隔符
LCALL DELAY
SETB P3.5
CLR P3.3
MOV P0,#40H
LCALL DELAY
SETB P3.3
CLR P3.4
MOV P0,#40H
LCALL DELAY
SETB P3.4
CLR P3.2
MOV P0,#40H ;显示分隔符
LCALL DELAY
SETB P3.2
CLR P3.0
MOVC A,@A+DPTR
MOV P0,#40H
LCALL DELAY
SETB P3.0
CLR P3.1
MOV P0,#40H
LCALL DELAY
SETB P3.1
RET
DELAY: MOV R6,#10
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -