单片机STC89C52RC,初学驱动数码管,按照思路是先显示一遍0-9,下来就不断循环显示1-9,proteus仿真一切正常,但是把程序烧写到芯片上之后只能显示0-9一次,然后就不显示了。但是删掉 jnb p1.3,Set3 这句,就一切OK了,真是奇怪,求助坛友怎么处理才好
完整程序如下:
ORG 0000H ;ORG伪指令来规定程序的起始地址
LJMP MAIN
ORG 0060H ;数据表:
DB 03FH,0FFH, 03FH,0FEH, 03FH,0FDH, 03FH,0FBH, 03FH,0F7H ;显示设定圈数的数值,两个一组前一数字是字模,后一位数字是显示该字的选通码
DB 03FH,0FFH, 03FH,0EFH, 03FH,0DFH, 03FH,0BFH, 03FH,07FH ;显示实际圈数的数值,前一数字赋值给P0,后一数字赋值给P2,对应的数码管亮一下
DB 03FH, 006H, 05BH, 04FH, 066H, 06DH, 07DH, 007H, 07FH, 06FH ;正置数码管显示0~9, 0-9字模的存储位置
ORG 0100H
MAIN:
mov p1,#0FFh ;初始化P1口,P1外接按键控制显示的数字
call test ;让各数码管从0显示到9以检测显示正常与否
start:
jnb p1.0,SET0 ;如果Bit不是1,跳转到start1
jnb p1.1,Set1 ;如果Bit是1,跳转set2
jnb p1.2,Set2
jnb p1.3,Set3 ;这句删掉就能正常显示
jnb p1.4,Set4
jnb p1.5,Set5
jnb p1.6,Set6
jnb p1.7,Set7
call test
JMP start
SET0:
JMP start
SET1:
JMP start
SET2:
JMP start
SET3:
JMP start
SET4:
JMP start
SET5:
JMP start
SET6:
JMP start
SET7:
JMP start
;======================== test:让所有数码管从0显示到9 ======================================
test:
mov p0,#03Fh ;把数字0的字模送入P0
mov p2,#000h ;设置p2口为低电平,此时所有数码管都显示
mov r1,#074h ; 0-9字模的存储位置,从这个数开始增加,寻找与当前显示的数字对应的数,然后找出下一个数存入显示的位置
different:
mov a,r1
inc R1
MOVC A, @A+DPTR ;把 数据表中的第一个数据读到A里,A中的值就是调试时观察窗口里ACC的值
mov r2,p0
XRL A, r2 ; A与R2中的数据进行异或操作,结果放在A中。异或,相同为“0”,相异为“1”。
jz next ;A中内容为0,说明找到了目前显示的数字的字模,就把下一个字模放到当前位置
jmp different
next:
MOV A,R1 ;否则可以增加数字,R1中的数字作为相对地址寻址找到下一个数字的代码送入P0
MOVC A, @A+DPTR
mov p0,a
MOV R4,#0H
pause:
INC R4
mov A,R4
XRL A, #0FFh ;设置每个数字显示的时间
JZ continue
MOV A,R1
CALL DELAY
MOV R1,A
JMP pause
continue:
mov A,R1
XRL A,#07Eh
jz testOK
jmp different
testOK:
ret
;======================== DELAY: 延时子程序 ===========================
DELAY:
MOV R6,#04H
DL0:
MOV R5,#0F8H
DJNZ R5,$
DJNZ R6,DL0
NOP
RET
END
|