蓝桥杯单片机学习4——独立按键&矩阵按键

这篇具有很好参考价值的文章主要介绍了蓝桥杯单片机学习4——独立按键&矩阵按键。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上期学习了数码管的静态显示,这次我们来学习独立按键&矩阵按键

独立按键

蓝桥杯单片机学习4——独立按键&矩阵按键

原理很简单,当作为独立按键使用时,跳线帽的23接在一起,此时按键如果按下,则按键连接的IO口电平会被拉低,通过捕获IO的电平变化,就可以判断按键是否按下。

按键消抖

什么是按键消抖?按键为什么会有抖动?
蓝桥杯单片机学习4——独立按键&矩阵按键

通常的按键所用开关为机械弹性开关。由于机械触电的弹性作用,按键在闭合及断开的瞬间均伴随有一连串的抖动。键抖动会引起一次按键被误读多次。为了确保CPU对键的一次闭合仅作一次处理,必须去除抖动。
如何消抖?
硬件消抖:硬件消抖的典型做法是:采用 R-S触发器 或RC积分电路。在没有MCU的情况下通常使用这种方法,但在嵌入式开发中,我们比较常用的时软件消抖。
软件消抖:软件消抖是当检测出键闭合后执行一个10ms~20ms的延时程序,再一次检测键的状态,如仍保持闭合状态,则确认真正有按键按下。

矩阵按键

蓝桥杯单片机学习4——独立按键&矩阵按键
作为矩阵按键使用时,跳线帽的12脚连接在一起。
矩阵按键的优点:可以通过比较少的IO实现对多个按键的控制,节省IO口。
缺点:在使用时需要对按键进行扫描。

扫描

对于独立按键,它的每一个IO都对应着一行或一列,通过读取按键按下时的行和列,就可以确定是哪一个按键按下。
扫描就是对按键的每一行(列)进行扫描,从而得到按键按下的行(列),从而确定是否有按键按下,以及按键按下的键码值。目前按键扫描的方法,主要分为行扫描和列扫描两种。
所谓行扫描就是,先把每一行和每一列的上的电平拉高,然后分别把每一行的电平依次拉低,去检测每一个列上的电平是否跟着被拉低,如果被拉低,说明按键按下,则可以去读到当前的行和列,计算出按下的键码值。
列扫描则和行扫描的逻辑相反,这里不做赘述。

代码实现

1.main.c

#include <STC15F2K60S2.H>
#include <INTRINS.h>
#include "Key.h"
#include "LS138.h"

//效果:当有按键按下时,会在数码管上显示当前按下按键的键码值
//当没有按键按下时,数码管会显示上一次按下的键码值
void main()
{
    unsigned int i =0;
    LS138_Init();
    Key_Init();     //初始化函数
    
	while(1)
	{
        
        if(Get_KeyBoard_Num())  //判断矩阵按键是否有按下
        {
            i = Get_KeyBoard_Num();     //如果按下则,改变当前变量的值,
        }
         SEG_Write_Num(i);              //通过数码管显示矩阵按键按下的键码值

	}
}

2.Key.h

#ifndef __KEY_H_
#define __KEY_H_
#include <STC15F2K60S2.H>
#include <INTRINS.h>

sbit Key7 = P3^0;
sbit Key6 = P3^1;
sbit Key5 = P3^2;
sbit Key4 = P3^3;

sbit Col1 = P4^4;
sbit Col2 = P4^2;
sbit Col3 = P3^5;
sbit Col4 = P3^4;

#define Row1  Key4
#define Row2  Key5
#define Row3  Key6
#define Row4  Key7

//延时函数,可以延时xms的时间
void Delayxms(unsigned int x);		//@11.0592MHz
//初始化函数
void Key_Init(void);

//按键扫描函数,由按键按下时返回值为1,否则为0
unsigned char Key_Scan(void);

//获取当前按键按下的数值,返回结果为4~7
//当没有按键按下是,返回值为0
//函数内部由两种实现方法,一直延时,一种不延时。可以按需要使用
unsigned int Get_Key_Num(void);

//获取当前矩阵按键中按下健的值
//返回值为4~19
//当没有按键按下时,返回值为0
unsigned int Get_KeyBoard_Num(void);

#endif  /*__KEY_H_*/

这里有一个Delayxms()延时函数,可以延时xms.这个不是static 修饰的,外部可调用

3.Key.c

#include "Key.h"

//延时函数,可以延时xms的时间
 void Delayxms(unsigned int x)		//@11.0592MHz
{
	unsigned char i,j,k;
    for(k=0;k<x;k++)
    {
        
        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
            while (--j);
        } while (--i);
    }
}
//初始化函数
void Key_Init(void)
{
    Key7 = Key6 = Key5 = Key4 =1;
    Col1 = Col2 = Col3 = Col4=1;
}

//按键扫描函数,由按键按下时返回值为1,否则为0
unsigned char Key_Scan(void)
{   
    static unsigned char Key_Count =0;
   if(Key7==0 | Key6==0 | Key5==0 | Key4==0 )
    {
        Key_Count++;
        Delayxms(1);
        if(Key_Count >= 100)
        {
            return 1;
            Key_Count=0;
        }
        
    }
    return 0;
}

//获取当前按键按下的数值,返回结果为4~7
//当没有按键按下是,返回值为0
//函数内部由两种实现方法,一直延时,一种不延时。可以按需要使用
unsigned int Get_Key_Num(void)
{
    #if 1       //这个是没有延时的,需要多次进入函数。
    static unsigned char  Key_Count = 0;
    if(Key7==0 | Key6==0 | Key5==0 | Key4==0 )
    {
        Key_Count++;
        Delayxms(1);
        if(Key_Count >= 100)
        {
            if(Key7 == 0)
            {
                return 7;
            }
             if(Key6 == 0)
            {
                return 6;
            }
             if(Key5 == 0)
            {
                return 5;
            }
             if(Key4 == 0)
            {
                return 4;
            }
            Key_Count=0;
        }
        
    }
    return 0;
    #if 0           //这个是有延时的,只需要进入函数一次,但是会导致系统Delay在函数内部
     if(Key7==0 | Key6==0 | Key5==0 | Key4==0 )
    {
        Delayxms(20);
        if(Key7 == 0)
        {
            while(!Key7)
            {
               
            }
             return 7;
        }
         if(Key6 == 0)
        {
            while(!Key6)
            {
               
            }
             return 6;
        }
         if(Key5 == 0)
        {
            while(!Key5)
            {
               
            }
             return 5;
        }
         if(Key4 == 0)
        {
            while(!Key4)
            {
               
            }
             return 4;
        }
    }
    else
    {
        return 0;
    }
    #endif 
}

//获取当前矩阵按键中按下健的值
//返回值为4~19
//当没有按键按下时,返回值为0
unsigned int Get_KeyBoard_Num(void)
{
    unsigned char i;
    for(i=0;i<4;i++)
    {
        P3 =0x03F;
        Col1 = Col2 = 1;
        P3 =~(0x08>>i);       //Rowi = 1;       //第一行为0
//        Delayxms(1);
        if(Col1==0 | Col2==0 | Col3==0 | Col4==0)   //扫描每一列是否有按键按下
        {
           Delayxms(20);
          if(~Col1)
          {
            return i+4;
          }
          if(~Col2)
          {
            return i+8;
          }
          if(~Col3)
          {
            return i+12;
          }
          if(~Col4)
          {
            return i+16;
          }
        }
    }
    return 0;
    
}

这里面获取独立按键的键码值的函数,我写了两种实现方式,
区别就是一个用到的软件消抖(使用了延时函数),另一个没有使用软件消抖,但是需要多次调用进入函数才可以使用,具体实现方法可以自己看代码的。需要使用哪一种方法,可以自行选择。
为什么这么写:在后面如果学习使用到了定时器的话,在函数内部进行延时,可能会影响其他对时间要求比较严格的模块。造成不必要的损失。

总结

独立按键&矩阵按键这一部分比较简单,原理也容易看懂,我这里只实现了基本的按键控制功能,大家也可以尝试着去实现,长按、短按、双击、等功能,我就不再去多写啦。好好努力吧!
蓝桥杯单片机学习4——独立按键&矩阵按键文章来源地址https://www.toymoban.com/news/detail-414223.html

到了这里,关于蓝桥杯单片机学习4——独立按键&矩阵按键的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【51单片机】LED与独立按键(学习笔记)

    LED:发光二极管 补:电阻读数 102 = 10 00 = 1k 473 = 47 000 1、新建工程:Project = New Project Ctrl + Shift + N :新建文件夹 2、选型号:Atmel-AT89C52 3、xxx提示?选否 4、Source Group = 右键 = Add New Item … = C文件\\\"main.c\\\" 5、设置勾选创建HEX File文件 6、编译 CPU通过对寄存器的控制,寄存器通过驱

    2024年02月06日
    浏览(44)
  • 51单片机——独立按键实验,小白讲解,相互学习

    按键介绍:         按键是一种电子开关,使用时轻轻按开关按钮就可式开关接通,当松手时,开关断开。开发板上使用的按键及内部简易图如下图:         按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态,如果按键按下,初始导通状态变为断

    2024年02月04日
    浏览(53)
  • 关于蓝桥杯单片机 官方例程 矩阵按键 消抖原理 ‘s 解释

    关于蓝桥杯单片机官方例程矩阵按键消抖原理解释 芯片:IAP15F2K60S 蓝桥杯原书41页官方例程 最开始我以为这款开发板有硬件消抖,对于下面这部分代码一直当作固定格式写,最近回看,发现其中另有“玄机”。 这里默认大家看过并且会了 = = 之前的按键扫描例程了 众所周知

    2023年04月08日
    浏览(36)
  • 51单片机——矩阵按键实验,小白讲解,相互学习

    矩阵按键介绍:         独立按键与单片机连接时,每一个按键都需要单片机的一个I/O 口,若某单片机系统需较多按键,如果用独立按键便会占用过多的I/O 口资源.单片机系统中I/O 口资源往往比较宝贵,当用到多个按键时为了减少I/O 口引脚,引入了矩阵按键。       

    2024年02月12日
    浏览(46)
  • 51单片机 --独立按键

    前言 前几章介绍的都是IO 口输出的使用,这一教程我们通过独立按键实验来介绍IO 口作为输入的使用。开发板上板载8 个独立按键。本教程所要实现的功能是:通过开发板上的独立按键K1 控制D1 指示灯亮灭。大家可以参考前面的实验内容。 一、按键介绍 按键是一种电子开关

    2024年02月06日
    浏览(54)
  • 单片机之独立按键(多种按键代码编写)

    单片机之独立按键原理:按键右端接GND,左边接到单片机的IO口,同时接了一个上拉电阻,当按键未按下时,P2.0为高电平(学过模电的人都应该知道为什么吧)当按键按下时,相当于P2.0口与GND相连为 低电平。

    2024年02月03日
    浏览(58)
  • 单片机独立按键扫描程序

    为了方便,写一些方便的程序片段以便以后使用 首先是定时器扫描按键给两个例子: 一: 二:

    2024年02月16日
    浏览(46)
  • 四、51单片机控制独立按键

    按键相关知识。 1.1、按键工作原理 (1)按键内部是机械结构,也就是内部是没有电路的。按键对外表现位四个引脚,但本质上只是两个,引脚是两两连在一起的。按键按下内部引脚导通,松开内部断开。 (2)电路连接与原理图中图标。 按键一端接地,一端接单片机IO口。  (3)按

    2023年04月14日
    浏览(59)
  • 51单片机:独立按键控制LED灯

    1. 独立按键控制LED灯状态          亮灭实验完成后,就可以控制LED状态,首先我们知道由于机械结构的弹性作用,按键开关在闭合时不会一瞬间稳定的接通,在断开时,也不会一下子断开。所以就得需要程序消抖,也就是适当延时,程序如下 #include\\\"reg52.h\\\" //定义LED灯 sbit

    2023年04月09日
    浏览(39)
  • 51单片机(三)独立按键控制LED

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月08日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包