蓝桥杯单片机比赛矩阵按键模块(原理函数代码详解)

这篇具有很好参考价值的文章主要介绍了蓝桥杯单片机比赛矩阵按键模块(原理函数代码详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原件介绍

矩阵按键是由16个独立按键组成的,所以它的工作原理与独立按键相同。

独立按键的工作原理就是将按键的信号转换成电脑可以理解的信号,并且传输给处理器

独立按键的内部结构是一个弹性贴片,在按下松手时会有抖动,抖动的时间大概有20ms,如果不进行处理,很有可能松手的时候会出现抖动误判。所以我们在写按键程序时要加上延时消抖

蓝桥杯单片机矩阵键盘,蓝桥杯,单片机,职场和发展蓝桥杯单片机矩阵键盘,蓝桥杯,单片机,职场和发展

                 内部结构图                                                        按键抖动波形图
 

原理图

在写代码之前还是和之前一样,先看原理图。

蓝桥杯单片机矩阵键盘,蓝桥杯,单片机,职场和发展

       当J5的跳线帽插在1,2两个插针上时,S7、S6、S5、S4四个独立按键与P44口相连,使用的是矩阵键盘模式。不难看出矩阵键盘的第一、二、三、四列分别连接在P44、P42、P35、P34口上,第一、二、三、四行分别连接在P30、P31、P32、P33口上。

这时我们应该如何判断一个按键是否被按下呢?其实我们可以类比成坐标的形式,对行列同时进行判断,例如:P44==0将第一列置于低电平,如果将S7按键按下,则P30口导通,也是低电平,因此可以判断出是哪个按键按下,以此类推。

代码解析

1、矩阵键盘控制LED灯亮灭

//矩阵键盘控制LED灯亮灭
#include <STC15F2K60S2.H>

unsigned char num;

void Delayms(unsigned int ms);

void main(void)
{
    P2=0X80;P0=0XFF;P2=0XA0;P0=0X00;     //初始化,在后面会专门出一期讲初始化函数
    while(1)
    {
        unsigned char temp;
        P44=0;P42=1;P3=0X7F;    //使用第一列按键
        temp=P3;                //将P3的值赋给中间变量temp
        temp=temp&0X0F;         //0111 1111 & 0000 1111 -> 0000 1111 判断第四位是否发生变化
        if(temp!=0X0F)          //如果发生变化,则第一列有按键按下
        {
            Delayms(5);         //延时消抖
            temp=P3;            //重复赋值、判断
            temp=temp&0X0F;
            if(temp!=0X0F)
            {
                temp=P3;        //在赋值判断时temp的值发生了变化,所以要重新将P3的值赋给temp
                switch(temp)
                {
                    case 0x7e: num=1; break;        //0111 1110 一行一列按下,赋值num=1
                    case 0x7d: num=2; break;        //0111 1101 一行二列按下,赋值num=2
                    case 0x7b: num=3; break;        //0111 1011 一行三列按下,赋值num=3
                    case 0x77: num=4; break;        //0111 0111 一行四列按下,赋值num=4       
                }
            }
            while(temp!=0X0F)          //松手检测,如果有按键按下
            {
                temp=P3;               //则一直进行赋值判断,直至松手
                temp=temp&0X0F;
            }
        }
        
        if(num==1)           //按键控制LED灯亮灭
        {   P2=0X80;P0=0XFF;
            P00=0;
        }
        if(num==2)
        {   P2=0X80;P0=0XFF;
            P00=1;
        }
    }
}

void Delayms(unsigned int ms)
{
    unsigned int i,j;
    for(i=0;i<ms;i++)
        for(j=845;j>0;j--);
}

2、矩阵按键函数的使用

//矩阵按键函数的使用
#include <STC15F2K60S2.H>

unsigned char num;          //键码值

void Delayms(unsigned int ms); //函数声明
void Key16(void);

void main(void)
{                           //初始化
    P2=0X80;P0=0XFF;
    P2=0XA0;P0=0X00;
    while(1)
    {
       Key16();             //调用矩阵按键函数
       if(num==1)           //当第一个按键按下时
        {
            P2=0X80;P0=0XFF;    //打开LED573锁存器,关闭所以LED灯   初始化
            P00=0;              //点亮第一个LED灯
        }
    }
}

void Key16(void)          //矩阵键盘函数(按列扫描)
{
    unsigned char temp;
    //第一列扫描
    P44=0;P42=1;P3=0X7F;    //0111 1111 高四位是列,第四位是行
    temp=P3;                //将P3的值赋给中间变量temp
    temp=temp&0X0F;         //0111 1111 & 0000 1111 -> 0000 1111 判断第四位是否发生变化
    if(temp!=0X0F)          //如果发生变化,则第一列有按键按下
    {
        Delayms(5);         //延时消抖
        temp=P3;            //重复赋值、判断
        temp=temp&0X0F;
        if(temp!=0X0F)
        {
            temp=P3;        //在赋值判断时temp的值发生了变化,所以要重新将P3的值赋给temp
            switch(temp)
            {
                case 0x7e: num=1; break;        //0111 1110 一行一列按下,赋值num=1
                case 0x7d: num=2; break;        //0111 1101 一行二列按下,赋值num=2
                case 0x7b: num=3; break;        //0111 1011 一行三列按下,赋值num=3
                case 0x77: num=4; break;        //0111 0111 一行四列按下,赋值num=4       
            }
        }
        while(temp!=0X0F)          //松手检测,如果有按键按下
        {
            temp=P3;               //则一直进行赋值判断,直至松手
            temp=temp&0X0F;
        }
    }
    //第二列扫描,逻辑原理与第一列相似
    P44=1;P42=0;P3=0XBF;    //0111 1110
    temp=P3;
    temp=temp&0X0F;
    if(temp!=0X0F)
    {
        Delayms(5);
        temp=P3;
        temp=temp&0X0F;
        if(temp!=0X0F)
        {
            temp=P3;
            switch(temp)
            {
                case 0xbe: num=5; break;
                case 0xbd: num=6; break;
                case 0xbb: num=7; break;
                case 0xb7: num=8; break;               
            }
        }
        while(temp!=0X0F)
        {
            temp=P3;
            temp=temp&0X0F;
        }
    }
    //第三列扫描
    P44=1;P42=1;P3=0XDF;    //0111 1110
    temp=P3;
    temp=temp&0X0F;
    if(temp!=0X0F)
    {
        Delayms(5);
        temp=P3;
        temp=temp&0X0F;
        if(temp!=0X0F)
        {
            temp=P3;
            switch(temp)
            {
                case 0xde: num=9; break;
                case 0xdd: num=10; break;
                case 0xdb: num=11; break;
                case 0xd7: num=12; break;               
            }
        }
        while(temp!=0X0F)
        {
            temp=P3;
            temp=temp&0X0F;
        }
    }
    //第四列扫描
    P44=1;P42=1;P3=0XEF;    //0111 1110
    temp=P3;
    temp=temp&0X0F;
    if(temp!=0X0F)
    {
        Delayms(5);
        temp=P3;
        temp=temp&0X0F;
        if(temp!=0X0F)
        {
            temp=P3;
            switch(temp)
            {
                case 0xee: num=13; break;
                case 0xed: num=14; break;
                case 0xeb: num=15; break;
                case 0xe7: num=16; break;               
            }
        }
        while(temp!=0X0F)
        {
            temp=P3;
            temp=temp&0X0F;
        }
    }
}

void Delayms(unsigned int ms)
{
    unsigned int i,j;
    for(i=0;i<ms;i++)
        for(j=845;j>0;j--);
}

以上就是我对矩阵按键模块的全部理解,如有不对之处,还希望大家留言指正。有什么好的建议也可以留言。文章来源地址https://www.toymoban.com/news/detail-734478.html

到了这里,关于蓝桥杯单片机比赛矩阵按键模块(原理函数代码详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机——矩阵按键模块

    主要目的 学会按键扫描 1.延时函数 延时函数部分详见链接: 单片机控制一盏灯的亮与灭程序解释 这个程序里面的延时函数的目的是按键消抖。 2.按键扫描模块 这是本次实验的重点,将详细介绍。 先来观察矩阵按键模块的连接 总共8个口。 先实现关于列的扫描,设置初始值(

    2024年02月08日
    浏览(37)
  • 蓝桥杯单片机比赛学习:9、PCF8591的基本原理和使用方法

    前面一节我们说了PWM呼吸灯的基本原理和使用方法,下面我们来看第二个模块,也是蓝桥杯单片机比赛中常考的一个模块——PCF8591。 我主页有其他模块的使用方法和基本原理(2条消息) Do My Best的博客_CSDN博客-蓝桥杯单片机比赛学习领域博主 PCF8591实际上就是一个具有 I2C 总线

    2024年02月02日
    浏览(43)
  • 蓝桥杯单片机比赛学习:12、DS1302时钟基本原理与使用方法

    DS1302是 DALLAS 公司推出的时钟芯片,内含一个实时时钟/日历和 31字节静态 RAM,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。 但是在我们比赛中一般只需要写/读时钟。 DS1302可以采

    2024年02月02日
    浏览(45)
  • 蓝桥杯单片机开发及应用-基础模块06-矩阵键盘

    使用到的74HC138译码器、74HC573锁存器和数码管模块等,在前面的基础模块的介绍中都有简单介绍,这里就不再介绍了。 蓝桥杯板子上按键部分的右下角有个J5模块,用跳帽来进行独立按键和矩阵键盘之间的切换。此次使用矩阵键盘的时候需要把跳帽接到1~2引脚。 矩阵键盘就是

    2024年02月03日
    浏览(42)
  • 蓝桥杯单片机学习日记3-矩阵键盘的使用,线反转法,三步消抖,按键长按与短按

    此片文章用于记录蓝桥杯单片机的学习 篮球杯单片机上的矩阵按键原理图如下:   使用矩阵键盘时,要将跳线帽J5跳至KBD模式。   值得注意的是,若开发板上的单片机使用的为STC15,那么以上原理图适用。如果单片机为IAP15,则在上述原理图中,要将P36换成P42,P37换成P44。  

    2023年04月10日
    浏览(46)
  • 【51单片机】矩阵按键

    参考:普中 51 单片机开发攻略 main.c 只有第一个数码管量,并且按第几个键,就显示第几(0-F)。

    2024年01月21日
    浏览(58)
  • 51单片机 | 矩阵按键实验

      开发板上板载了一个 4*4 矩阵键盘。本节所要实现的功能是:通过开发板上的矩阵键盘控制静态数码管显示对应的键值 0-F 。   独立按键与单片机连接时,每一个按键都需要单片机的一个 I/O 口,若某单片机系统需较多按键,如果用独立按键便会占用过多的 I/O 口资源。

    2024年02月05日
    浏览(47)
  • 五、51单片机控制矩阵按键

    1.1、矩阵按键原理分析 这里矩阵按键为4*4的矩阵按键。 (1)矩阵按键横向和纵向分割。 (2)按键两端分别接不同的IO引脚。 (3)按键物理作用不变:按下按键两端接通,弹起按键两端断开。 1.2、矩阵按键的工作过程 JP4接P3端口,JP4_8接P3^7...JP4_1接P3^0。 (1)IO端口(P3)先输出0x0f,按键列

    2023年04月20日
    浏览(60)
  • 蓝桥杯单片机类按键代码讲解和考点探究(三行代码消抖讲解)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 CON3中将1,2用跳线帽短接是矩阵键盘,可用范围为S4到S19。将2,3短接则是独立按键,可用范围是S4到S7. 按键原理讲解 单取一个按键,一端接到GND,一段接到单片机的IO口上(以下称I口,输入口)。当按

    2023年04月20日
    浏览(67)
  • 51单片机:数码管和矩阵按键

    目录 一:动态数码管模块 1:介绍  2:共阴极和共阳极 A:共阴极 B:共阳极 C:转化表  3:74HC138译码器 4:74HC138译码器控制动态数码管(位选) 5:数码管显示完整代码 6:74HC573锁存器 A:基本点 B:原理图介绍 c:74HC573控制数码管代码 二:矩阵按键模块 1:介绍 2:原理图  3:矩阵按键代码       

    2024年02月15日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包