电子钟程序。
利用定时器T0定时,模拟24小时走时的电子钟,时、分、秒以BCD码形式依次存放在3CH、3BH、3AH;38H、39H作为软件计数器。
选择T0工作于定时、方式2、定时时间为500s。TMOD=0000 0010B=02H
计算初值
fosc=6MHz 机器周期TM=2 s
要定时500 s 即要计数250个机器周期脉冲
初值=28-250=6=06H
ORG 0000H ;主程序入口
LJMP CLOCK ;转主程序初始化
ORG 000BH ;T0中断入口
LJMP TP0 ;转T0中断服务程序
ORG 0030H ;主程序初始化程序
CLOCK:MOV SP,#6FH ;设栈底指针
MOV A,#89H;8255的A口、B口为输出
MOV DPTR,#0FEFFH;指向8255控制口
MOVX @DPTR,A ;将控制字写入控制寄存器
MOV TMOD,#02H ;T0定时方式2
MOV TL0,#06H ;定时(256—6)*2=500微秒
MOV TH0,#06H
MOV 38H,#200 ;软件计数单元初值
MOV 39H,#10
SETB EA ;中断总允许
SETB ET0 ;允许T0中断
SETB TR0 ;启动T0工作
MOV 3AH,#0 ;时间初值
MOV 3BH,#0
MOV 3CH,#0 ;<根据需要设置>
LOOP: LCALL CZ ;调用拆字子程序
LCALL DISP ;调用显示子程序
SJMP LOOP ;反复循环主流程
TP0:PUSH ACC ;T0 500微秒中断服务程序
PUSH PSW ;保护现场
DJNZ 38H,DONE ;每500微秒减1,满0.1秒?
MOV 38H,#200
DJNZ 39H,DONE ;每0.1秒加1,满1S?
MOV 39H,#10
MOV A,3AH ;秒单元(按BCD码)加1
ADD A,#1
DA A
MOV 3AH,A
CJNE A,#60H,DONE ;满1分钟?
MOV 3AH,#0 ;秒单元清零
MOV A,3BH ;分钟单元(按BCD码)加1
ADD A,#1
DA A
MOV 3BH,A
CJNE A,#60H,DONE ;满1小时?
MOV 3BH,#0 ;分钟单元清零
MOV A,3CH ;小时单元(按BCD码)加1
ADD A,#1
DA A
MOV 3CH,A
CJNE A,#24H,DONE ;满24小时?
MOV 3CH,#0 ;小时单元清零
DONE:POP PSW
POP ACC ;恢复现场
RETI ;中断返回
CZ:MOV R0,#3AH ;拆字子程序
MOV R1,#30H ;30H~36H为显示缓冲单元
CZ1:MOV A,@R0
ANL A,#0FH
MOV @R1,A
INC R1
MOV A,@R0
ANL A,#0F0H
SWAP A
MOV @R1,A
INC R0
INC R1
CJNE R0,#3DH,CZ1
RET
DISP:MOV R0,#30H;显示缓冲单元首地址
MOV R3,#01H ;字位码初值(从最右位起)
MOV A,R3
DISP1:MOV DPTR,#0FEFDH ;8255B口(字位码输出口)
MOVX @DPTR,A ;输出字位码
MOV DPTR,#0FEFCH ;8255A口(字段码输出口)
MOV A,@R0 ;取显示数据码
ADD A,#TAB-NPC ;加TAB与NPC差值
MOVC A,@A+PC ;查表得相应字段码
NPC:MOVX @DPTR,A ;输出字段码
INC R0 ;指向下一显示缓冲单元
MOV A,R3 ;取出字位码
JB ACC.5,DISP2 ;判已显示6位否
RL A ;未完,字位码左移1位
MOV R3,A;回存新字位码
SJMP DISP1 ;转下一位显示
DISP2:RET
TAB:DB 0C0H,0F9H,. . . ,90H;0-9 字段码表
D1MS:MOV R7,#250 ;延时1毫秒子程序
DJNZ R7,$
RET
LCALL D1MS ;保持显示1毫
利用定时器T0定时,模拟24小时走时的电子钟,时、分、秒以BCD码形式依次存放在3CH、3BH、3AH;38H、39H作为软件计数器。
选择T0工作于定时、方式2、定时时间为500s。TMOD=0000 0010B=02H
计算初值
fosc=6MHz 机器周期TM=2 s
要定时500 s 即要计数250个机器周期脉冲
初值=28-250=6=06H
ORG 0000H ;主程序入口
LJMP CLOCK ;转主程序初始化
ORG 000BH ;T0中断入口
LJMP TP0 ;转T0中断服务程序
ORG 0030H ;主程序初始化程序
CLOCK:MOV SP,#6FH ;设栈底指针
MOV A,#89H;8255的A口、B口为输出
MOV DPTR,#0FEFFH;指向8255控制口
MOVX @DPTR,A ;将控制字写入控制寄存器
MOV TMOD,#02H ;T0定时方式2
MOV TL0,#06H ;定时(256—6)*2=500微秒
MOV TH0,#06H
MOV 38H,#200 ;软件计数单元初值
MOV 39H,#10
SETB EA ;中断总允许
SETB ET0 ;允许T0中断
SETB TR0 ;启动T0工作
MOV 3AH,#0 ;时间初值
MOV 3BH,#0
MOV 3CH,#0 ;<根据需要设置>
LOOP: LCALL CZ ;调用拆字子程序
LCALL DISP ;调用显示子程序
SJMP LOOP ;反复循环主流程
TP0:PUSH ACC ;T0 500微秒中断服务程序
PUSH PSW ;保护现场
DJNZ 38H,DONE ;每500微秒减1,满0.1秒?
MOV 38H,#200
DJNZ 39H,DONE ;每0.1秒加1,满1S?
MOV 39H,#10
MOV A,3AH ;秒单元(按BCD码)加1
ADD A,#1
DA A
MOV 3AH,A
CJNE A,#60H,DONE ;满1分钟?
MOV 3AH,#0 ;秒单元清零
MOV A,3BH ;分钟单元(按BCD码)加1
ADD A,#1
DA A
MOV 3BH,A
CJNE A,#60H,DONE ;满1小时?
MOV 3BH,#0 ;分钟单元清零
MOV A,3CH ;小时单元(按BCD码)加1
ADD A,#1
DA A
MOV 3CH,A
CJNE A,#24H,DONE ;满24小时?
MOV 3CH,#0 ;小时单元清零
DONE:POP PSW
POP ACC ;恢复现场
RETI ;中断返回
CZ:MOV R0,#3AH ;拆字子程序
MOV R1,#30H ;30H~36H为显示缓冲单元
CZ1:MOV A,@R0
ANL A,#0FH
MOV @R1,A
INC R1
MOV A,@R0
ANL A,#0F0H
SWAP A
MOV @R1,A
INC R0
INC R1
CJNE R0,#3DH,CZ1
RET
DISP:MOV R0,#30H;显示缓冲单元首地址
MOV R3,#01H ;字位码初值(从最右位起)
MOV A,R3
DISP1:MOV DPTR,#0FEFDH ;8255B口(字位码输出口)
MOVX @DPTR,A ;输出字位码
MOV DPTR,#0FEFCH ;8255A口(字段码输出口)
MOV A,@R0 ;取显示数据码
ADD A,#TAB-NPC ;加TAB与NPC差值
MOVC A,@A+PC ;查表得相应字段码
NPC:MOVX @DPTR,A ;输出字段码
INC R0 ;指向下一显示缓冲单元
MOV A,R3 ;取出字位码
JB ACC.5,DISP2 ;判已显示6位否
RL A ;未完,字位码左移1位
MOV R3,A;回存新字位码
SJMP DISP1 ;转下一位显示
DISP2:RET
TAB:DB 0C0H,0F9H,. . . ,90H;0-9 字段码表
D1MS:MOV R7,#250 ;延时1毫秒子程序
DJNZ R7,$
RET
LCALL D1MS ;保持显示1毫