📄 time.asm
字号:
;****************************************************************
;* 24小时制式,前面四位数码管分别显示小时值和分钟值 *
;* 发光二极管用来表示秒钟十位值,第五位数码管显示秒钟的个位值 *
;* 秒钟的读数方法是:发光二极管的点亮个数 + 第五位数码管显示值 *
;* 如发光二极管亮3个,第五位数码管显示6,表示当前秒钟值为36妙 *
;* 调整时间使用K1~K4,K1、K2调整小时值,K3、K4调整分钟值 *
;* 按键功能 K1:小时"+" K2:小时"-" K3:分钟"+" K4:分钟"-" *
;****************************************************************
ORG 0000H
LJMP START ;转初始化
ORG 000BH
LJMP PGT0 ;T0中断入口
ORG 0033H
START:
DIS1 EQU 30H
DIS2 EQU 31H
DIS3 EQU 32H
DIS4 EQU 33H
DIS5 EQU 34H
DIS6 EQU 35H
DISXS EQU 36H
DISFZ EQU 37H
DISMZ EQU 38H
MS500 EQU 39H
K1 BIT P3.2
K2 BIT P3.3
K3 BIT P3.4
K4 BIT P3.5
BDP BIT 01H
MOV SP,#50H ;初始化程序
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV TMOD,#01H ;定时器T0工作于方式1
MOV TH0,#4CH ;定时器初值
MOV TL0,#05H
MOV IE,#82H
MOV R3,#10
SETB TR0
MOV DIS1,#00H ;清显示缓冲区
MOV DIS2,#00H
MOV DIS3,#00H
MOV DIS4,#00H
MOV DIS5,#00H
MOV DISXS,#12 ;初始化时间为12:00:00
MOV DISFZ,#0
MOV DISMZ,#0
MOV MS500,#0
MAIN: ;主程序
MOV A,DISFZ
CJNE A,#60,BJ0
SJMP SK1
BJ0: JC SK1
MOV DISFZ,#00H
SK1: JB K1,SK2 ;按键K1检测
ACALL YS10MS
JB K1,SK2
ACALL SOUND
K1DD: JNB K1,K1DD
INC DISXS
MOV DISMZ,#00H
MOV A,DISXS
CJNE A,#24,BJ1
MOV DISXS,#00H
SJMP SEND
BJ1: JC SEND
MOV DISXS,#00H
SJMP SEND
SK2: JB K2,SK3 ;按键K2检测
ACALL YS10MS
JB K2,SK3
ACALL SOUND
K2DD: JNB K2,K2DD
MOV DISMZ,#00H
MOV A,DISXS
CJNE A,#00,BJ2
MOV DISXS,#23
SJMP SEND
BJ2: DEC DISXS
SJMP SEND
SK3: JB K3,SK4 ;按键K3检测
ACALL YS10MS
JB K3,SK4
ACALL SOUND
K3DD: JNB K3,K3DD
MOV DISMZ,#00H
INC DISFZ
MOV A,DISFZ
CJNE A,#60,BJ3
MOV DISFZ,#00H
SJMP SEND
BJ3: JC SEND
MOV DISFZ,#00H
SJMP SEND
SK4: JB K4,SEND ;按键K4检测
ACALL YS10MS
JB K4,SEND
ACALL SOUND
K4DD: JNB K1,K4DD
MOV DISMZ,#00H
MOV A,DISFZ
CJNE A,#00,BJ4
MOV DISFZ,#59
SJMP SEND
BJ4: DEC DISFZ
SJMP SEND
SEND: MOV A,DISMZ ;处理当前秒数据
MOV B,#10
DIV AB ;10进制转换
MOV DIS5,A ;得到十秒值
MOV DIS6,B ;得到秒值
CJNE A,#00,TST1
MOV P1,#0FFH
AJMP TST
TST1: CJNE A,#01,TST2 ;将十秒值用P1口的发光二极管来显示
MOV P1,#11111110B
AJMP TST
TST2: CJNE A,#02,TST3
MOV P1,#11111100B
AJMP TST
TST3: CJNE A,#03,TST4
MOV P1,#11111000B
AJMP TST
TST4: CJNE A,#04,TST5
MOV P1,#11110000B
AJMP TST
TST5: CJNE A,#05,TST
MOV P1,#11100000B
TST: MOV A,DISFZ
MOV B,#10
DIV AB ;转换当前分钟数据
MOV DIS3,A ;得到十分值
MOV DIS4,B ;得到分值
MOV A,DISXS
MOV B,#10
DIV AB ;转换当前小时数据
MOV DIS1,A ;得到十小时值
MOV DIS2,B ;得到小时值
CLR P2.6 ;允许数码管显示
MOV A,DIS1 ;显示十小时值
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A
CLR P2.0
SETB P2.1
SETB P2.2
SETB P2.3
SETB P2.4
LCALL DELAY
MOV A,DIS2 ;显示小时值
MOV DPTR,#SGTB
MOVC A,@A+DPTR
JB BDP,DP1
ANL A,#01111111B
DP1: MOV P0,A
SETB P2.0
CLR P2.1
SETB P2.2
SETB P2.3
SETB P2.4
LCALL DELAY
MOV A,DIS3 ;显示十分钟值
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
SETB P2.1
CLR P2.2
SETB P2.3
SETB P2.4
LCALL DELAY
MOV A,DIS4 ;显示分钟值
MOV DPTR,#SGTB
MOVC A,@A+DPTR
JB BDP,DP2
ANL A,#01111111B
DP2: MOV P0,A
SETB P2.0
SETB P2.1
SETB P2.2
CLR P2.3
SETB P2.4
LCALL DELAY
;----- 十秒值已经用发光二极管来表示,第五位数码管显示的是秒值 -------
MOV A,DIS6 ;显示秒值
MOV DPTR,#SGTB1
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
SETB P2.1
SETB P2.2
SETB P2.3
CLR P2.4
LCALL DELAY
AJMP MAIN ;循环
PGT0: PUSH ACC ;定时器T0中断处理程序
MOV TH0,#4CH ;50MS
MOV TL0,#05H
DJNZ R3,T0RET
MOV R3,#10
CPL BDP
INC MS500
MOV A,MS500
CJNE A,#2,T0RET
MOV MS500,#00H
INC DISMZ
MOV A,DISMZ
CJNE A,#60,T0RET
MOV DISMZ,#00H
INC DISFZ
MOV A,DISFZ
CJNE A,#60,T0RET
MOV DISFZ,#00H
INC DISXS
MOV A,DISXS
CJNE A,#24,T0RET
MOV DISXS,#00H
T0RET: POP ACC
RETI
;************* 8位共阳数码管字型表 *****************
SGTB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,89H,0A3H,8CH,0C8H
sgtb1: db 24h,7dh,0e0h,70h,39h,32h,22h,7ch,20h,30h,28h,23h,0a6h,61h,0a2h,0aah
;******** 延时子程序 ********
DELAY: MOV R1,#2
Y1: MOV R2,#200
DJNZ R2,$
DJNZ R1,Y1
RET
;********** 10ms延时程序 ***********
YS10MS: MOV R7,#128
DL1: MOV R6,#0FFH
DL0: DJNZ R6,DL0
DJNZ R7,DL1
RET
;******* 音效子程序 *******
SOUND: MOV R7,#228
SDL1: CPL P3.7
MOV R6,#0FFH
SDL0: DJNZ R6,SDL0
DJNZ R7,SDL1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -