我用了三位数码管显示0-999,但目前只能显示到0-255。
因为temp最大值为FFH,如果要显示大于255我要如何改???
程序如下:
a_bit equ 20h ;数码管个位数存放内存位置
b_bit equ 21h ;数码管十位数存放内存位置
temp equ 22h ;计数器数值存放内存位置
bai equ 30h
ORG 00H
star: mov temp,#0 ;初始化计数器,从0开始
stlop: acall display;调用显示子程序
inc temp;对计数器加1
mov a,temp
cjne a,#255,next ;判断计数器是否满100?
mov temp,#0;满100就清零重新开始
INC 31H
MOV R2,31H
CJNE R2,#10,NEXT;100*10=1000
MOV 31H,#00
next: ljmp stlop;不满就循环执行
;显示子程序
display: mov a,temp ;将temp中的十六进制数转换成10进制
mov b,#100 ;10进制/100=10进制
div ab;百位在ACC中
mov bai,a;先将百位送入
MOV A,B;将十位和个位送入ACC中
MOV B,#10
DIV AB
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
mov dptr,#numtab ;指定查表启始地址
mov r0,#25
dpl1: mov r1,#25 ;
dplop: mov a,a_bit ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
mov p1,a ;送出个位的7段代码
clr p3.5 ;开个位显示
acall d1ms ;显示162微秒
setb p3.5;关闭个位显示,防止鬼影
mov a,b_bit ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
mov p1,a ;送出十位的7段代码
clr p3.6 ;开十位显示
acall d1ms ;显示162微秒
setb p3.6;关闭十位显示,防止鬼影
MOV A,bai;取百位送入A中
MOVC A,@A+DPTR
MOV P1,A
CLR P3.7;Show百位
LCALL D1ms
SETB P3.7
djnz r1,dplop ;循环执行125次
djnz r0,dpl1 ;循环执行150X25=1000次
ret
;2+2X80=162微秒,延时按12MHZ计算
D1MS: MOV R7,#80
DJNZ R7,$
RET
numtab: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
end |