8051单片机时钟程序
发布网友
发布时间:2022-12-24 12:29
我来回答
共1个回答
热心网友
时间:2023-10-09 04:57
org 0000h
ajmp main
org 0030h
main:
mov dptr,#tab
mov 30h,#00h
mov 31h,#00h
mov 32h,#00h
mov 33h,#00h
mov 34h,#00h
mov 35h,#00h
loop:
mov r4,#5
tt1:
lcall display
djnz r4,tt1
lcall update
ajmp loop
display: mov p3,#0h
mov r7,#100
dd1:
mov a,30h
movc a,@a+dptr
mov p1,a
CLR P3.3
CLR P3.4
CLR P3.5
lcall delay100us
mov a,31h
movc a,@a+dptr
mov p1,a ;将要显示的数送入P0口
SETB P3.3
CLR P3.4
CLR P3.5
lcall delay100us ;延时100US
mov a,32h ;将显示缓冲区32H中的值送入ACC
movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
mov p1,a ;将要显示的数送入P0口
SETB P3.3
SETB P3.4
CLR P3.5
lcall delay100us ;延时100US
mov a,33h ;将显示缓冲区33H中的值送入ACC
movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
mov p1,a ;将要显示的数送入P0口
CLR P3.3
CLR P3.4
SETB P3.5
lcall delay100us ;延时100US
mov a,34h ;将显示缓冲区别31H中的值送入A
movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
mov p1,a ;将要显示的数送入P0口
CLR P3.3
SETB P3.4
SETB P3.5
lcall delay100us ;延时100US
mov a,35h ;将显示缓冲区别31H中的值送入A
movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
mov p1,a ;将要显示的数送入P0口
SETB P3.3
SETB P3.4
SETB P3.5
lcall delay100us ;延时100US
djnz r7,dd1 ;R7不等于0返回至DD1处
ret ;R7等于0子程序返回
update: ;刷新显示子程序
inc 30h ;个位显示缓冲单元加一
mov a,30h
cjne a,#10,exit ;还没加到十,退出
mov 30h,#00h ;加到十了,个位清零
inc 31h ;十位显示缓冲单元加一
mov a,31h
cjne a,#6,exit ;还没加到十,退出
mov 31h,#00h ;加到十了,十位清零
inc 32h ;百位显示缓冲单元加一
mov a,32h
cjne a,#10,exit ;还没加到十,退出
mov 32h,#00h ;加到十了,百位清零
inc 33h ;千位显示缓冲单元加一
mov a,33h
cjne a,#6,exit ;还没加到十,退出
mov 33h,#00h ;加到十了,千位清零
inc 34h ;十位显示缓冲单元加一
mov a,34h
cjne a,#10,exit ;还没加到十,退出
mov 34h,#00h ;加到十了,十位清零
inc 35h ;十位显示缓冲单元加一
mov a,35h
cjne a,#10,exit ;还没加到十,退出
mov 35h,#00h ;加到十了,十位清零
exit:
ret ;刷新显示子程序返回
delay100us:
mov r5,#147
djnz r5,$
ret
delay10ms:
mov r6,#100
tt2:
mov r5,#147
djnz r5,$
djnz r6,tt2
ret
tab: db 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0D8H,80H,90H
end