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

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

3天内不再提示

基于单片机的矩阵键盘检测案例

CHANBAEK 来源:郎哥编程课堂 作者:郎宏林 2023-10-31 14:35 次阅读

单片机需要连接多个按键,每个按键与单片机的I/O端口单独连接的方式就不太适用了,因为单片机的I/O端口是单片机系统与外界设备交互的重要资源,如果采用按键与I/O端口独立连接的方式,就会占用过多的I/O端口资源,导致单片机与其它外部设备无法连接。在这种情况下,可以使用矩阵键盘,实现多个按键与单片机的连接,而且不浪费单片机的I/O端口资源。

矩阵键盘是一种很好地节约I/O端口资源的技术方法,矩阵键盘将多个按键排列成矩阵形式。例如:将16个按键排成4行4列,每行将按键的一端连接在一起构成行线,每列将按键的另一端连接在一起构成列线,这样一共有4行4列8根线,将这8根线连接到单片机的8个I/O端口上,通过检测程序扫描矩阵键盘就可以检测16个按键。通过这种连接方式,可以实现3行3列9个键,5行5列25个键,6行6列36个键等多个按键的检测。

图片

上图为设计的4 X 4矩阵键盘,每行4个按键,每列4个按键,可以检测16个按键。每列按键的右端连接在一起,分别连接P3.4 ~ P3.7,每行按键的左端连接在一起,分别连接P3.0~P3.3,这样可以使用8个I/O端口检测16个按键。

虽然矩阵键盘充分利用了I/O端口资源,但增加了检测程序的复杂性。因为独立按键有一端固定为低电平,编写单片机键盘检测程序比较方便,而矩阵键盘两端都与I/O端口相连,因此检测程序需要向I/O端口人为送出低电平。具体检测方法:先送一行低电平,其余各行为高电平,现在已经确定了行数(送入低电平的行),然后循环检测与该行相交的各列是否有低电平,若检测到某列有低电平,说明与该行相交的某列按键被按下,即确定了当前按下的按键属于哪一行哪一列。同理,使用同样的方法轮流送各行一次低电平,再轮流检测各列是否有低电平,即可完成所有按键的检测。当然也可以先送各列为低电平,然后再循环检测各行是否有低电平。

矩阵键盘应用案例:应用16个独立按键构成4行4列的矩阵键盘,行线接P3.0 ~ P3.3,列线接P3.4~P3.7。按键排列顺序为:1行1列为第1个按键,1行2列为第2个按键,……,2行1列为第5个按键,2行2列为第6个按键,……,4行4列为第16个按键。要求用户按下按键1后,数码管显示数字1,按下按键2后,数码管显示数字2,……,依次显示3,4,5,6,7,8,9,A,B,C,D,E,F。

下图是矩阵键盘案例电路设计图:

图片

数码管采用7SEG-MPX1-CA,为共阳极数码管,独立按键采用SPST Push Button,请同学们参考上图使用proteus绘制电路设计图。

单片机内运行的完整C程序如下:

#include
#include
unsigned char led[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8,0x3,0xc6,0x21,0x6,0xe};
unsigned char key[] = {0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
unsigned char rowscan[] = {0xfe,0xfd,0xfb,0xf7};
void delay(unsigned int millisecond)
{
       unsigned int i,j;
       for(i=millisecond;i >0;i--)
              for(j=120;j >0;j--);
}
void show_keyvalue(int keynum)
{
              P0 = led[keynum];
         delay(100);
}
void marix_keyscan()
{
       unsigned int i,j;
       unsigned char temp;
       for( i = 0; i< 4; i++ )
       {
               P3 = rowscan[i];
               temp = P3;
               temp = temp & 0xf0;
               if( temp != 0xf0 )
               {
                        delay(10);
                       temp = P3;
                  temp = temp & 0xf0;
                       if( temp != 0xf0 )
                            {
                               temp = P3;
                                    for( j = 0; j < 16; j++ )
                                    {
                                           if( temp == key[j] )
                                                          break;
                                    }
                                    while(temp != 0xf0)
                                    {
                                            temp = P3;
                                            temp = temp & 0xf0;
                                    }
                                    show_keyvalue(j);
                            }
               }
    
       }
}
void main(void)
{
        while(1)
        {
                 marix_keyscan();
        }
 }

程序设计思路:

按矩阵键盘的行线和列线顺序对16个按键进行编码,编码值是矩阵键盘某按键被按下后P3端口的值。例如:行1列1按键被按下后,P3端口的值为0xee,行2列1按键被按下后,P3端口的值为0xed。对所有按键进行编码后,可以通过P3端口的值来确定哪个按键被按下。

扫描矩阵键盘需要对4条行线循环送出低电平,然后再判断列线是否有低电平。在电路设计中矩阵键盘的4条行线接P3口的低4位P3.0 ~ P3.3,因此在行线循环中为P3口赋不同的值,即可完成对4条行线循环送出低电平的操作,1~4条行线送入低电平P3口的值分别为0xfe、0xfd、0xfb、0xf7。

矩阵键盘扫描程序需要一个循环结构,循环次数为矩阵键盘的行线数量,在循环体内依次为4条行线送入低电平,然后读取P3口的值,将P3口与0xf0进行与运算,若运算结果不为0xf0,说明有按键被按下(有列线为低电平),延迟10ms后再次检测有按键是否被按下,若确认有按键被按下,使用for循环遍历已定义16个按键编码值的数组,定位被按下按键的索引,最后调用数码管显示函数将按键索引对应的字符显示出来。

代码说明:

数组led[]定义了数码管显示的字符编码值,数组长度为16。数组key[]定义了16个按键的编码值,数组长度为16。数组rowscan[]定义了4条行线送入低电平P3口的值,数组长度为4。

delay()函数为时间延迟函数,show_keyvalue()为数码管显示字符的函数,参数keynum为字符led数组元素的索引,该索引与key数组元素的索引对应。marix_keyscan()为矩阵键盘扫描函数,用于检测按键是否被按下。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620836
  • 端口
    +关注

    关注

    4

    文章

    820

    浏览量

    31588
  • 按键
    +关注

    关注

    4

    文章

    220

    浏览量

    57338
  • 矩阵键盘
    +关注

    关注

    7

    文章

    204

    浏览量

    31131
收藏 人收藏

    评论

    相关推荐

    [下载]Pic单片机视频教程

    第三讲 PIC单片机独立键盘检测原理及实现。 53分 第四讲 PIC单片机矩阵键盘
    发表于 03-26 16:39

    郭天祥10天学会PIC单片机

    。Lesson2:时间:27分。内容:数码管的静态显示与动态显示原理及实现。Lesson3:时间:53分。内容:PIC单片机独立键盘检测原理及实现。Lesson4:时间:45分。内容:PIC
    发表于 07-04 13:33

    郭天祥十天学会PIC单片机和C语言视频教程 强烈推荐 零基

    。内容:PIC单片机独立键盘检测原理及实现。Lesson4:时间:45分。内容:PIC单片机矩阵键盘
    发表于 12-19 09:00

    51单片机矩阵键盘检测问题

    不知道哪里有问题,按键按下去数码管都没反应#include#define uint unsigned int#define uchar unsigned charuchar num,temp;***it key1=P3^4;***it dula=P2^6;***it wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){dula=1;P0=0;dula=0;wela=1;P0=0xc0;wela=0;while(1){P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0);{temp=P3;switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;}dula=1;P0=table[num-1];dula=0;}}}}
    发表于 10-15 21:34

    【郭天祥】十天学会单片机【视频目录】

    :PIC单片机独立键盘检测原理及实现。 5、Lesson4:时间:45分。内容:PIC单片机矩阵键盘
    发表于 06-27 21:48

    如何去实现PIC单片机矩阵键盘检测

    uchar unsigned char#define uintunsigned int__CONFIG(0x3B31);const uchar table[]={0x3f,0x0...
    发表于 11-24 06:47

    怎样去实现PIC单片机矩阵键盘检测

    uchar unsigned char#define uintunsigned int__CONFIG(0x3B31);const uchar table[]={0x3f,0x0...
    发表于 11-24 06:21

    单片机矩阵键盘判断

    单片机矩阵键盘判断某个按键按下这是我第一次发表文章,关于51单片机矩阵键盘逐行逐列扫描是否有按
    发表于 12-08 07:12

    矩阵键盘检测独立按键与单片机连接

    4.2 矩阵键盘检测独立按键与单片机连接时,每个按键都需要单片机的一个I/O口,若单片机系统需要
    发表于 02-22 06:14

    一种实用的单片机矩阵键盘设计

    矩阵键盘单片机外部设备中所使用的排布类于矩阵键盘组。矩阵式结构的
    发表于 11-24 07:42 559次阅读

    单片机8x8矩阵键盘原理说明

    本文主要介绍了介绍基于51单片机矩阵键盘原理以及单片机8x8矩阵键盘原理说明,另外还详细的附上
    的头像 发表于 02-24 16:14 2.4w次阅读
    <b class='flag-5'>单片机</b>8x8<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>原理说明

    AT89C52单片机设计的矩阵键盘检测程序免费下载

      矩阵键盘检测思路:行线设为输出、列线设为输入获得列码,行线设为输入、列线设为输出获得行码,由行列码确定键值。本程序可改进的地方:按键状态机中,将等待按键释放语句移到第三个状态中,可进一步提高按键扫描程序效率。
    发表于 07-12 17:39 0次下载
    AT89C52<b class='flag-5'>单片机</b>设计的<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b><b class='flag-5'>检测</b>程序免费下载

    PIC单片机矩阵键盘检测原理及实现

    PIC单片机矩阵键盘检测原理及实现
    发表于 11-16 11:51 2次下载
    PIC<b class='flag-5'>单片机</b><b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b><b class='flag-5'>检测</b>原理及实现

    PIC单片机矩阵键盘检测原理及实现

    PIC单片机矩阵键盘检测原理及实现
    发表于 11-16 12:51 7次下载
    PIC<b class='flag-5'>单片机</b><b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b><b class='flag-5'>检测</b>原理及实现

    51单片机——矩阵键盘检测

    4x4键盘检测程序,按下键后相应的代码显示在数码管上#include&amp;lt;reg51.h&amp;gt;sbit dula=P2^6;sbit wela
    发表于 11-20 20:51 7次下载
    51<b class='flag-5'>单片机</b>——<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>的<b class='flag-5'>检测</b>