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

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

3天内不再提示

基于51单片机的矩阵按键设计

天才小狸花 来源:Sigle_chip 作者:Sigle_chip 2022-08-22 10:10 次阅读

导语

独立按键在系统中大量使用,会占用大量的IO口,因此采用矩阵按键的设计。使用 8个 IO可实现了 16个按键,与此对应的也可以设计更为复杂的电路,来实现更少的IO,更多的按键,本质上都是通过IO捕获电平上的变化。

矩阵按键

电路

通过行与列的扫描来检查那个IO电平被按下,而当某一个按键按下时,改按键对应的行和列就会短接,当按键按下时,一个高电平和低电平短接会把高电平拉低。

逐行扫描:高4位P17-P14链接每一行,依次把每一行设置为低电平,把低4位设置未高电平,然后检测第四位是否全为1,如果不全为1,说明有按键按下,电平被拉低,也就是对应的按键被按下,如此循环检测每一行;其实根据原理可以看出来,除了逐行扫描,也可以逐列扫描,原理相同;

行列扫描:和逐行或逐列扫描不通的是行列扫描;扫描原理是先把高4位设置为低电平,把低4位设置为高电平,这样如果低4位中有电平变低,说明该列有按键按下,但不知道具体是哪一行的按键;接着反过来操作,把高4位设置为高电平,低四位设置为低电平,检测高4位哪一位被拉低,那么按键就在对应的行上,这样通过两次扫描就知道该按键在哪一行哪一列了,也就知道具体是哪个按键被按下了。

poYBAGMC5XGAWxBqAAE4Ua2fifs971.png

程序

void KeyScan()
{
//4*4矩阵键盘扫描
P3 = 0XF0;//列扫描
if(P3 != 0XF0)//判断按键是否被按下
{
delay(10);//软件消抖10ms
if(P3 != 0XF0)//判断按键是否被按下
{
switch(P3) //判断那一列被按下
{
case 0xe0:KeyValue = 0;break;//第一列被按下
case 0xd0:KeyValue = 1;break;//第二列被按下
case 0xb0:KeyValue = 2;break;//第三列被按下
case 0x70:KeyValue = 3;break;//第四列被按下
}
P3 = 0X0F;//行扫描
switch(P3) //判断那一行被按下
{
case 0x0e:KeyValue = KeyValue;break;//第一行被按下
case 0x0d:KeyValue = KeyValue + 4;break;//第二行被按下
case 0x0b:KeyValue = KeyValue + 8;break;//第三行被按下
case 0x07:KeyValue = KeyValue + 12;break;//第四行被按下
}
while(P3 != 0X0F);//松手检测
}
}
P3 = 0XFF;//独立按键扫描
if(P3 != 0XFF)
{
delay(10);//软件消抖10ms
if(P3 != 0XFF)
{
switch(P3) //判断那一行被按下
{
case 0xfe:KeyValue = 16;break;//S2被按下
case 0xfd:KeyValue = 17;break;//S3被按下
case 0xfb:KeyValue = 18;break;//S4被按下
case 0xf7:KeyValue = 19;break;//S5被按下
}
while(P3 != 0XFF);//松手检测
}
}
}

其他键盘

8个IO控制64个IO。

pYYBAGMC5WGARGM9AADUhc_B1lw557.png

审核编辑:汤梓红

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

    关注

    6035

    文章

    44553

    浏览量

    634734
  • 51单片机
    +关注

    关注

    274

    文章

    5702

    浏览量

    123525
  • 矩阵按键
    +关注

    关注

    0

    文章

    28

    浏览量

    8362
  • 独立按键
    +关注

    关注

    1

    文章

    45

    浏览量

    11561
收藏 人收藏

    评论

    相关推荐

    有关51单片机矩阵按键

    求大神指点矩阵按键电路图的原理
    发表于 07-14 11:02

    大侠们,求教关于51单片机矩阵按键的问题

    我用的是吴鉴鹰的开发板,其中关于矩阵按键的程序不太理解,请各位前辈大神指教unsigned char Key_Scan(void){uchar Key_Temp,Scan_Code
    发表于 09-26 20:42

    怎么实现51单片机矩阵按键

    怎么实现51单片机矩阵按键
    发表于 10-09 09:12

    51单片机矩阵按键怎么运用?

    51单片机矩阵按键怎么运用
    发表于 11-01 08:15

    51单片机矩阵按键

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

    51单片机矩阵按键的功能应用

    codeunsignedcharLedChar[]={//数码管显示字符转换表 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E }; unsignedcharKeySta[4][4]={//全部
    发表于 03-05 15:35 3286次阅读

    51单片机矩阵按键的实验详细资料说明

    方法一:逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
    发表于 04-15 18:25 0次下载

    51单片机矩阵按键扫描的原来和电路图及代码免费下载

    原理:当按键按下时按键两个引脚为0;先给P1.3-P1.0为1,P1.7-P1.4为0(代码中GPIO_KEY=0x0f;),当有按键按下,它的两个引脚都应该为0,我们事先把列引脚设为了1,看哪一位
    发表于 09-19 17:20 0次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>矩阵</b><b class='flag-5'>按键</b>扫描的原来和电路图及代码免费下载

    矩阵按键、秒表、数码管动态扫描和数码管同时加减的程序免费下载

    本文档的主要内容详细介绍的是基于51单片机矩阵按键、秒表、数码管动态扫描和数码管同时加减的C语言程序免费下载。
    发表于 05-13 08:00 21次下载
    <b class='flag-5'>矩阵</b><b class='flag-5'>按键</b>、秒表、数码管动态扫描和数码管同时加减的程序免费下载

    51单片机矩阵按键

    矩阵按键,顾名思义,就是形成矩阵按键,一般由多行多列组成,如下图是一个4*4的矩阵按键;如果是
    发表于 11-14 16:21 3次下载
    【<b class='flag-5'>51</b><b class='flag-5'>单片机</b>】<b class='flag-5'>矩阵</b><b class='flag-5'>按键</b>

    基于51单片机矩阵按键学习

    矩阵按键就是独立按键的结合体,矩阵按键的优点是提高了I/O端口的利用率,用M+N个I/O端口就可以控制M×N个独立
    发表于 11-23 16:36 17次下载
    基于<b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>矩阵</b><b class='flag-5'>按键</b>学习

    51单片机 矩阵按键控制数码管显示0~F

    通过按下4*4矩阵按键让数码管显示对应的数值#include <reg52.h>typedef unsigned char u8;typedef unsigned int
    发表于 11-23 16:36 7次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b> <b class='flag-5'>矩阵</b><b class='flag-5'>按键</b>控制数码管显示0~F

    基于51单片机矩阵按键驱动

    ;/*功能 :判断按键是否按下参数 :<unsigned int>函数 readButtonDown 的返回值<unsigned char>从0开始的位置表示结果 :按下时为真 没按下时为假*/#define BUTTON_DOWN_IF(Button
    发表于 11-23 17:06 13次下载
    基于<b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>矩阵</b><b class='flag-5'>按键</b>驱动

    基于51单片机矩阵按键检测数码管显示电路图及程序

    本资源内容概要: 这是基于51单片机矩阵按键检测数码管显示设计包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开) 。 本资源适合人群:
    发表于 08-28 15:18 0次下载

    基于51单片机矩阵按键LM386放大数码管显示电子琴设计

    本资源内容概要: 这是基于51单片机矩阵按键 LM386放大数码管显示电子琴设计包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开)、元件
    发表于 11-10 17:22 4次下载