📄 a_clock.asm
字号:
JNB P1.7,COL3
AJMP KEYEND
COL3: MOV 60H,#3 ;存储列号
AJMP KEYVALUE
COL2: MOV 60H,#2
AJMP KEYVALUE
COL1: MOV 60H,#1
AJMP KEYVALUE
COL0: MOV 60H,#0
KEYVALUE:
MOV A,60H
CJNE A,#0,LS1 ;转向功能键服务子程序
ACALL KEY0
SJMP KEYEND
LS1: CJNE A,#1,LS2
ACALL KEY1
SJMP KEYEND
LS2: CJNE A,#2,LS3
ACALL KEY2
SJMP KEYEND
LS3: CJNE A,#3,KEYEND
ACALL KEY3
KEYEND: POP DPL
POP DPH
POP ACC
POP PSW
RETI
KEY0: ;功能设置控制按键,,34H=#02H进行日期校准,34H=#03H进行闹钟设置,34H=#04H进行秒表功能
INC 34H
MOV A,34H
MOV 38H,#00H
MOV 65H,#00H
CJNE A,#05H,K0_EXIT
MOV 34H,#00H
K0_EXIT:RET
KEY1: ;参数修改加1操作,秒表功能时做开始、停止操作
MOV 50H,#00H
K1_14: MOV 36H,#01H
MOV A,34H
CJNE A,#01H,K1_1
K1_12: MOV A,65H
CJNE A,#01H,K1_2
K1_5: MOV 66H,#0AH
SJMP K1_EXIT
K1_2: CJNE A,#02H,K1_3
K1_7: MOV 66H,#01H
SJMP K1_EXIT
K1_3: CJNE A,#03H,K1_4
SJMP K1_5
K1_4: CJNE A,#04H,K1_6
SJMP K1_7
K1_6: CJNE A,#05H,K1_8
SJMP K1_5
K1_8: CJNE A,#06H,K1_9
SJMP K1_7
K1_9: CJNE A,#07H,K1_10
SJMP K1_5
K1_10: CJNE A,#08H,K1_EXIT
SJMP K1_7
K1_1: CJNE A,#02H,K1_11
SJMP K1_12
K1_11: CJNE A,#03H,K1_13
SJMP K1_12
K1_13: CJNE A,#04H,K1_EXIT
MOV 66H,#00H
INC 35H
MOV A,35H
CJNE A,#03H,K1_EXIT
MOV 35H,#01H
K1_EXIT:RET
KEY2: ;参数修改减一操作,秒表功能是做复位操作
MOV 50H,#00H
K2_15: MOV 36H,#02H
MOV A,34H
CJNE A,#01H,K2_1
K2_12: MOV A,65H
CJNE A,#01H,K2_2
K2_5: MOV 66H,#10
SJMP K1_EXIT
K2_2: CJNE A,#02H,K2_3
K2_7: MOV 66H,#01H
SJMP K1_EXIT
K2_3: CJNE A,#03H,K2_4
SJMP K2_5
K2_4: CJNE A,#04H,K2_6
SJMP K2_7
K2_6: CJNE A,#05H,K2_8
SJMP K2_5
K2_8: CJNE A,#06H,K2_9
SJMP K2_7
K2_9: CJNE A,#07H,K2_10
SJMP K2_5
K2_10: CJNE A,#08H,K2_EXIT
SJMP K2_7
K2_1: CJNE A,#02H,K2_11
SJMP K2_12
K2_11: CJNE A,#03H,K2_13
SJMP K2_12
K2_13: CJNE A,#04H,K2_EXIT
MOV 66H,#00H
MOV A,35H
CJNE A,#01H,K2_14
SJMP K2_EXIT
K2_14: CJNE A,#02H,K2_EXIT
MOV 35H,#03H
K2_EXIT:RET
KEY3: ;按住不放显示日期,或者选择修改那个参数
MOV A,34H
CJNE A,#00H,K3_1
K3_2: LCALL DISPLAY2
JB P1.7,K3_0
SJMP K3_2
K3_0: LCALL DISPLAY0
LCALL D40MS
SJMP K3_EXIT
K3_1: CJNE A,#01H,K3_3
K3_5: INC 65H
MOV A,65H
CJNE A,#09H,K3_EXIT
MOV 65H,#00H
SJMP K3_EXIT
K3_3: CJNE A,#02H,K3_4
SJMP K3_5
K3_4: CJNE A,#03H,K3_6
SJMP K3_5
K3_6: CJNE A,#04H,K3_EXIT
K3_EXIT:RET
;*******************************************************************************************
SERVE1: ;T1定时器中断子程序
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL ;保护现场
MOV TH1,#0FCH
MOV TL1,#2AH ;重置初值
DJNZ 20H,RET1 ;判断是否到10ms,没有则返回
MOV 20H,#10 ;重装中断次数
MOV A,34H ;判断是否是秒表功能,
CJNE A,#04H,SE_1
MOV A,35H ;判断是否开始计时
CJNE A,#01H,SE_1
LCALL TIME
SE_1: INC 33H
INC 39H
MOV A,50H
CJNE A,#01H,SE_24
MOV A,31H
CLR C
SUBB A,71H
CJNE A,#05H,SE_23
MOV 50H,#00H
SE_24: SETB P3.6
SJMP SE_22
SE_23: INC 49H
MOV A,49H
CJNE A,#30,SE_22
MOV 49H,#00H
CPL P3.6
SE_22: MOV A,39H
CJNE A,#70,SE_20
MOV 39H,#00H
SE_20: MOV A,33H
CJNE A,#100,RET1 ;是否到1s,否则返回
MOV 33H,#00H ;是则10ms单元清0
INC 32H ;秒单元进1
MOV A,32H
CJNE A,#60,RET1 ;是否到60秒,否则返回
MOV 32H,#00H ;是则秒单元清0
INC 31H ;分单元进1
MOV A,31H
CJNE A,#60,RET1 ;是否到60分,否则返回
MOV 31H,#00H ;分单元清0
INC 30H ;时单元进1
MOV A,30H
CJNE A,#24,RET1 ;是否到24时,否则返回
MOV 30H,#00H ;是则清0
INC 77H ;日单元进1
MOV A,76H
CJNE A,#01H,SE_2
SE_9: MOV A,77H
CJNE A,#32,RETUNT
MOV 77H,#01H
AJMP SE_6
RET1: AJMP RETUNT
SE_2: CJNE A,#02H,SE_3
MOV A,75H
CJNE A,#00H,SE_4
MOV A,74H
SE_4: MOV B,#4
DIV AB
MOV A,B
CJNE A,#00H,SE_5
MOV A,77H
CJNE A,#30,RETUNT
MOV 77H,#01H
AJMP SE_6
SE_5: MOV A,77H
CJNE A,#29,RETUNT
MOV 77H,#01H
AJMP SE_6
SE_3: CJNE A,#04H,SE_7
SE_11: MOV A,77H
CJNE A,#31,RETUNT
MOV 77H,#01H
AJMP SE_6
SE_7: CJNE A,#03H,SE_8
SJMP SE_9
SE_8: CJNE A,#05H,SE_10
SJMP SE_9
SE_10: CJNE A,#06H,SE_12
AJMP SE_11
SE_12: CJNE A,#07H,SE_13
SJMP SE_9
SE_13: CJNE A,#08H,SE_14
AJMP SE_9
SE_14: CJNE A,#09H,SE_15
AJMP SE_11
SE_15: CJNE A,#10,SE_16
AJMP SE_9
SE_16: CJNE A,#11,SE_17
AJMP SE_11
SE_17: CJNE A,#12,RETUNT
AJMP SE_9
SE_6: INC 76H
MOV A,76H
CJNE A,#13,RETUNT
MOV 76H,#01H
INC 75H
MOV A,75H
CJNE A,#100,RETUNT
MOV 75H,#00H
INC 74H
RETUNT: POP DPL
POP DPH
POP ACC
POP PSW
RETI
;*********************************************************************************
DISPLAY0: ;时钟显示子程序,30H~33H(时分秒)
MOV R0,#30H
MOV R1,#00H
MOV R2,#04H
D0_1: MOV A,@R0 ;取要显示的值
MOV B,#10
DIV AB ;求十位数和个位数
MOV DPTR,#TAB1 ;取十位数的字型码
MOVC A,@A+DPTR
MOV P0,A ;输出到P0口显示
MOV A,R1 ;选择要显示的数码管
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV P2,A ;点亮该数码管
LCALL D1MS
INC R1 ;准备下一个要显示的数码管
MOV A,B ;取个位数
CJNE R0,#33H,D0_2 ;判断是否扫描到了最后一个数码管
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P0,A
SJMP D0_3
D0_2: MOV DPTR,#TAB2 ;取个位数的字型码
MOVC A,@A+DPTR
MOV P0,A
D0_3: MOV A,R1
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV P2,A
LCALL D1MS
INC R1
INC R0
DJNZ R2,D0_1 ;判断时分秒是否显示完毕
RET
;*****************************************************************************************
DISPLAY1: ;调时显示子程序,40H~43H
MOV R0,#40H
MOV R1,#01H
MOV R2,#04H
D1_7: MOV A,R1
CJNE A,65H,D1_1
MOV A,39H
CLR C
CJNE A,#35,D1_8
D1_8: JB PSW.7,D1_2
D1_1: MOV A,@R0 ;取要显示的值
MOV B,#10
DIV AB ;求十位数和个位数
MOV DPTR,#TAB1 ;取十位数的字型码
MOVC A,@A+DPTR
MOV P0,A ;输出到P0口显示
DEC R1
MOV A,R1 ;选择要显示的数码管
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV P2,A ;点亮该数码管
LCALL D1MS
INC R1
D1_2: INC R1 ;准备下一个要显示的数码管
MOV A,R1
CJNE A,65H,D1_3
MOV A,39H
CLR C
CJNE A,#35,D1_9
D1_9: JB PSW.7,D1_4
D1_3: MOV A,@R0
MOV B,#10
DIV AB
MOV A,B ;取个位数
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P0,A
DEC R1
MOV A,R1
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV P2,A
LCALL D1MS
INC R1
D1_4: CJNE R0,#43H,D1_5 ;判断是否扫描到了最后一个数码管
SJMP D1_6
D1_5: MOV P0,#7FH
DEC R1
MOV A,R1
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV P2,A
LCALL D1MS
INC R1
D1_6: INC R1
INC R0
DJNZ R2,D1_7 ;判断是否显示完毕
RET
;**********************************************************************************
DISPLAY2: ;日期校准显示子程序,74H~77H(年月日)
MOV R0,#74H
MOV R1,#01H
MOV R2,#04H
D2_8: MOV A,R1
CJNE A,65H,D2_1
MOV A,39H
CLR C
CJNE A,#35,D2_10
D2_10: JB PSW.7,D2_2
D2_1: MOV A,@R0 ;取要显示的值
MOV B,#10
DIV AB ;求十位数和个位数
MOV DPTR,#TAB1 ;取十位数的字型码
MOVC A,@A+DPTR
MOV P0,A ;输出到P0口显示
DEC R1
MOV A,R1 ;选择要显示的数码管
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV P2,A ;点亮该数码管
LCALL D1MS
INC R1
D2_2: INC R1 ;准备下一个要显示的数码管
MOV A,R1
CJNE A,65H,D2_3
MOV A,39H
CLR C
CJNE A,#35,D2_11
D2_11: JB PSW.7,D2_4
D2_3: MOV A,@R0
MOV B,#10
DIV AB
MOV A,B ;取个位数
MOV DPTR,#TAB1 ;取个位数的字型码
MOVC A,@A+DPTR
MOV P0,A
DEC R1
MOV A,R1
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV P2,A
LCALL D1MS
INC R1
D2_4: CJNE R0,#77H,D2_5 ;判断是否扫描到了最后一个数码管
SJMP D2_6
D2_5: CJNE R0,#74H,D2_7 ;判断是否是年份高二位的显示,是小数点不显示
SJMP D2_6
D2_7: MOV P0,#7FH
DEC R1
MOV A,R1
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV P2,A
LCALL D1MS
INC R1
D2_6: INC R1
INC R0
DJNZ R2,D2_8 ;判断时分秒是否显示完毕
RET
;************************************************************************************
DISPLAY3: ;闹钟设置显示子程序,70H~73H(时分秒)
MOV R0,#70H
MOV R1,#01H
MOV R2,#04H
D3_10: MOV A,R1
CJNE A,65H,D3_1
MOV A,39H
CLR C
CJNE A,#35,D3_8
D3_8: JB PSW.7,D3_2
D3_1: MOV A,@R0 ;取要显示的值
MOV B,#10
DIV AB ;求十位数和个位数
MOV DPTR,#TAB1 ;取十位数的字型码
MOVC A,@A+DPTR
MOV P0,A ;输出到P0口显示
DEC R1
MOV A,R1 ;选择要显示的数码管
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV P2,A ;点亮该数码管
LCALL D1MS
INC R1 ;准备下一个要显示的数码管
D3_2: INC R1
MOV A,R1
CJNE A,65H,D3_3
MOV A,39H
CLR C
CJNE A,#35,D3_9
D3_9: JB PSW.7,D3_4
D3_3: MOV A,@R0
MOV B,#10
DIV AB
MOV A,B ;取个位数
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P0,A
DEC R1
MOV A,R1
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV P2,A
LCALL D1MS
INC R1
D3_4: CJNE R0,#73H,D3_5 ;判断是否扫描到了最后一个数码管
SJMP D3_6
D3_5: MOV P0,#7FH
DEC R1
MOV A,R1
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV P2,A
LCALL D1MS ;显示小数点
INC R1
D3_6: INC R1
INC R0
DJNZ R2,D3_10 ;判断时分秒是否显示完毕
RET
;**************************************************************************************
DISPLAY4: ;秒表子程序显示 52~55H
MOV R0,#52H
MOV R1,#00H
MOV R2,#04H
D4_1:
MOV A,@R0 ;取要显示的值
MOV B,#10
DIV AB ;求十位数和个位数
MOV DPTR,#TAB1 ;取十位数的字型码
MOVC A,@A+DPTR
MOV P0,A ;输出到P0口显示
MOV A,R1 ;选择要显示的数码管
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV P2,A ;点亮该数码管
LCALL D1MS
INC R1 ;准备下一个要显示的数码管
MOV A,B ;取个位数
CJNE R0,#55H,D4_2 ;判断是否扫描到了最后一个数码管
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P0,A
SJMP D4_3
D4_2: MOV DPTR,#TAB2 ;取个位数的字型码
MOVC A,@A+DPTR
MOV P0,A
D4_3: MOV A,R1
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV P2,A
LCALL D1MS
INC R1
INC R0
DJNZ R2,D4_1 ;判断时分秒是否显示完毕
RET
TAB1: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;无小数点数码显示
TAB2: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H ;有小数点数码显示
TAB3: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH ;八个数码管选通
;********************************************************************************************
D1MS: MOV R6,#2 ;1ms延时子程序
S11: MOV R7,#248
S22: DJNZ R7,S22
DJNZ R6,S11
RET
;********************************************************************************************
D10MS: ;10ms延时子程序
MOV R4,#20
D10_1: MOV R5,#248
D10_2: DJNZ R5,D10_2
DJNZ R4,D10_1
RET
;********************************************************************************************
D40MS: MOV R6,#80 ;20ms延时子程序
DS_1: MOV R7,#248
DS_2: DJNZ R7,DS_2
DJNZ R6,DS_1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -