本帖最后由 hunxiyi 于 2012-12-13 12:13 编辑
4X4矩阵键盘,四行依次与P3口的0、1、2、3口相连。。
四列依次与4、5、6、7口相连
编写下列程序。。。感觉没有什么问题。。但是烧进板子里,只有0、4、8、c可以显示,其它12个键都没效果、、
想了N天都没办法。。。请大神出马、、、
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit weix = P2^7;
sbit duanx = P2^6;
uchar code table[] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void init();
void keyscan();
void display();
void delay(uint x);
uchar i,key,k = 88;
void main()
{
init(); //初始化
while(1)
{
keyscan(); //矩阵键盘扫描
display(); //显示
}
}
void init() //初始化
{
weix = 1;
P0=0xea;
weix = 0;
P0 = 0x00;
duanx = 1;
P0 = 0x00;
duanx = 0;
}
void keyscan() //矩阵键盘扫描
{
uchar i,key;
P3 = 0x0f;
if(P3 != 0x0f)
{
delay(10); //按键是否按下检测延时
if(P3 != 0x0f)
{
P3 = 0xef;
for(i = 0;i < 4;i++)
{
key = P3 & 0x0f; //屏蔽高四位,只对比检测到的第四位
switch(key)
{
case 0x0e:k = i + 0;break;
case 0x0d:k = i + 4;break;
case 0x0b:k = i + 8;break;
case 0x07:k = i + 12;break default:k = 88; //经15楼朋友提示,加上这句话,程序就没问题了 }
P3 = (P3 <<1) + 1; //P3口数据左移一位 再加1
if(k != 88) //在此次for循环中 switch中如果匹配到
break; //k被重新赋值,则退出for循环
}
P3 = 0x0f; //松手检测
while(P3 != 0x0f) //未松手则一直在此等待
; //松手则退出
}
}
}
void display() //显示
{
duanx = 1;
P0 = table[k];
duanx = 0;
}
void delay(uint x)
{
uint j;
while(x--)
for(j=110;j>0;j--);
}
|