ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INTE0
ORG 000BH
AJMP CLOCK
ORG 0013H
AJMP INTE1
ORG 0030H
MAIN:
MOV SP,#60H
MOV 25H,#0AH ;装入中断次数
CLR A
MOV P1,A
MOV P2,A
MOV 26H,A ;秒单元清零
MOV 27H,A ;分单元清零
MOV 28H,A ;时单元清零
MOV IE,#87H ;开放中断
SETB IT0 ;采用边缘触发
SETB IT1
MOV TMOD,#01H ;设定时器T0为主式1
MOV TL0,#0B2H ;给初值
MOV TH,,#3CH
SETB TR0 ;启动定时器
HERE:ACALL DISPLAY ;调显示
SJMP
;&&&&&&&&&&&&
;&& 显示子程序 &&
;&&&&&&&&&&&&
DISPLAY:
MOV R0,#4FH ;设置显存初值,放置秒位低四位
MOV A,26H ;先分离秒位单元
ACALL SEPAR ;调用数据分离子程序
MOV A,27H ;分离分位单元
ACALL SEPAR
ACALL A,28H ;分离时位单元
ACALL SEPAR
MOV R0,#4AH ;给缓冲单元值
MOV R2,#01H ;左边的第一位开始显示
MOV DPTR,#SEGT
DSLP1:MOV A,#00H ;关闭原先的显示字符
MOV P1,A ;关闭字符送P1口
MOV A,@R0 ;取出缓冲单元的值
MOVC A,@A+DPTR ;查表取值
MOV P1,A ;结果送P1口
MOV A,R2 ;位选送A
MOV P2,A ;位选送P2口
MOV P2,A
MOV R4,#02H
MOV R3,#00H ;大概延时1毫秒
DSLP2:DJNZ R3,DSLP2
INC R0 ;准备下一个显示单元
MOV A,R2
JB ACC.5,EXIT1 ;6位显示完则退出
RL A ;未完则左移一位
MOV R2,A ;移位后再回送R2
AJMP DSLP1 ;显示下一位
EXIT1:RET ;返回
SEPAR: ;数据分离子程序
MOV R1,A ;取出存值
ACALL SPAR1 ;先分离低四位
MOV A,R1 ;分离高四位
SWAP A
SEPAR1:ANL A,#0FH
MOV @R0,A ;分离值送给显示缓冲
DEC R0
RET
SEGT:
DB 0BFH,86H,0DBH,0CFH,0E6H
DB 0EDH,0FDH,87H,0FFH,0EFH
RET
;@@@@@@@@@@@@@@@@
;@@ 定时器计时中断入口 @@
;@@@@@@@@@@@@@@@@
CLOCK: PUSH PSW ;保护现场
PUSH ACC
MOV TL0,#0B2H ;重新赋初值
MOV TH0,#3CH
DJNZ 25H,RETUNT ;1秒到了吗?
MOV 25H,#0AH ;重新赋1秒记时初值
MOV A,#01H
MOV A,26H ;1秒到了则加1
DA A ;十进制调整
MOV 26H,A ;调整后给26H单元
CJNE A,#60H,RETNT ;60秒到了吗?
MOV 26H,#00H ;秒单元清零
MOV A,#01H ; 分单元加1
ADD A,27H
DA A ;分十进制调整
MOV 27H,A ;调整后给27H单元
CJNE A,#60H,RETUNT ;60分到了吗?
MOV 27H,#00H ;分单元清零
MOV A,#01H ;时单元加1
ADD A,28H
DA A ;时十进制调整
MOV 28H,A ;调整后给28H单元
CJNE A,#24H,RETUNT ;24小时到了吗?
MOV 28H,#00H ;24小时清零
RETUNT: POP ACC ;恢复现场
POP PSW
RETI
;@@@@@@@@@@@@@@@
;@@ 调分中断服务程序 @@
;@@@@@@@@@@@@@@@
INTE0:
PUSH ACC ;保护现场
CLR TR0
CLR EX0 ;关中断
ACALL DISPLAY ;用显示来消抖
ACALL DISPLAY
JB P3.2,EXIT2 ;如果消抖后为1则退出
MOV A,#01H ;不为高电平则分单元加1
ADD A,27H
DA A ;十进制调整
MOV 27H,#00H ;调整后回送给27H单元
CLR C
EXIT2:SETB EX0 ;开中断
POP ACC ;恢复现场
SETB TR0 ;开定时
RETI
;######################
;## 调用中断程序 ##
;######################
INTE1:
PUSH ACC ;保护现场
CLR TR0
CLR EX0 ;关中断
ACALL DISPLAY ;用显示来消抖
ACALL DISPLYA
JB P3.3,EXIT3 ;如果消抖后为1则退出
MOV A,#01H ;不为高电平则分单元加1
ADD A,28H
DA A ;十进制调整
MOV 28H,A ;调整后回送给28H单元
CJNE A,#24H,EXIT3 ;调整后为24吗?
MOV 28H,#00H ;是则清零
CLR C
EXIT3:SETB EX0 ;开中断
POP ACC ;恢复现场
SETB TR0 ;开定时
RETI
END
我hyw322@163.com发给你