C语言写的矩阵键盘扫描程序,怎么分别判断按下的键所在的行和列。

a006045 2010-05-19 08:20:37
有一种方法是给低位赋1110 1101 1011 0111,然后进行扫描。。
我在书上看到另外一种做法。。就是分别判断所在的行和列的。。


//下面这段代码是我从书上抄的。。在switch那里我改了一下而已。先做个简单和测试
//但本来按下第一个键就led亮的。但是没有反应。。
//请问这段扫描键盘的代码是错在哪里?怎么改呢。。
void keyScan()
{
void delay(UINT);

UCHAR xTemp, yTemp, readKey, reReadKey;

xTemp = (P3 = 0x0f) & 0x0f; //扫描按键行值
if(xTemp == 0x0f) //无键按下
return;
yTemp = (P3 = 0xf0) & 0xf0; //列值
readKey = xTemp | yTemp;
delay(5); //延迟
xTemp = (P3 = 0x0f) & 0x0f; //扫描按键行值
if(xTemp == 0x0f)
return;
yTemp = (P3 = 0xf0) & 0xf0;
readKey = xTemp | yTemp;
if(readKey == reReadKey)
{
switch(readKey)
{
case 0xee: P1 = 0x00;while(1); //测试按下第一个键
case 0xde:break;
}

}

}
...全文
542 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Peasant_Lee 2010-05-22
  • 打赏
  • 举报
回复
百变不离其中,行驱列扫。。。。。。
a006045 2010-05-22
  • 打赏
  • 举报
回复
谢谢各位了。。
feel8068588 2010-05-21
  • 打赏
  • 举报
回复
楼上正解
ing 2010-05-19
  • 打赏
  • 举报
回复
参考以下

uchar Keyscan(void)
{
uchar i,j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j=0; j<4; j++)
{
P1 = Buffer[j];
/*以下三个_nop_();作用为让 P1 口的状态稳定*/
_nop_();
_nop_();
_nop_();
temp = 0x01;
for(i=0; i<4; i++)
{
if(!(P1 & temp))
{
return (i+j*4); //返回取得的按键值
}
temp <<= 1;
}
}
}
a006045 2010-05-19
  • 打赏
  • 举报
回复
如果上面的代码问题很大的话。。能不能给我一份正确的。就是分别扫描行和列的 。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧