初学者:请各位朋友看看我写的这段时钟程序,由于是刚刚学写,里面一定有不少了错误和书写问题,请朋友们指点改进,在下先谢谢了这是一个24小时制时钟程序,4 个LED 数码管 P1口输出BCD码,P2口的0,1 ,2,3输出位
动,我用的是 6M晶体 ; 还请朋友们指点迷津 在下先谢谢朋友了
程序如下:
org 0000h
ljmp ks
org 000bh;T0定时中断0入口地址
ljmp ds0zd;跳转到T0中断程序
ks:
mov p1,#0ffh;两口复位
mov p2,#0ffh
mov sp,#30h
mov 10h,#14h;T0中断20次(产生10ms信号)14
mov 11h,#64h;产生1秒信号64
mov th0,#06h;设置定时器0的计数初值
mov tl0,#06h
mov th1,#0ffh;设置定时器1的计数初值
mov tl1,#0ffh
mov tmod,#0e2h;将T0设置为内定时,工作方式2;T1设置为外计数,工作方式2
mov ip,#02h;将定时器0的优先级设置为1
mov ie,#02h;中断0,1定时中断0,1开
mov tcon,#50h;定时器开始工作
xscx00:;显示程序,将需要显示的位数和需要显示的数据起始地址写入再将BCD码表写入DPTR
mov r0,#04h;将要显示数据的起始地址写入R0(这里是从分钟开始)
mov dptr,#zb0;将LED码表写入DPTR
mov r1,#04h;将所需要的显示位数写入R1
xscx01:
mov a,@r0;将数据传到A
movc a,@a+dptr;将所需要显示的BCD码写入A
mov p1,a;将BCD码传到P1口
mov a,p2;将位地址读入A
cjne a,#0ffh,guo;检查位地址是0ffh,若不是则跳过,若是运行下一步
mov p2,#0feh;将第一位传到P2口
ljmp tiaoguo;跳转到tiaoguo
guo:
rl a;A中内容左移一位
mov p2,a;将位地址传出到P2口
tiaoguo:
lcall ys0
inc r0
djnz r1,xscx01
mov p2,#0ffh
ljmp xscx00
ds0zd:;主中断程序(时基)
djnz 10h,zhou;中内容不等于0走(等0产生10ms信号)
mov 10h,#14h;重装10H
djnz 11h,zhou;中的内容不等0 走(等0产生1 秒钟信号)
mov 11h,#64h;重装11h
mov c,p1.7;产生秒闪动
cpl c
mov p1.7,c
inc r2;l加1 秒(秒个位加1)
cjne r2,#0ah,zhou;秒个位不够 10 走
mov r2,#00h;重装12h
inc r3;秒十位加1
cjne r3,#06h,zhou;是否够 60秒 不 走
mov r3,#00h;重装13h
inc r4;分钟个位加1
cjne r4,#0ah,zhou;分个位是否够10 不走
mov r4,#00h;重装14h
inc r5;分钟十位加1
cjne r5,#06h,zhou;是否够60分钟 不 走
mov r5,#00h
inc r6;小时个位加1
lcall culi;跳转到;24小时制处理子程序
cjne r6,#0ah,zhou;小时个位是否为10 不 走
mov r6,#00h;重装r4
inc r7;小时十位加1
cjne r7,#02h,zhou;
pop psw
zhou:;T0中断结束
reti
culi:;24小时制处理子程序
cjne r7,#02h,zguo;判断是否为20小时以上若不是 子程序过
cjne r6,#04h,zguo;判断是否为24小时,若是回来
mov r7,#00h
mov r6,#00h
ret
zguo:
ret
ys0:;延时约100ms
mov 13h,#01h;0ffh
ys01:
mov 14h,#01h;64
ys02:
djnz 14h,ys02
djnz 13h,ys01
ret
zb0:;共阳BCD码表
db 40h,79h,24h,30h,19h,12h,02h,78h,00h,6fh
end