0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机人机交互之矩阵按键

汽车电子技术 来源:嵌入式悦翔园 作者: JamesBin 2023-02-17 14:50 次阅读

按键是一种常开型按钮开关,与单片机的常见接法如图所示。按键未按下时两个触点断开,单片机I/O口输入高电平;当按键闭合时,I/O口输入低电平。

一、按键讲解

当I/O口为P0口时,由于没有内部上拉电阻,所以必须外接上拉电阻,当I/O口为P1、P2和P3口时,由于内部已有上拉电阻,因此可省略外接的上拉电阻。

图片

二、按键消抖

单片机系统中所使用的键盘都是机械式的弹性按键,因为存在机械触点的弹性作用,在按键闭合和弹起的瞬间都会出现抖动,如图所示。按键抖动一般会持续5~10ms,为使一次按键仅被处理一次,必须消除按键抖动。消除按键抖动可以采用软件消抖或硬件消抖。

图片

软件消抖指在检测到有按键闭合时,延时一小段时间之后再次检测,如果仍然检测到按键闭合,则认为按键真正闭合。

硬件消抖方法

1.R-S触发器

一旦有键按下,触发器立即反转,触点的抖动便不会再对输出产生影响,按键释放时也一样。

图片

2.电容滤波

电容并联在按键的两端,利用电容放电的延时特性,将产生抖动的电平通过电容吸收掉,从而达到消抖的作用;

图片

三、独立按键

独立键盘指每个按键都占据一个独立的引脚。

图片

四、矩阵按键

同一行上的所有按键都连接到一个引脚,同一列上的所有按键都连接到一个引脚。

图片

(1)列扫描方式

所有行线都输出高电平,列线依次输出低电平;查询该列上行的值,若为0,则说明该行上的按键被按下;若该列上所有行的值都为1,则进行下一列行值的查询;循环往复。

图片

(2)反转法

所有行线都输出0,查询列线上的值,若某列线上的值为0,则说明该列线上的按键被按下;然后所有列线都输出0,查询行线上的值,若某行线上的值为0,则说明该行线上的按键被按下;从而确定某行某列的按键被按下。

图片

五、程序举例

图片

#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uint key,key_num;//键盘扫描值,键盘键值
/********************************************************************/
//函数名:delay_1ms(uint x)
//功能:利用定时器0精确定时1ms;自加 time_t的值为后面时间调整函数服务
//调用函数:
//输入参数:x,1ms计数
//输出参数:
//说明:延时的时间为1ms乘以x
/********************************************************************/
void delay_1ms(uint x)
{
  TMOD=0X01;//开定时器0,工作方式为1
  TR0=1;//启动定时器0;
  while(x--)
  {
    TH0=0Xfc;//定时1ms初值的高8位装入TH0
    TL0=0X18;//定时1ms初值的低8位装入TL0
    while(!TF0);//等待,直到TF0为1
    TF0=0;
  }    
  TR0=0;//停止定时器0;
}

/**********************************************************/
//函数名:keyscan()
//功能:得出4x4键盘的行列扫描值
//调用函数:delay_1ms(uint x)
//输入参数:
//输出参数:
//说明:通过P1口的扫描得出扫描值key,无键按下key为16
/**********************************************************/
uchar keyscan()
{
   uchar code_h;    //行扫描值
  uchar code_l;    //列扫描值
  P1=0XF0;       //P1.0-P1.3全为0,(行状态全为低电平)
  if((P1&0xF0)!=0XF0)  //如果P1.4-P1.7不全为1,可能有键按下(为准确识别按键动作)
  {
      delay_1ms(5);  //廷时去抖动,为准确识别按键动作
      if((P1&0xF0)!=0XF0)//重读高4位(列状态),若还是不全为1,定有键按下
            {      
          code_h=0xfe;  //开始行扫描 (0xfe:11111110)
          while((code_h&0x10)!=0x00)//判断是否扫描四行(X0~X3)完毕,若不是,继续扫描(0x10:00010000)   
               {
             P1=code_h;  //第1次P1.0置为0,其余高电平;第2次P1.1置为0,其余高电平  ;第3次P1.2置为0,其余高电平;第4次P1.3置为0,其余高电平
             if((P1&0xF0)!=0XF0) //如果P1.4-P1.7不全为1,该行有键按下(0xF0:11110000)
                   {
               code_l=(P1&0xF0|0x0F);//保留P1口高4位,低4位变为1,作为列值
               return((~code_h)+(~code_l));//键盘编码=行扫描值+列扫描值 (取反后用,相当于改为按下按键对应的行、列标识为1,其它为0)         
             }
             else                           //左移后补0,但是我们需要将其他位置1,所以+1
               code_h=(code_h<<1)|0x01;  //若该行无键按下,行扫描值左移+1,扫描下一行 
           }
       }
   }
  return(16);   //无键按下,返回16 
 }

/**********************************************************/
//函数名:keynum()
//功能:得出4x4按键的键值
//调用函数:keyscan()
//输入参数:
//输出参数:
//说明:通过key的值确定按键键值
/**********************************************************/
void keynum()
{
    uchar i,j;
    uchar code tab[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}}; 
    //4x4键盘各键值标注
    key=16;
    key = keyscan();//引入key值
    if((key&0x01)!=0) i=0;  //判断出按下按键的行列号 (即找出低电平的行、列)
    if((key&0x02)!=0) i=1;
    if((key&0x04)!=0) i=2;
    if((key&0x08)!=0) i=3;
    if((key&0x10)!=0) j=0;
    if((key&0x20)!=0) j=1;
    if((key&0x40)!=0) j=2;
    if((key&0x80)!=0) j=3;
    if(key!=16) 
    {
       key_num = tab[i][j];//通过比较得出4x4键盘的键值
    }   
}

void main()
{
  uint shi,ge;
  shi = 0;
  ge = 0;
  P2 = 0x16;//初始值 为16
  while(1)
  {
     keynum(); //获取到键值
     if(key!=16)
     {
        shi = key_num/10;//获得十位   
       ge = key_num%10;//获得个位
       if(shi)
       {
         P2 = 0x10|ge;
       }
       else
       {
          P2 = ge;
       }
     }
     delay_1ms(10);//延时
  }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 按键
    +关注

    关注

    4

    文章

    220

    浏览量

    57338
  • 按钮开关
    +关注

    关注

    1

    文章

    47

    浏览量

    10064
  • i/o
    i/o
    +关注

    关注

    0

    文章

    33

    浏览量

    4523
收藏 人收藏

    评论

    相关推荐

    嵌入式系统的LCD人机交互菜单设计

    成本低、资源少的单片机系统实现完善的人机交互功能已成为单片机设计者需要解决的一个问题。  目前,国内外许多先进的智能仪表不仅在测量精度和采样速率等方面有较高的性能指标,在人机交互的友好
    发表于 06-17 12:03

    如何用MCGS开发STC89C52的人机交互界面

    最近在做毕设,想用MCGS开发一个能与单片机通讯的人机交互界面,但没有设备驱动开发的基础,无法使MCGS与单片机连接上,在此请教各位大神给点意见,怎么去实现这样一个人机交互界面的开发。
    发表于 03-08 13:09

    怎么设计基于单片机和FPGA的人机交互系统?

    在现代各类仪器的开发中,人机交互功能正起着无可替代的作用。人机交互界面友好的仪器将更容易操作和使用,从而提高工作效率。液晶显示器(LCD)具有功耗低、价格低、寿命长、接口控制方便等特点,在科研
    发表于 08-22 07:50

    智能压力监控仪的人机交互怎么实现?

    近年来,LCD显示器的普及和微处理器向大容量的发展使嵌入式系统的人机交互功能得到了显著的提高。在很多场合下,良好的图形用户界面(GUI)和便捷的操作环境是影响产品成败的关键因素之一。如何充分利用成本低、资源少的单片机系统实现完善的人机交
    发表于 09-05 06:12

    基于嵌入式系统的LCD人机交互菜单该怎么设计?

    近年来,LCD显示器的普及和微处理器向大容量的发展使嵌入式系统的人机交互功能得到了显著的提高。在很多场合下,良好的图形用户界面(GUI)和便捷的操作环境是影响产品成败的关键因素之一。如何充分利用成本低、资源少的单片机系统实现完善的人机交
    发表于 09-25 06:31

    基于单片机和FPGA的人机交互系统该怎么设计?

    在现代各类仪器的开发中,人机交互功能正起着无可替代的作用。人机交互界面友好的仪器将更容易操作和使用,从而提高工作效率。液晶显示器(LCD)具有功耗低、价格低、寿命长、接口控制方便等特点,在科研
    发表于 10-21 07:48

    嵌入式系统的人机交互技术怎么优化?

    近年来,LCD显示器的普及和微处理器向大容量的发展使嵌入式系统的人机交互功能得到了显著的提高。在很多场合下,良好的图形用户界面(GUI)和便捷的操作环境是影响产品成败的关键因素之一。如何充分利用成本低、资源少的单片机系统实现完善的人机交
    发表于 04-07 06:05

    按键和PIC单片机的物理连接与检测

    目录按键和PIC单片机一、按键二、按键的物理连接与检测三、PIC16F18854单片机按键检测及
    发表于 11-24 06:39

    怎样通过USART串口来实现单片机简单的人机交互功能呢

    怎样通过USART串口来实现单片机简单的人机交互功能呢?有什么解决办法吗?
    发表于 12-09 07:42

    基于单片机和FPGA的人机交互系统的设计

    在仪器仪表电路中,人机交互界面是必不可少的环节。为了解决单纯采用单片机制作的系统功耗高、速度慢、电路结构繁琐的问题,同时为了发挥出单片机的灵活性和FPGA的高速性,
    发表于 11-25 17:14 53次下载
    基于<b class='flag-5'>单片机</b>和FPGA的<b class='flag-5'>人机交互</b>系统的设计

    51单片机矩阵按键

    51单片机矩阵按键,根据按键数在数码管上显示。
    发表于 05-09 10:59 4次下载

    人机交互系统界面设计方案解析

    的播放按键,大至飞机上的仪表板、或是发电厂的控制室。本文将为您介绍几种人机交互系统及人机交互界面的设计方案。 基于ARM的信号发生器人机交互系统设计 本文以Hynix公司生产的HMS3
    发表于 10-16 16:33 0次下载

    人机交互是什么意思?人机交互交互设计的区别是什么?

    那么人机交互是什么意思?人机交互通俗的解释就是:容易学,高效实用,并具有丰富的用户体验,从用户角度出发的设计理念。
    的头像 发表于 02-26 11:26 3.6w次阅读

    单片机编辑库四之矩阵按键

    单片机编辑库一之延时与led灯单片机编辑库二之按键单片机编辑库三之蜂鸣器单片机编辑库四之矩阵
    发表于 12-31 19:37 12次下载
    <b class='flag-5'>单片机</b>编辑库四之<b class='flag-5'>矩阵</b><b class='flag-5'>按键</b>

    单片机学习-矩阵按键

    目录矩阵按键介绍检测方法C51例程欢迎加QQ及邮件交流矩阵按键介绍 独立键盘与单片机连接时,每一个
    发表于 12-31 19:37 8次下载
    <b class='flag-5'>单片机</b>学习-<b class='flag-5'>矩阵</b><b class='flag-5'>按键</b>