关于数码管的基础问题,求助!
类似程序
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
ACALL LOOP1
AJMP MAIN
LOOP1:
MOV DPTR,#TAB
MOV R0,#00H
MOV R1,#00H
LOOP2:
MOV P1,R0 ;P0显示位址
MOV A,R1
MOVC A,@A+DPTR
MOV P0,A ;P1显示段码
ACALL DELAY
MOV P0,#00H
INC R0
INC R1
CJNE R0,#08,LOOP2
RET
DELAY: MOV R6,#5
DD1: MOV R7,#10
DD2: DJNZ R7,DD2
DJNZ R6,DD1
RET
TAB: DB 03FH,06H,5BH,4FH,66H,6DH,7DH,07H
END
但是这样的显示效果是数字不能变,如何实现在使用动态显示的前提下,让数字动起来?谢谢各位大神!
程序我就写了,说下思路,首先要定义保存显示字符的变量。例如定义Num1~Num8.八个要显示的数,
然后用动态扫描的方法将Num1~Num8分别显示在八个数码管中。那么如果想改变显示的内容。只需要将要显示的内容保存进Num1~Num8就行了。例如每隔一秒对应的内容加1等。那么就能让数字动起来了。
按照您的提示,我准备做一个两位数的计时器,个位从0到9,再进位到十位,程序如下
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
ACALL LOOP1
AJMP MAIN
LOOP1:
MOV DPTR,#TAB
MOV R0,#00H
MOV R1,#00H
LOOP2:
MOV R4,#01H
MOV P1,R4 ;P1显示位址
MOV A,R0
MOVC A,@A+DPTR
MOV P0,A ;P0显示段码
ACALL DELAY ;短延迟
MOV P0,#00H
LOOP3:
INC R4
MOV P1,R4
MOV A,R1
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY
MOV P0,#00H
ACALL DEL ;长延迟
INC R0
CJNE R0,#0AH,LOOP2
INC R1
CJNE R1,#0AH,LOOP1
RET
DELAY:
MOV R6,#5
DD1:
MOV R7,#10
DD2:
DJNZ R7,DD2
DJNZ R6,DD1
RET
DEL:
MOV R7,#100
D1:
MOV R6,#100
D2:
MOV R5,#100
D3:
DJNZ R5,D3
DJNZ R6,D2
DJNZ R7,D1
RET
TAB: DB 03FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
可以勉强实现动态显示,但是显示亮度低,还有闪烁的效果,十位一直是零,请问是什么问题?谢谢!
显示亮度低,闪烁是因为你程序里面延时太多了,数码管扫描速度不够快。十位一直是0是因为你CJNE R1,#0AH,LOOP1 这条命令错了,跳错地方了了。跳到LOOP1,个位十位都被清零了。
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
ACALL LOOP1
AJMP MAIN
LOOP1:
MOV DPTR,#TAB
MOV R0,#00H
MOV R1,#00H
MOV R3,#00H
LOOP2:
MOV R4,#00H
MOV P1,R4 ;P1显示位址
MOV A,R0
MOVC A,@A+DPTR
MOV P0,A ;P0显示段码
ACALL DELAY ;短延迟
MOV P0,#00H
LOOP3:
INC R4
MOV P1,R4
MOV A,R1
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY
MOV P0,#00H
INC R3
CJNE R3,#50,LOOP2 ;长延迟
INC R0
MOV R3,#00H
CJNE R0,#0AH,LOOP2
MOV R0,#00H
INC R1
CJNE R1,#0AH,LOOP2
RET
DELAY:
MOV R7,#100
DD1:
MOV R6,#50
DD2:
DJNZ R6,DD2
DJNZ R7,DD1
RET
TAB: DB 03FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
基本功能可以实现了,还有小问题,我去自己修正,谢谢您!