📄 text1.a51
字号:
ORG 0000H
LJMP MAIN ;转入主程序
ORG 000BH
LJMP GT0 ;转入中断T0
ORG 0200H
;-------------------------主程序--------------------------;
MAIN:
MOV SP,#60H ;给堆栈赋初值
MOV P0,#00H ;熄灭所有LED灯
MOV DPTR,#TAB ;表地址入口
CLR A
MOV 30H,A ;小时清零
MOV 31H,A ;分钟清零
MOV 32H,A ;秒清零
MOV R0,#20 ;1秒中断次数
MOV TMOD,#01H ;T0方式1定时
MOV TH0,#3CH ;50毫秒初值
MOV TL0,#0BH
SETB EA ;开中断
SETB ET0 ;允许T0中断
SETB TR0 ;启动T0
M0:
LCALL JIAN ;调用按键子程序
LCALL XIANSHI ;调用显示子程序
LJMP M0
;-----------------------T0中断程序------------------------;
GT0:
PUSH ACC
MOV TH0,#3CH ;重新赋值
MOV TL0,#0BH
DJNZ R0,RET0 ;不够20次返回
MOV R0,#20 ;否则重新赋20给R0
INC 32H ;秒加一
MOV A,32H
CJNE A,#60,RET0 ;比较秒是否到60;不到RET0
MOV 32H,#00H ;到60改为0
INC 31H ;分钟加一
MOV A,31H
CJNE A,#60,RET0 ;比较分钟是否到60;不到RET0
MOV 31H,#00H ;到60改为0
LJMP XIANG ;调用蜂鸣器
INC 30H ;小时加一
MOV A,30H
CJNE A,#24,RET0 ;比较小时是否到24;不到RET0
MOV 30H,#00H ;到24改为0
RET0:
POP ACC
RETI ;中断返回
XIANG:
SETB P3.0
;-----------------------显示子程序------------------------;
XIANSHI:
MOV A,30H ;小时显示程序段
MOV B,#10 ;把10送入寄存器B中
DIV AB ;分离小时高低位
MOVC A,@A+DPTR ;查十位数据表
SETB P0.0 ;点亮时十位数码管
MOV P2,A ;送P2口显示
DJNZ R1,$ ;延时等待
CLR P0.0 ;熄灭时十位数码管
MOV A,B ;时个位送入A
MOVC A,@A+DPTR ;查个位数据表
SETB P0.1 ;点亮时个位数码管
MOV P2,A ;送P2口显示
DJNZ R1,$ ;延时等待
CLR P0.1 ;熄灭时个位数码管
MOV A,31H ;分钟显示程序段
MOV B,#10 ;把10送入寄存器B中
DIV AB ;分离分钟高低位
MOVC A,@A+DPTR ;查十位数据表
SETB P0.2 ;点亮分十位数码管
MOV P2,A ;送P2口显示
DJNZ R1,$ ;延时等待
CLR P0.2 ;熄灭分十位数码管
MOV A,B ;分个位送入A
MOVC A,@A+DPTR ;查个位数据表
SETB P0.3 ;点亮分个位数码管
MOV P2,A ;送P2口显示
DJNZ R1,$ ;延时等待
CLR P0.3 ;熄灭分个位数码管
MOV A,32H ;秒显示程序段
MOV B,#10 ;把10送入寄存器B中
DIV AB ;分离秒高低位
MOVC A,@A+DPTR ;查十位数据表
SETB P0.4 ;点亮秒十位数码管
MOV P2,A ;送P2口显示
DJNZ R1,$ ;延时等待
CLR P0.4 ;熄灭秒十位数码管
MOV A,B ;秒个位送入A
MOVC A,@A+DPTR ;查个位数据表
SETB P0.5 ;点亮秒个位数码管
MOV P2,A ;送P2口显示
DJNZ R1,$ ;延时等待
CLR P0.5 ;熄灭秒个位数码管
RET
;-----------------------按键子程序------------------------;
JIAN:
PUSH PSW ;保护现场
PUSH ACC
JB P1.3,S1 ;查键,改秒钟数,否则转S1
J0:
LCALL DEL_10MS ;按键消抖
LCALL XIANSHI ;调显示子程序
JNB P1.3,J0 ;按键松开后才加一
INC 32H ;秒加一
MOV A,32H
CJNE A,#60,RET1 ;秒钟不到60就转RET1
MOV 32H,#00H ;否则清零
LJMP RET1
S1:
JB P1.1,M1 ;查键,改分钟数,否则转M1
J1:
LCALL DEL_10MS ;按键消抖
LCALL XIANSHI ;调显示子程序
JNB P1.1,J1 ;按键松开后才加一
INC 31H ;分加一
MOV A,31H
CJNE A,#60,RET1 ;分钟不到24就转RET1
MOV 31H,#00H ;否则清零
LJMP RET1
M1:
JB P1.2,RET1 ;查键,改小时数,否则转RET1
J2:
LCALL DEL_10MS ;按键消抖
LCALL XIANSHI ;调显示子程序
JNB P1.2,J2 ;按键松开后才加一
INC 30H ;时加一
MOV A,30H
CJNE A,#24,RET1 ;小时不到24就转RET1
MOV 30H,#00H ;否则清零
RET1:
POP PSW ;退出保护
POP ACC
RET ;返回
;-----------------------延时子程序------------------------;
DEL_10MS:
MOV R6,#10
L1: MOV R7,#248
L2: DJNZ R7,L2
DJNZ R6,L1
RET
TAB:
DB 3FH,06H,5BH,4FH,66H ;共阴极数码管0-9数字
DB 6DH,7DH,07H,7FH,6FH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -