7324|13

85

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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

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


  1. //下面这段代码是我从书上抄的。。在switch那里我改了一下而已。先做个简单和测试
  2. //但本来按下第一个键就led亮的。但是没有反应。。
  3. //请问这段扫描键盘的代码是错在哪里?怎么改呢。。
  4. void keyScan()
  5. {
  6.     void delay(UINT);
  7.    
  8.     UCHAR xTemp, yTemp, readKey, reReadKey;
  9.    
  10.     xTemp = (P3 = 0x0f) & 0x0f;  //扫描按键行值
  11.     if(xTemp == 0x0f)  //无键按下
  12.         return;
  13.     yTemp = (P3 = 0xf0) & 0xf0;  //列值
  14.     readKey = xTemp | yTemp;
  15.     delay(5);  //延迟
  16.     xTemp = (P3 = 0x0f) & 0x0f;  //扫描按键行值
  17.     if(xTemp == 0x0f)
  18.         return;
  19.     yTemp = (P3 = 0xf0) & 0xf0;
  20.     readKey = xTemp | yTemp;
  21.     if(readKey == reReadKey)
  22.     {
  23.         switch(readKey)
  24.         {
  25.             case 0xee: P1 = 0x00;while(1); //测试按下第一个键
  26.             case 0xde:break;
  27.         }
  28.         
  29.     }
  30.       
  31. }
复制代码
此帖出自编程基础论坛

最新回复

zxfen12提供的程序好像只扫描P0口的高4位  详情 回复 发表于 2011-7-26 15:31
点赞 关注
 

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
如果上面的代码问题很大的话。。能不能给我一份正确的。就是分别扫描行和列的 。
此帖出自编程基础论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
参考以下

  1. uchar Keyscan(void)
  2. {
  3.         uchar i,j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
  4.         for(j=0; j<4; j++)
  5.         {
  6.                 P1 = Buffer[j];
  7.                 /*以下三个_nop_();作用为让 P1 口的状态稳定*/
  8.                 _nop_();
  9.                 _nop_();
  10.                 _nop_();
  11.                 temp = 0x01;                                                                                                                                                                    
  12.                 for(i=0; i<4; i++)
  13.                 {
  14.                         if(!(P1 & temp))
  15.                         {
  16.                                 return (i+j*4);                  //返回取得的按键值
  17.                         }
  18.                         temp <<= 1;
  19.                 }       
  20.         }
  21. }
复制代码
此帖出自编程基础论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

4
 
楼上正解
此帖出自编程基础论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
百变不离其中,行驱列扫。。。。。。
此帖出自编程基础论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

6
 
谢谢各位了。。
此帖出自编程基础论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

7
 
谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
此帖出自编程基础论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

8
 
理解中啊
此帖出自编程基础论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

9
 
应该是temp = 0x01;改为temp = 0x0f;吧。。。。是不是???
此帖出自编程基础论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

10
 
好吧 我错了
此帖出自编程基础论坛
 
 
 

回复

473

帖子

0

TA的资源

纯净的硅(高级)

11
 

回复 板凳 zxfen12 的帖子

是不是应该加个switch来根据你的数值判断出哪个按下
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

12
 
xTemp = (P3 = 0x0f) & 0x0f; //扫描按键行值
这句看不懂。
P3 = 0X0F,然后再位与。这是什么意思?
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

134

帖子

0

TA的资源

一粒金砂(中级)

13
 
线反转法不错的。
此帖出自编程基础论坛
 
 
 

回复

159

帖子

1

TA的资源

一粒金砂(中级)

14
 
zxfen12提供的程序好像只扫描P0口的高4位
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表