标题: 四种4*4矩阵键盘的扫描方法 [打印本页]
作者: 未来的技术女 时间: 2016-7-13 20:34
标题: 四种4*4矩阵键盘的扫描方法
第一种:这种方法就是郭天祥书上教的扫描方法,很容易理解,但是程序比较长。 P2=0xfe;//给第一列送低电平
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(10); //去抖
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{ case 0xee:num=1;break;
case 0xee:num=2;break;
case 0xee:num=3;break;
case 0xee:num=4;break;
}
while(temp!=0xf0) //按键释放
{
temp=P2;
temp=temp&0xf0;
}
}
}
然后再给第二、三、四列依次送低电平检查,也就是说再重复上边的程序四次
第二种
uchar keyscan(void)
{
unsigned char cord_h,cord_l;
P2=0x0f; //行线输出全为0
cord_h=P2&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delayms(10); //去抖
if((P2&0x0f)!=0x0f)
{
cord_h=P2&0x0f; //读入列线值
P2=cord_h|0xf0; //输出当前列线值
cord_l=P2&0xf0; //读入行线值
while((P2&0xf0)!=0xf0);//等待松开并输出
return(cord_h+cord_l);//键盘最后组合码值
}
}
return(0xff); //返回该值
第三种
uchar keyscan()
{
uchar i=0,j=0,key;
P2=0xf0; // 高位拉高,低位拉低
if(((~P2)&0xf0)!=0)
{
delay(10);
if(((~P32&0xf0)!=0)
{
P2=0xfe;
while(((~P2)&0x0f)!=0) // 此语句保证只扫描四行
{
if(((~P2)&0xf0)!=0)
{
switch((~P2)&0xf0)
{
case 0x10:
j=0;break;
case 0x20:
j=1;break;
case 0x40:
j=2;break;
case 0x80:
j=3;break;
}
return(4*i+j);
}
else
{
P3=P3<<1; //循环4次
i++;
}
}
}
}
return (key) ;
}
第四种
uchar keyscan(void)
{
uchar code K_Tab[4][4] = {
0xee, 0xde, 0xbe, 0x7e, 0xed, 0xdd, 0xbd, 0x7d,
0xeb, 0xdb, 0xbb, 0x7b, 0xe7, 0xd7, 0xb7, 0x77};
uchar temp1 = 0xfe, temp2, i, j;
for(i = 0; i < 4; i++)
{ //扫描低四位
P3 = temp1; //输出一行0
temp2 = P3; //马上就读入
if((temp2 & 0xf0) != 0xf0) //如果有键按下
{
for(j = 0; j < 4; j++) //就扫描高四位
if(temp2 == K_Tab[j]) //查表
return i * 4 + j; //查到了就返回按键的数值
}
else temp1 = _crol_(temp1, 1);
}
return 16; //没有查到,返回按键松开的代码
}
作者: nsj21n 时间: 2016-7-14 08:44
不错,可以借鉴学习!
作者: 1518921 时间: 2018-11-26 15:20
第一种有问题,情况都为按键1
作者: 正规007 时间: 2019-3-10 06:34
谢谢女神的分享
作者: 190315 时间: 2019-3-10 20:24
第一种里面的P2应该是P3吧,矩阵键盘好像是P3口控制的
作者: 老二不怕黑 时间: 2019-3-11 09:47
谢谢女神的分享
作者: hmgqljz111 时间: 2019-3-14 14:16
都可以的
作者: hmgqljz111 时间: 2019-3-14 14:17
对于CPU占用不高的,可以用第一种比较直观
作者: liyezhao2019 时间: 2020-3-24 18:21
还是利用定时中断做消抖好点 CPU利用效率高
作者: bbxyliyang 时间: 2022-10-4 21:16
应该使用状态机思路编程
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |