目的:使用51單片機P0口驅動共陽數碼管實現8路搶答器,上電默認顯示0,然后1-8按鍵被按下就顯示該數值,且后續任何按鍵按下無效,按復位鍵從來。問題:代碼1剛上電,數碼管無任何顯示。。;1-8按鍵功能正常。
問題分析:通過KEIL調試發現初始化A=00,1:LOOP行完后A是0XC0,P0是0XC0(顯示數字0);2:第一輪結束然后跳轉到LOOP執行完后A變成0X00(TABLE【192的偏移地址是多少?越界了所以是0X00】),P0又變為00(顯示數字0.),然后程序不斷循環1、2
解決方案:讓循環發生在P0賦值0之后、或者每次循環都重新賦值P0為0,代碼B就是讓循環發生在P0賦值之后,這樣P0端口在沒有按鍵按下的時間都是固定值(循環前被賦值MOV P0,A)
代碼A:
KEY2 BIT P2.1
KEY3 BIT P2.2
KEY4 BIT P2.3
KEY5 BIT P2.4
KEY6 BIT P2.5
KEY7 BIT P2.6
KEY8 BIT P2.7
ORG 00H
MAIN:
MOV A,#00
MOV DPTR,#TABLE
LOOP:
MOVC A,@A+DPTR
MOV P0,A
KEYA:JB KEY1,KEYB
MOV A,#1
MOVC A,@A+DPTR
MOV P0,A
JMP $
KEYB:JB KEY2,KEYC
MOV A,#2
MOVC A,@A+DPTR
MOV P0,A
JMP $
KEYC:JB KEY3,KEYD
MOV A,#3
MOVC A,@A+DPTR
MOV P0,A
JMP $
KEYD:JB KEY4,KEYE
MOV A,#4
MOVC A,@A+DPTR
MOV P0,A
JMP $
KEYE:JB KEY5,KEYF
MOV A,#5
MOVC A,@A+DPTR
MOV P0,A
JMP $
KEYF:JB KEY6,KEYG
MOV A,#6
MOVC A,@A+DPTR
MOV P0,A
JMP $
KEYG:JB KEY7,KEYH
MOV A,#7
MOVC A,@A+DPTR
MOV P0,A
JMP $
KEYH:JB KEY8,LOOP
MOV A,#8
MOVC A,@A+DPTR
MOV P0,A
JMP $
TABLE:DB 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8
DB 0x80,0x90,0x88,0x83,0xC6,0xa1,0x86,0x8e
END
/***********************/
代碼B:
KEY2 BIT P2.1
KEY3 BIT P2.2
KEY4 BIT P2.3
KEY5 BIT P2.4
KEY6 BIT P2.5
KEY7 BIT P2.6
KEY8 BIT P2.7
ORG 00H
MAIN:
MOV A,#00
MOV DPTR,#TABLE
LOOP:
MOVC A,@A+DPTR
MOV P0,A
KEYA:JB KEY1,KEYB
MOV A,#1
MOVC A,@A+DPTR
MOV P0,A
JMP $
KEYB:JB KEY2,KEYC
MOV A,#2
MOVC A,@A+DPTR
MOV P0,A
JMP $
KEYC:JB KEY3,KEYD
MOV A,#3
MOVC A,@A+DPTR
MOV P0,A
JMP $
KEYD:JB KEY4,KEYE
MOV A,#4
MOVC A,@A+DPTR
MOV P0,A
JMP $
KEYE:JB KEY5,KEYF
MOV A,#5
MOVC A,@A+DPTR
MOV P0,A
JMP $
KEYF:JB KEY6,KEYG
MOV A,#6
MOVC A,@A+DPTR
MOV P0,A
JMP $
KEYG:JB KEY7,KEYH
MOV A,#7
MOVC A,@A+DPTR
MOV P0,A
JMP $
KEYH:JB KEY8,KEYA
MOV A,#8
MOVC A,@A+DPTR
MOV P0,A
JMP $
TABLE:DB 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8
DB 0x80,0x90,0x88,0x83,0xC6,0xa1,0x86,0x8e
END
|