单片机矩阵键盘问题

只有1234能显示,其他键按了无反应。。怎么回事
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
char code tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段定义:0~9
uchar keyscan();
sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)
void delay(uint);
void display(uchar);
void delay1(int);
void main()
{
while(1)
{
keyscan();
}
}
uchar keyscan()
{
uchar h,l,key,num;
P3=0xf0;//11110000
l=P3;
l=l&0xf0;
if(l!=0xf0)
{
delay(100);
if(l!=0xf0)
{
l=P3&0xf0;//11100000
l=l|0x0f; //11101111
P3=l;
h=P3;//11101110
h=h&0x0f;//00001110
l=l&0xf0;//11100000
key=h+l;
}
switch(key)
{
case 0xee:display(1);break;
case 0xde:display(2);break;
case 0xbe:display(3);break;
case 0x7e:display(4);break;
case 0xed:display(5);break;
case 0xdd:display(6);break;
case 0xbd:display(7);break;
case 0x7d:display(8);break;
case 0xeb:display(9);break;
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x--;x>0)
for(y=110;y--;x>0);
}
void delay1(int tValue)
{
int i,j;
for(i=0; i<tValue; i++)
{
for(j=0; j<550; j++);
}
}
void display(uchar num)
{
SMG_g=0;
P0=tab[num];
delay1(2);
}
矩阵键盘的电路图都是和普通的一样的,现在只有4个有反应其他12个没反应

程序是没有问题的,我用仿真和开发板测试的这个程序都是对的,9以上的按键你没有写程序。
如果还不行你最好多翻转几次或者翻转后加一个短延时试试。
再者看看硬件连接对不对追问

你测试了吗,难道我的开发版坏了?
我就是想程序是没问题的啊,意思也对呢

追答

恩 我试了,到9都没问题

追问

我的只有4个按键正常其他的没反应怎么会这样的
我只测试1到9

追答

恩,以前我也有这个问题,原因就是翻转的出现了问题,不知道你是不是这个问题,不过在我开发板上是对的

追问

什么翻转??
告诉我吧,我会采纳的

追答

一句两句的说不清楚,你加我Q吧 314878022

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-12
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
char code tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段定义:0~9
uchar kbscan();
void getkey();
sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)
void delay(uint);
void display(uchar);
void delay1(int);
void main()
{
while(1)
{
getkey();
}
}
uchar kbscan(void)
{
unsigned char sccode,recode;
P3=0x0f; //发0扫描,列线输入
if ((P3 & 0x0f) != 0x0f) //有键按下
{
delay(20); //延时去抖动
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行扫描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //无键按下,返回0
}

void getkey(void)
{
unsigned char key;
key=kbscan();
if(key!=0)
{
switch(key)
{
case 0x11:display(0);break;
case 0x12:display(1);break;
case 0x14:display(2);break;
case 0x18:display(3);break;
case 0x21:display(4);break;
case 0x22:display(5);break;
case 0x24:display(6);break;
case 0x28:display(7);break;
case 0x41:display(8);break;
case 0x42:display(9);break;
default:break;
}
}
}

void t0isr() interrupt 1
{
TH0=0xf4;
TL0=0x48;
switch(number)
{
case 0:P2=0x04;P0=distab[LED1];break;
case 1:P2=0x08;P0=distab[LED2];break;
case 2:P2=0x01;P0=distab[LED3];break;
case 3:P2=0x02;P0=distab[LED4];break;
default:break;
}
number++;
if(number>3)number=0;
}
void delay(uint z)
{
uint x,y;
for(x=z;x--;x>0)
for(y=110;y--;x>0);
}
void delay1(int tValue)
{
int i,j;
for(i=0; i<tValue; i++)
{
for(j=0; j<550; j++);
}
}
void display(uchar num)
{
SMG_g=0;
P0=tab[num];
delay1(2);
}追问

我的程序有问题吗?

追答

你的程序没有送行扫描码,必须依次送。

追问

我觉得程序没错的啊,先检测列在检测横

第2个回答  2013-05-12

矩阵键盘接法每个人可能大概是一样的但是具体的顺序是不一样的还是发个图吧比如我这个肯定和你不一样

追问

就算不一样总会有个键是能显示的吧顺序不一样,问题是现在只有4个正常