利用8位数码管显示时间,原理与4位数码管显示的基本一样
仿真图:
程序源代码:
本程序已经通过在线软件仿真和硬件制作.
org0000h;程序开始入口地址
sjmpmain;跳转至主程序
org000bh;T0中断入口地址
ljmpinti0;跳转至T0中断程序
org001bh;T1中断入口地址
ljmpinti1;跳转至T1中断程序
org0030h
main:movtmod,#11h;设T0、T1为模式1
movie,#8ah;开T0、T1允许中断
movth0,#4ch;赋T050ms初值
movtl0,#00h
movth1,#4ch;赋T150ms初值
movtl1,#00h
movsp,#60h;设置堆栈指针
mov38h,#00;闹钟分初值
mov39h,#00;闹钟时初值
mov31h,#00;时间秒初值
mov32h,#00;时间分初值
mov33h,#00;时间时初值
setbtr0;启动定时器T0
setbtr1;启动定时器T1
loop:lcalldisplay;调用时间显示程序
lcallkeysan;调用时间调节按钮
lcallkeynz;调用闹钟控制按钮
ajmploop
inti0:pushpsw;压入堆栈指针,保护现场
pushacc
clrea;关中断www.dgzj.com
movth0,#4ch;重赋T0定时初值
movtl0,#00h
inc3ah;3ah为50ms计数单元
mova,3ah
cjnea,#20,out;1秒计数是否到
mov3ah,#00;清50ms计数初值
inc31h;秒加1
mova,31h
cjnea,#60,out;60秒计数是否到
mov31h,#00
inc32h;分加1
mova,32h
cjnea,#60,out;60分计数是否到
mov32h,#00
inc33h;时加1
mova,33h
cjnea,#24,out;24时计数是否到
mov33h,#00
out:setbea;开中断
popacc;弹出堆栈指针,恢复现场
poppsw
reti;中断返回
inti1:pushpsw;压入堆栈指针,恢复现场
pushacc
clrea
movth1,#4ch;重赋T1定时初值
movtl1,#00h
inc71h;71h为50ms计数单元
mova,71h
cjnea,#20,out1
mov71h,#00
mova,32h;闹钟判断
cjnea,38h,out1;闹钟时间分判断
mova,33h
cjnea,39h,out1;闹钟时间时判断
clrp1.0;到闹钟时间,清p1.0
out1:setbea;开中断
popacc
poppsw
reti;中断返回
display:mova,31h;秒显示
movb,#10
pab
mov20h,a;将十位放入20h单元
mov21h,b;将个位、余数放入21h单元
disp1:mova,20h;秒十位显示
movdptr,#table
movca,@a+dptr;将A的内容+table内容,结果回存给A
movp0,a;将A给P0口
clrp2.6;清p2.6,点亮第7位数码管
lcalldel1ms;调用1ms延时子程序
setbp2.6;灭第7位数码管
disp2:mova,21h;秒个位显示
movdptr,#table
movca,@a+dptr
movp0,a
clrp2.7
lcalldel1ms
setbp2.7
disp4:mova,32h;分显示
movb,#10
pab
mov22h,a
mov23h,b
disp5:mova,22h;分十位显示
movdptr,#table
movca,@a+dptr
movp0,a
clrp2.3
lcalldel1ms
setbp2.3
disp6:mova,23h;分个位显示
movdptr,#table
movca,@a+dptr
movp0,a
clrp2.4
lcalldel1ms
setbp2.4
disp7:mova,33h;时显示
movb,#10
pab
mov24h,a
mov25h,b
disp8:mova,24h;时十位显示
movdptr,#table
movca,@a+dptr
movp0,a
clrp2.0
lcalldel1ms
setbp2.0
disp9:mova,25h;时个位显示
movdptr,#table
movca,@a+dptr
movp0,a
clrp2.1
lcalldel1ms
setbp2.1
disp10:mov34h,#0bfh;"-"显示
mova,34h
movp0,a
clrp2.5
lcalldel1ms
setbp2.5
disp11:mov35h,#0bfh;"-"显示
mova,35h
movp0,a
clrp2.2
lcalldel1ms
setbp2.2
ret
display1:mova,38h;闹钟分显示
movb,#10
pab
mov26h,a
mov27h,b
d1:mova,26h;闹钟分十位显示
movdptr,#table
movca,@a+dptr
movp0,a
clrp2.3
lcalldel1ms
setbp2.3
d2:mova,27h;闹钟分个位显示
movdptr,#table
movca,@a+dptr
movp0,a
clrp2.4
lcalldel1ms
setbp2.4
dispnz:mova,39h;闹钟时显示
movb,#10
pab
mov28h,a
mov29h,b
d5:mova,28h;闹钟时十位显示
movdptr,#table
movca,@a+dptr
movp0,a
clrp2.0
lcalldel1ms
setbp2.0
d6:mova,29h;闹钟时个位显示
movdptr,#table
movca,@a+dptr
movp0,a
clrp2.1
lcalldel1ms
setbp2.1
mov35h,#0bfh;"-"显示
mova,35h
movp0,a
clrp2.2
lcalldel1ms
setbp2.2
ret
table:db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h;数字0—9
del1ms:movr7,#10;1ms延时子程序
del1:movr6,#50
del2:djnzr6,del2
djnzr7,del1
ret
del20ms:movr5,#40;20ms延时子程序
del3:movr4,#250
del4:djnzr4,del4
djnzr5,del3
ret
keysan:jnbp3.1,key1;秒加1按钮
jnbp3.2,key2;分加1按钮
jnbp3.3,key3;时加1按钮
sjmpkeyout
key1:lcalldel20ms
jbp3.1,keyout
jnbp3.1,$
inc31h;秒加1
mova,31h
cjnea,#60,keyout
mov31h,#00
sjmpkeyout
key2:lcalldel20ms
jbp3.2,keyout
jnbp3.2,$
inc32h;分加1
mova,32h
cjnea,#60,keyout
mov32h,#00
sjmpkeyout
key3:lcalldel20ms
jbp3.3,keyout
jnbp3.3,$
inc33h;时加1
mova,33h
cjnea,#24,keyout
mov33h,#00
sjmpkeyout
keyout:ret
keynz:jnbp3.4,keynz4;显示闹钟并可修改和显示当前时间
jnbp3.7,keynz5
jnbp3.5,nz3
jnbp3.6,nz4
sjmpnzout
nzout:ret
nz2:lcalldisplay1
jnbp3.5,nz3
jnbp3.6,nz4
keynz4:jnbp3.4,nz2
sjmpnzout
nz3:lcalldel20ms
jbp3.5,nzout
jnbp3.5,$
inc38h
mova,38h
cjnea,#60,nzout
mov38h,#00
sjmpnzout
nz4:lcalldel20ms
jbp3.6,nzout
jnbp3.6,$
inc39h
mova,39h
cjnea,#24,nzout
mov39h,#00
sjmpkeyout
keynz5:jbp3.7,nzout
jnbp3.7,$
setbp1.0
sjmpnzout
end