單片機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
|