我给个程序你参考一下
程序:
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar key=16,key_t=16;
sbit duan=P2^0;
sbit wei=P2^1;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //共阴数码管段选码表,无小数点
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void delay(uint ms)
{
uchar i;
while(ms--)
for(i=0;i<110;i++);
}
void key_tst()
{
uchar kess;
if(P1!=0xf0)
delay(5);
if(P1!=0xf0)
{
P1=0x0f;
delay(3);
kess=P1^0x0f; //P1口的状态导或上0x0f,如果下了高4位不管,看低4位是多少
switch (kess)
{
case 1:key=0; break;
case 2:key=1; break;
case 4:key=2; break;
case 8:key=3; break;
default: key = 16;
}
P1=0xf0;
delay(1);
kess=P1>>4^0x0f;
switch (kess)
{
case 1:key+=12;break;
case 2:key+=8; break;
case 4:key+=4; break;
case 8:key+=0; break;
default: key = 16;
}
}
}
void main()
{
P0=0x00;
while(1)
{
key_tst();
P0=table[key];
duan=1;
duan=0;
P0=0x7f;
wei=1;
wei=0;
delay(2);
}
}
我记得矩阵键盘不是你这样扫描的吧,得先扫描行(列),然后扫描列(行),综合得到是哪个键按下吧。并不是一个扫描就行的啊。。。。。。。。
这个不调还真不知道,建议把key改为int型试下。
逻辑上应该没错的。
刚刚我把你的程序下载到得我的PROTUSE键盘扫描电路里面仿真了一下,程序没有问题,肯定是你硬件电路的问题。在我这没有出现你所说的问题。如果你是用开发板仿真的估计是键盘的问题吧,如果是用PROTUES仿真的那估计是你的BUTTON有问题!