51单片机1到99的显示程序是否正确

来源:百度知道 编辑:UC知道 时间:2024/05/18 01:14:17
org 0000h
next:mov 30h,#00h
mov 31h,#00h
mov r0,#9h
loop:clr p2.0
setb p2.1
mov a,30h
mov dptr,#tab
movc a,@a+dptr
mov p0,a
lcall delay
inc 30h
mov a,#00h
mov a,31h
clr p2.1
setb p2.0
mov dptr,#tab
movc a,@a+dptr
mov p0,a
mov a,#00h
lcall delay
djnz r0,loop
mov 30h,#00h
inc 31h
cjne r1,#10,loop
sjmp next
delay:mov r3,#02h
loop3:mov r4,#0fah
djnz r4,$
djnz r3,loop3
ret
tab:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6FH
end

总体没有什么致命的问题,有几个地方改动一下:
(1)mov dptr,#tab命令只需要在开始的时候执行一次就行了。
(2)扫描的延时太长了一般一层循环且初值为30H足够了。
(3)点亮一位应该在字形码送完后执行
(4)mov a,#00H可用clr a代替
再提点建议:
0~99显示其实只需要一个字节作计数,拆位时只要用DIV就行了。比如:
mov a,30H
mov b,#10
div ab
mov 31H,a
mov 32H,b
这样30H单元中的十位和个位分别就到31H、32H中了,不需要考虑进位了。
末尾加一段:
mov a,#99
cjne a,30H,loop
mov 30H,#0
sjmp loop
就能完成循环了。