我是菜鸟,不是很懂,但是一定要弄明白,希望高手能给我指点,3Q!
$INCLUDE (C8051F020.INC)
;P1口输出BCD码, P2口的0,1,2,3输出位地址数据
;----------------------------------------------
;程序从0000H单元开始
org 0000h
ljmp ks
;------------------------------------------
;设置中断跳转程序地址入口
org 000bh;T0定时中断0入口地址
ljmp ds0zd;跳转到T0中断程序
org 0013h;INT1中断入口地址
ljmp zd1;跳到INT1中断程序
org 001bh;T1中断入口地址
ljmp ds1zd;跳到定时中断1程序
;-------------------------------------------
;主程序开始设置各个寄存器和初始值,使之按一定的要求来完成
ks:
MOV OSCXCN,#60H
mov wdtcn,#0deh
mov wdtcn,#0adh
mov xbr0,#04h
mov xbr1,#1eh
mov xbr2,#40h
mov p0mdout,#0ffh
mov p1mdout,#0ffh;两口复位
mov p2mdout,#0ffh
mov p3mdout,#0ffh
mov ckcon,#08h
WAIT: mov a,oscxcn
jnb acc.7,WAIT
mov r0,#00h
mov r1,#00h
mov r2,#00h
mov r3,#00h
mov r4,#00h
mov r5,#00h
mov r6,#00h
mov r7,#00h
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,#8fh;中断0,1定时中断0,1开
mov tcon,#50h;定时器开始工作
;-------------------------------------------------
;显示程序开始
xscx00:;显示程序,将需要显示的位数和需要显示的数据起始地址写入再将BCD码表写入dptr
mov a,#00h
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,#01h;将第一位传到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
;---------------------------------------------
;-------------------------------------------------
;INT1中断子程序(用于调整小时)设置时用INT1中断
zd1:;调小时
push psw
pop psw
reti
;--------------------------------------------------
;T0中断子程序开始
;产生秒信号
ds0zd:;主中断程序(时基)
djnz 10h,zhou;中内容不等于0走(等0产生10ms信号)
mov 10h,#64h;重装10H
djnz 11h,zhou;中的内容不等0 走(等0产生1 秒钟信号)
mov 11h,#24h;重装11h
;mov c,p1.7;产生秒闪动
;cpl c
;mov p1.7,c
;--------------------------------------------
;秒信号寄存器R2为秒钟个位, R3为秒钟十位
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
;-------------------------------------------
;分钟信号寄存器 R4分钟个位 ,R5分钟十位
inc r4;分钟个位加1
cjne r4,#0ah,zhou;分个位是否够10 不走
mov r4,#00h;重装14h
inc r5;分钟十位加1
cjne r5,#06h,zhou;是否够60分钟 不 走
mov r5,#00h
;-------------------------------------------
;小时数据寄存器, R6个位, R7十位
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
;T0中断结束
;------------------------------------------------
;T1中断开始主要功能为 对表和设置定闹时间
ds1zd:;功能设置(对表,设置定闹时间)
push psw
pop psw
reti
;T1中断结束, 设置完成
;-------------------------------------------------
;24小时制处理子程序(将显示时间调整为24 小时制)
culi:;24小时制处理子程序
cjne r7,#02h,zguo;判断是否为20小时以上若不是 子程序过
cjne r6,#04h,zguo;判断是否为24小时,若是回来
mov r7,#00h
mov r6,#00h
ret
zguo:
ret
;-----------------------------------------------
;延时子程序,共延时约100ms
ys0:;延时约100ms
mov b,#0FFh;0ffh
ys01:
djnz b,ys01
ret
;------------------------------------------------
;共阳BCD码表从0 到9
zb0:;共阳BCD码表
db 40h,11110010B,88h,10100000B,32h,24h,04h,11110000B,00h,20h
end
;全部结束