8113|9

6

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

行列反转扫描法在矩阵键盘中的应用及编程思想 [复制链接]

我现在正在学习51单片机,学到矩阵键盘时,遇到了一些小问题,感觉行列扫描法原理简单,但编程较啰嗦,而且没有固定的编程模式,一个人一个编法,代码复杂,一会儿就能把人绕晕。于是我就想寻找有没有一种编程思想灵巧,代码简便的程序,通过苦苦在网上寻觅,终于找到了反转法。
行列反转扫描法法可能有些教材资料里都有,但是介绍都不够详细,我找到一个资料,代码非常简单,但是并不好理解,我苦苦思索了一个晚上才弄明白。于是根据反转法的思想,我写了一个代码不是最少,但却是非常容易理解的程序,在此拿来与大家共享。此程序已在开发板及Proteus软件中仿真成功。
单片机大学里也学过,但只是死记硬背了一些知识,基本没有什么实践,现在自己买了个开发板自学,希望以后能向单片机嵌入式方向发展。欢迎热爱单片机的同学联系交流,我的QQ:77329961。
好了,闲言少叙,先上电路原理图:

P1口接矩阵键盘,其中P1.0~P1.3接行线,P1.4~P.7接列线,P0口接共阴极7段数码管。
反转法的原理:
    反转法就是通过给单片机的端口赋值两次,最后得出所按键的值的一种算法。
for example:

如图1所示,取P1口的低四位为行线,高四位为列线。


    1.我们给P1口赋值0x0f,即00001111,假设0键按下了,则这时P1口的实际值为00001110;

    2.我们给P1口再赋值0xf0,即11110000,如果0键按下了,则这时P1口的实际值为11100000;
    3.我们把两次P1口的实际值相加得11101110,即0xee。
    由此我们便得到了按下0键时所对应的数值0xee,以此类推可得出其他15个按键对应的数值,有了这种对应关系,矩阵键盘编程问题也就解决了,也就是程序的算法已经有了。对应关系见图2.


以下为程序:
/*反转法矩阵键盘的应用,我认为这是一个编程简便又容易理解的矩阵键盘编程应用,因此拿来与大家共享*/
/*殷传东对此程序拥有独家版权,仅可用于研究学习,严禁用于商业目的,欢迎喜爱单片机的大虾小虾皮皮虾联系交流QQ:77329961*/
#include                //头文件
#define uchar unsigned char         //宏定义
#define uint unsigned int
uchar key,n;                 //定义变量
uchar code table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};        //反转法矩阵键盘的各个按键的计算值
uchar code yin[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};               //共阴极数码管显示0~F
void delay(uint i)    //延时函数
{
  while(i--);
}
void keyscan()
{
uchar l,h,i;                        //定义局部变量,用l得出低4位的值,用h得出高4位的值
P1=0x0f;                                        //给P1赋值00001111
l=P1&0x0f;
if(l!=0x0f)
{
  delay(100);
     if(l!=0x0f)
          l=P1&0x0f;                        //若有键按下,得出低四位的值
  }
  P1=0xf0;                                        //给P1赋值11110000
  h=P1&0xf0;
if(h!=0xf0)
{
  delay(100);
     if(h!=0xf0)
          h=P1&0xf0;                        //若有键按下,得出高4位的值
  }

  key=l+h;                                        //高4位的值与低4位的值相加
  for(i=0;i<16;i++)
           {
    if(key==table)                   //通过查表得出n的值
    n=i;
        }
}

void main()
{
while(1)
   {
           keyscan();
        P0=yin[n];                                //在数码管上显示相应的键值
   }
}

行列反转扫描法.rar

36.87 KB, 下载次数: 49

此帖出自51单片机论坛

最新回复

我的意思是说输出口常态电平为高电平,扫描电平为低电平比较合理. 把死等延时去了就好使了.   详情 回复 发表于 2015-4-19 10:54
点赞 关注
 

回复
举报

3

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

扫描

恩 传统的行列扫描在简单程序里面还好用 ,但用到大程序里面就有点反应迟钝的感觉
此帖出自51单片机论坛
 
 
 

回复

547

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
我也总觉得有点迟钝
此帖出自51单片机论坛
 
个人签名嵌入式培训www.51great.org
 
 

回复

4008

帖子

0

TA的资源

版主

4
 
这个一般啦,貌似有个delay不太完美,因为delay总是和晶振有关系。
我写的程序还可以支持中断扫描,长按键,组合按键呢。
此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

5
 
另外这个“P1口赋值0x0f”有问题,简单的连接是没有电阻的。
赋值低的时候有按键就短路了,应该赋值高检测是否为低
此帖出自51单片机论坛

点评

恩 传统的行列扫描在简单程序里面还好用 ,但用到大程序里面就有点反应迟钝的感觉? 大神,能不能解释一下是什么原因,怎么避免  详情 回复 发表于 2015-4-19 10:12
 
 
 

回复

535

帖子

0

TA的资源

五彩晶圆(初级)

6
 
不错!程序匠人写了个按键漫谈不错!
此帖出自51单片机论坛
 
 
 

回复

535

帖子

0

TA的资源

五彩晶圆(初级)

7
 

回复 4楼 huo_hu 的帖子

哪里有问题啊?不是给高电平。然后如果有按键按下那么拉低
此帖出自51单片机论坛
 
 
 

回复

304

帖子

0

TA的资源

一粒金砂(高级)

8
 
这个程序,其实第二步时不用再次去间断有没有键按下,直接用反转得出按键的值。
此帖出自51单片机论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(中级)

9
 
huo_hu 发表于 2012-3-7 08:09
另外这个“P1口赋值0x0f”有问题,简单的连接是没有电阻的。
赋值低的时候有按键就短路了,应该赋值高检测是否为低


恩 传统的行列扫描在简单程序里面还好用 ,但用到大程序里面就有点反应迟钝的感觉?


大神,能不能解释一下是什么原因,怎么避免

此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

10
 
我的意思是说输出口常态电平为高电平,扫描电平为低电平比较合理.
把死等延时去了就好使了.
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表