目的:使用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
|