📄 实时钟程序.asm
字号:
;********************************************************************************
;题目: 实时钟程序设计
;功能: 实时显示分,秒,毫秒,并可以通过按键来调整时间。。
;作者:解兴哲 生医0401 20044725
;日期:2007,7,2
;********************************************************************************
ORG 0000H
LJMP MAIN
ORG 000BH ;定时器0溢出中断入口
LJMP TIME
ORG 0030H
MAIN: MOV 20H,#00H ;存毫秒
MOV 21H,#00H ;存秒
MOV 22H,#00H ;存分
MOV 23H,#00H ;存小时
MOV IP,#02H ;IP初始化,将定时器0中断优先级设为高优先级
MOV IE,#82H ;IE初始化,EA=1,ET0=1
MOV TMOD,#01H ;设定定时器工作方式,方式1,16位工作方式
MOV TL0,#0B0H
MOV TH0,#3CH ;计数初值
SETB TR0 ;启动定时
MOV SP,#40H ;重设堆栈指针
MOV 24H,#00H ;24H中存选择键按下次数
NEXT: LCALL DISP ;调用显示子程序
LCALL KEY ;调用按键检测子程序
JZ NEXT ;A=0无键按下,继续检测
LCALL ANKEY ;调用按键处理子程序
LJMP NEXT ;重新循环
NOP
NOP
NOP
;定时中断处理程序:
TIME: PUSH ACC ;保护现场
PUSH PSW
MOV TL0,#0B0H ;赋定时初值定时50MS
MOV TH0,#3CH
INC 20H ;毫秒加一
MOV A,20H
CJNE A,#20,RETI1;50mS*20=1S要循环20次,秒才加一
MOV 20H,#00H ;一秒钟时间到
MOV A,21H
ADD A,#01H ;秒加一
DA A ;BCD码十进制校准
MOV 21H,A
CJNE A,#3CH,RETI1
MOV 21H,#00H ;一分钟时间到
MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#3CH,RETI1
MOV 22H,#00H ;一小时时间到
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#18H,RETI1
MOV 23H,#00H ;到时间达到24小时,清零.
RETI1: POP PSW ;恢复现场
POP ACC
RETI ;中断返回?
NOP
NOP
;显示子程序
DISP: MOV A,21H ;处理秒21H-->2EH,2FH
ANL A,#0FH
MOV 2FH,A ;秒个位
MOV A,21H
ANL A,#0F0H
SWAP A
MOV 2EH,A ;秒十位
MOV A,22H ;处理分钟22H-->2CH,2DH
ANL A,#0FH
MOV 2DH,A
MOV A,22H
ANL A,#0F0H
SWAP A
MOV 2CH,A
MOV A,23H ;处理小时23H-->2AH,2BH
ANL A,#0FH
MOV 2BH,A
MOV A,23H
ANL A,#0F0H
SWAP A
MOV 2AH,A
MOV R0,#2FH ;显示偏移量,秒个位
MOV R3,#06H ;要显示六位数
MOV DPTR,#TABLE
MOV A,#20H ;00100000, P2.5有效,送秒个位
LOOP1: MOV B,A ;B暂存A值
MOV P2,a ;P2数码管控制端
MOV A,@R0 ;查表,7段译码
MOVC A,@A+DPTR
MOV P0,a ;送显示
MOV R2,#80H ;延时
DJNZ R2,$
DEC R0
MOV A,B
RR A ;动态显示,数码管控制端循环有效
DJNZ R3,LOOP1 ;循环显示
RET
TABLE: db 28h,7eh,0a2h,62h,74h,61h,21h ;不带小数点
DB 7ah,20h,60h,00,00,00,00,00,00
NOP
NOP
;按键判断程序 P1.3-P1.5功能键 低电平有效
KEY: MOV A,P1
CPL A ;低电平有效,取反判断
ANL A,#38H ;00111000判断有无键按下
JZ RETX ;A=0无键按下则返回
LCALL DELAY ;LCALL DISP ;延时
MOV A,P1 ;再次判断,以便去抖
CPL A
ANL A,#38H
JZ RETX ;键盘去抖动
MOV R6,A ;将键值存入R6。
LOOP2: LCALL DISP ;
MOV A,P1
CPL A
ANL A,#38H
JNZ LOOP2 ;等待键释放
LCALL DELAY ;LCALL DISP ;延时
DD: MOV A,P1 ;再次判断,以便去抖
CPL A
ANL A,#38H
JNZ DD ;等待键释放
MOV A,R6
RETX: RET
NOP
NOP
;按键处理子程序
ANKEY: CLR EA ;关中断
LX: MOV A,R6
JB ACC.3,L1 ;是选择键转L1,选择是小时、分还是秒调整
JB ACC.4,L2 ;是数值增加键转L2
JB ACC.5,L3 ;是确认键转L3
L1: MOV A,24H
CJNE A,#03H,NEXTT;不为3,继续增加
MOV 24H,#00H ;为3清零
NEXTT: INC 24H ;累计选择键按下次数
MOV A,24H
CJNE A,#01H,LED23 ;不为一,则转
SETB P3.0 ;为一,点亮秒指示灯
JMP L12
LED23: MOV A,24H
CJNE A,#02H,LED3;
SETB P3.1 ;为二,点亮分指示灯
JMP L12
LED3: SETB P3.4 ;点亮小时指示灯
JMP L12 ;结束
L2: MOV R0,24H ;判断是哪一位增加
CJNE R0,#00H,J0 ;R0不为0,转J0
JMP L12
J0: CJNE R0,#01H,MIN;R0不为一,转
MOV R1,21H ;R0为一,处理秒
CJNE R1,#3BH,J1 ;秒不为59,则加一
MOV 21H,#00H ;秒为59,则清零
JMP L12
J1: MOV A,21H
ADD A,#01H
DA A
MOV 21H,A
JMP L12
MIN: CJNE R0,#02H,HOUR ;R0不为2,转
MOV R1,22H ;R0为2,处理分
CJNE R1,#3BH,J2 ;分不为59,则加一
MOV 22H,#00H ;分为59,则清零
JMP L12
J2: MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
JMP L12
HOUR: MOV R1,23H ;剩下为处理小时
CJNE R1,#17H,J3 ;小时不为23,则加一
MOV 23H,#00H ;小时为23,则清零
JMP L12
J3: MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
JMP L12
L12: LCALL DISP
LCALL DISP
LCALL KEY ;判断有无键按下
JZ L12
LJMP LX
L3: SETB EA ;开中断
CLR 24H
RET
;延时10mS
DELAY: MOV R7,#14H ;1周期
TM: MOV R6,#0FFH ;1
TM1: DJNZ R6,TM1 ;2
DJNZ R7,TM ;2
RET ;2
;1+[1+(2*255)+2]*20+2=10.263ms
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -