4287|9

40

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

矩阵扫描键盘问题 [复制链接]

刚入手一个单片机开发板,遇到不懂得地方,求大神帮忙解答。问题在下面程序的旁边#include
#include"bstv51.h"

uchar code table[17]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,
                   0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 ,
                   0x5e , 0x79 , 0x71 , 0x00};       

void delay(uint xms)        //Ñó3ùxms
{
    uint i,j;
        for(i=xms;i>0;i--)
          for(j=112;j>0;j--);
}

void display(uchar num)         
{
    P0=table[num];               
        DU=1;
        DU=0;
}

void keyscan4x4()
{
    uchar temp,key;
       P3=0xfe;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)----------------------------------------------------这句是什么意思啊,看不懂,是在判断什么呢?
        {
            delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)--------------------------------------上面都判断了,为什么这里还要判断。
                {
                    temp=P3;
                        switch(temp)
                        {
                          case 0xee:          
                               key=0;
                                   break;
                          case 0xde:                  
                                   key=1;
                                   break;
                          case 0xbe:                 
                                   key=2;
                                   break;
                          case 0x7e:               
                                   key=3;
                                   break;
                        }
                        while(temp!=0xf0)-------------------------------还有这句什么意思,
                        {
                            temp=P3;
                                temp=temp&0xf0;
                        }
                        display(key);
                }
        }

此帖出自51单片机论坛

最新回复

矩阵键盘原理,假如先把第一行接低电平,实际你P3=0xfe,就是最低位拉低了,正常接法,就是有一行接了低电平,就和普通键盘一样了,只要有键按下,低电平会送到P3,只需要检测列数据看哪个为低,就知道哪个键了。 按你的程序,应该是低4位拉低,读高4位的值。不能一下子全部拉低,所以先拉一行,判断列得一个值, 按此方法拉第二行低电平,再第三,第四行。所以低4位是什么值,对检测列数据来说,是无用的,检测列 数据,只要高4位。temp=P3就是把P3口读回来;   temp=temp&0xf0就是把P3口的值与上0xf0,结果是只要P3口的高4位,如果没键按下,那与完的值就是0xf0,如果有键按下,列数据肯定会变化,那就肯定不是0xf0;下一句程序 if(temp!=0xf0),就是判断是否有键按下,如果没有,则不执行下面语句,继续判断。当按下时,为真,就往下执行,第2次判断就要先延时去抖动,所以延时后写第二次,再次判断仍为真,则有键按下。此时,再读回P3口的值,看等于多少,就相应按了什么键,你可以看着图来对比 switch语句就容易弄懂了。你问的第3次是一个松手检测,就是你按了一次,如果没有松手检测,可能程序执行好几次了,你如果写程序按一次数据管加1,就会发现没有松手检测,按1次可能就从1变成8或9什么的了,不确定的,只要加了松手检测,才能按一次实现一个功能。是这样的:switch语句前又把P3口读回来给temp了,此时temp不等于0xf0,进入 while语句,再读回来与上0xf0后,temp就是0xf0,如果不等于,那就是还有键按下,就一直在 while中直到当键按下松手后,P3口又回到全1,与上0xf0后仍为0xf0,temp!=0xf0就为假,就退出while语句。这就是一个过程,这样,第一行按下的4个键就出来了。在并列位置,把第2行拉低,继续判断出5、6、7、8,依次下去把4行都扫描完,16个键哪个按下就出来了,记录好每个键,程序中指定哪个键执行什么内容就可以了。  详情 回复 发表于 2016-11-22 01:42
点赞 关注
 

回复
举报

4008

帖子

0

TA的资源

版主

沙发
 
那段是为了消抖,隔10毫秒如果不同就退出了

P3口的高四位应该是行或列的输入
此帖出自51单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
第一个   if(temp!=0xf0)是检查按键是否按下,第二个   if(temp!=0xf0)是延时消除抖动后的判断,  while(temp!=0xf0)-这个可能是判断清除temp吧,
此帖出自51单片机论坛

点评

这样的,还有一个问题,那为什么在uchar的下面这几行定义了P3,以及下面几行进行赋值,在if()函数里面还要进行一次赋值之类的和上面的一样的操作,if()上面的temp=1111 0000,那在if下面的函数里面吧是temp不是  详情 回复 发表于 2016-11-12 23:55
 
 
 

回复

40

帖子

0

TA的资源

一粒金砂(中级)

4
 
qqqi 发表于 2016-11-12 10:54
第一个   if(temp!=0xf0)是检查按键是否按下,第二个   if(temp!=0xf0)是延时消除抖动后的判断,  while(te ...

这样的,还有一个问题,那为什么在uchar的下面这几行定义了P3,以及下面几行进行赋值,在if()函数里面还要进行一次赋值之类的和上面的一样的操作,if()上面的temp=1111 0000,那在if下面的函数里面吧是temp不是这个值吗,还用进行定义是不是没有意思了。
此帖出自51单片机论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(中级)

5
 
本帖最后由 zl2168 于 2016-11-14 22:30 编辑

实例62  4×4矩阵式键盘


电路设计   
程序设计   
Keil调试   
Proteus仿真   


Proteus仿真一下,确认有效。
实例62 4×4矩阵式键盘.rar (44.79 KB, 下载次数: 17)


以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行
书中电路和程序设计有详细说明,程序语句条条有注解。
此帖出自51单片机论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(中级)

6
 
实例63  8279扩展8×8键盘和8位显示


电路设计   
程序设计   
Keil调试   
Proteus仿真   


Proteus仿真一下,确认有效。
实例63 8279扩展键盘和显示.rar (63.08 KB, 下载次数: 12)


以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行


书中电路和程序设计有详细说明,程序语句条条有注解。


此帖出自51单片机论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(中级)

7
 
本帖最后由 zl2168 于 2016-11-14 22:33 编辑

实例64  74HC595+165扩展8×8键盘


电路设计   
程序设计   
Keil调试   
Proteus仿真   


Proteus仿真一下,确认有效。
实例64 74LS595 165扩展8×8键盘.rar (65.5 KB, 下载次数: 6)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行
书中电路和程序设计有详细说明,程序语句条条有注解。
此帖出自51单片机论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

8
 
第一次试判断有按键按下,第二次是软件消抖,第三次是释放按键后显示键值。
单片机的IO口有线与的功能,即但一个口输出低,一个口输出高时,把两个口接在一起结果为低。
此帖出自51单片机论坛
 
个人签名每天进步一点点
博采众长,回馈大众!!
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

9
 
矩阵键盘原理,假如先把第一行接低电平,实际你P3=0xfe,就是最低位拉低了,正常接法,就是有一行接了低电平,就和普通键盘一样了,只要有键按下,低电平会送到P3,只需要检测列数据看哪个为低,就知道哪个键了。
按你的程序,应该是低4位拉低,读高4位的值。不能一下子全部拉低,所以先拉一行,判断列得一个值,
按此方法拉第二行低电平,再第三,第四行。所以低4位是什么值,对检测列数据来说,是无用的,检测列
数据,只要高4位。temp=P3就是把P3口读回来;   temp=temp&0xf0就是把P3口的值与上0xf0,结果是只要P3口的高4位,如果没键按下,那与完的值就是0xf0,如果有键按下,列数据肯定会变化,那就肯定不是0xf0;下一句程序 if(temp!=0xf0),就是判断是否有键按下,如果没有,则不执行下面语句,继续判断。当按下时,为真,就往下执行,第2次判断就要先延时去抖动,所以延时后写第二次,再次判断仍为真,则有键按下。此时,再读回P3口的值,看等于多少,就相应按了什么键,你可以看着图来对比 switch语句就容易弄懂了。你问的第3次是一个松手检测,就是你按了一次,如果没有松手检测,可能程序执行好几次了,你如果写程序按一次数据管加1,就会发现没有松手检测,按1次可能就从1变成8或9什么的了,不确定的,只要加了松手检测,才能按一次实现一个功能。是这样的:switch语句前又把P3口读回来给temp了,此时temp不等于0xf0,进入 while语句,再读回来与上0xf0后,temp就是0xf0,如果不等于,那就是还有键按下,就一直在 while中直到当键按下松手后,P3口又回到全1,与上0xf0后仍为0xf0,temp!=0xf0就为假,就退出while语句。这就是一个过程,这样,第一行按下的4个键就出来了。在并列位置,把第2行拉低,继续判断出5、6、7、8,依次下去把4行都扫描完,16个键哪个按下就出来了,记录好每个键,程序中指定哪个键执行什么内容就可以了。
此帖出自51单片机论坛
 
 
 

回复

40

帖子

0

TA的资源

一粒金砂(中级)

10
 
谢谢,我懂了
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

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