蓝桥杯单片机学习日记3-矩阵键盘的使用,线反转法,三步消抖,按键长按与短按

这篇具有很好参考价值的文章主要介绍了蓝桥杯单片机学习日记3-矩阵键盘的使用,线反转法,三步消抖,按键长按与短按。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

此片文章用于记录蓝桥杯单片机的学习

篮球杯单片机上的矩阵按键原理图如下:

蓝桥杯单片机学习日记3-矩阵键盘的使用,线反转法,三步消抖,按键长按与短按

  使用矩阵键盘时,要将跳线帽J5跳至KBD模式。

  值得注意的是,若开发板上的单片机使用的为STC15,那么以上原理图适用。如果单片机为IAP15,则在上述原理图中,要将P36换成P42,P37换成P44。

  修改如下(IAP15):

蓝桥杯单片机学习日记3-矩阵键盘的使用,线反转法,三步消抖,按键长按与短按

   常用的矩阵键盘扫描方式有行扫描法和线反转法,在比赛过程中,为了提高键盘的扫描速度和程序的运行效率,这里建议采用三步消抖法加线反转法,这样程序运行效率较高,并且支持按键的短按和长按。

  线反转法原理简单,配合三步消抖即可支持按键的快速扫描和长按与短按。

  矩阵键盘程序如下:

KET4X4.c(IAP15)

#include <STC15F2K60S2.H>
#define u8 unsigned char
#define KEY_4X4  //定义KEY_4X4就代表使用矩阵按键模式
#ifdef KEY_4X4
u8 Key_4_value;          //用来记录键值
bit Key_time_falg;       //用来做为计时标志位
unsigned long Key_time;  //用来记录按键按下的时间,进而判断是长按还是短按

u8 Key_scan4x4() {
  u8 Key_temp, Key_value;
  P3 = 0x0f;
  P42 = 0;
  P44 = 0;
  Key_temp = (P3 & 0x0f);
  switch (Key_temp) {
    case (0x07): Key_value = 4; break;  //第四行按下  0000 0111
    case (0x0b): Key_value = 5; break;  //第三行按下  0000 1011
    case (0x0d): Key_value = 6; break;  //第二行按下  0000 1101
    case (0x0e): Key_value = 7; break;  //第一行按下  0000 1110
    default: Key_value = 0; break;
  }
  P3 = 0xf0;  //1111 0000
  P42 = 1;
  P44 = 1;
  Key_temp = (P3 & 0xf0);
  if (P44 == 0) {  //第一列按下
    Key_value = Key_value;
  } else if (P42 == 0) {  //第二列按下
    Key_value = Key_value + 4;
  } else if (Key_temp == 0xd0) {  //第三列按下
    Key_value = Key_value + 8;
  } else if (Key_temp == 0xe0) {  //第四列按下
    Key_value = Key_value + 12;
  }

  return Key_value;
}
void Read_key4x4() {
  u8 Key_up, Key_down, Key_temp;
  static u8 Key_old = 0;

  Key_temp = Key_scan4x4();
  Key_down = Key_temp & (Key_old ^ Key_temp);  //三步消抖法,Key_donw是按键按下的键值 Key_up是按键弹上的键值 Key_old用来记录上一次的键值
  Key_up = ~Key_temp & (Key_old ^ Key_temp);
  Key_old = Key_temp;

  if (Key_down)  //如果需要在按键按下就立马执行 则可以在这里对把Key_donw的值给Key_4_value
  {
    Key_time_falg = 1;  //开始计时
  }
  if (Key_up)  //这里是按键按下 并松手了才执行
  {
    Key_time_falg = 0;    // 已松手 结束计时
    if (Key_time >= 500)  //  如果按下的时间大于500,则为长按 否则为短按
    {
      Key_4_value = Key_up + 100;
      Key_time = 0;
    } else {
      Key_4_value = Key_up;
      Key_time = 0;
    }
  }
}
#endif

KET4X4.h

#ifndef _KEY4X4_H_
#define _KET4X4_H_
#define u8 unsigned char

u8 Key_scan4x4();
void Read_key4x4();

#endif

现在,在主程序中配置好定时器和中断即可:

Main.c

#include <STC15F2K60S2.H>
#include "intrins.h"
// #include "74LS138.h"
// #include "Key4.h"
#include "KEY4X4.h"
extern u8 Key_4_value;          //记录键值
extern unsigned long Key_time;  //记录按下的时间
extern bit Key_time_falg;       //计时标志位
void Timer0Init(void)           //1毫秒@11.0592MHz
{
  AUXR |= 0x80;  //定时器时钟1T模式
  TMOD &= 0xF0;  //设置定时器模式
  TMOD |= 0x01;  //设置定时器模式
  TL0 = 0xCD;    //设置定时初值
  TH0 = 0xD4;    //设置定时初值
  TF0 = 0;       //清除TF0标志
  EA = 1;
  ET0 = 1;
  TR0 = 1;  //定时器0开始计时
}
void main() {
  //  init_ls138();               // 上电关闭所有外设
  Timer0Init();
  while (1) {
    if (Key_4_value == 11)          //按键S11被按下
    {                               /*做事情*/
    } else if (Key_4_value == 10)   //按键S10被按下
    {                               /*做事情*/
    } else if (Key_4_value == 18)   //按键S18被按下
    {                               /*做事情*/
    } else if (Key_4_value == 19)   //按键S19被按下
    {                               /*做事情*/
    } else if (Key_4_value == 111)  //按键S11被长按
    {                               /*做事情*/
    } else if (Key_4_value == 110)  //按键S10被长按
    {                               /*做事情*/
    } else if (Key_4_value == 118)  //按键S18被长按
    {                               /*做事情*/
    } else if (Key_4_value == 119)  //按键S19被长按
    {                               /*做事情*/
    }
  }
}
void Tim0_interrupt() interrupt 1 {
  static u8 i = 0;
  TL0 = 0xCD;  //设置定时初值
  TH0 = 0xD4;  //设置定时初值
  i++;
  if (Key_time_falg == 1) {
    Key_time++;
  }
  if (i >= 10) {  //10ms按键扫描一次
    Read_key4x4();
    i = 0;
  }
}

  在程序中,只需要判断KEY-4-value的值即可分辨按键哪个被按下,分别对应S4~S19,长按的键值为原本的键值加上100。

蓝桥杯单片机学习日记1-LED 蜂鸣器 继电器 数码管的简单驱动

蓝桥杯单片机学习日记2-独立按键的短按,长按的使用文章来源地址https://www.toymoban.com/news/detail-409910.html

到了这里,关于蓝桥杯单片机学习日记3-矩阵键盘的使用,线反转法,三步消抖,按键长按与短按的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 51单片机学习--矩阵键盘、电子密码锁

    矩阵键盘的模块原理图: 功能:按下矩阵按键,在LCD上显示对应的数值。 采用模块化编程,在此只给出MatrixKey.c 和 main.c 两部分代码 这里要注意必须先判断KeyNum是否为0,否则while不断循环会不断显示0,导致看不到按下按钮显示的数字 要利用写好的矩阵键盘来制作一个密码锁

    2024年02月16日
    浏览(56)
  • 蓝桥杯单片机比赛学习:3、独立按键与矩阵按键的基本原理

    首先我们看一下按键的原理图,如图1,当J5中的2,3接在一起的时候,红线标注就是一个完整的电路图,此时只有s4、s5、s6、s7按键可以使用,也就是独立按键。例如:当我们按下s4时, 电路导通,P33引脚被拉为低电平0 ,此时我们读取P33引脚电平的高低就能判断出哪个按键被按

    2024年02月06日
    浏览(51)
  • 51单片机矩阵键盘扫描及使用方法

             矩阵键盘 ,也称矩阵按键,是为了节约单片机IO口占用所引入的一种外设。 (图片截取至普中A2开发板原理图) (图片截取至普中A2开发板实物图)         我们知道,一个独立按键需要1个IO口。但是如果我们需要大量的按键,则需要大量的IO口,但是单片机

    2024年02月02日
    浏览(38)
  • 51单片机入门教程__矩阵键盘的使用

    一、矩阵键盘的使用 1、在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或主列的“扫描”,就可以读出任何位置按键的状态(扫描快速) 2、原理图 3、 扫描的区分 数码管通过快速循环不同位数,实现数码管同时显示的效果,而矩阵键

    2024年02月16日
    浏览(52)
  • 二、51单片机 使用Proteus仿真掌握矩阵键盘(仿真及代码)

    学习内容:通过proteus实现对51单片机矩阵的掌握 1 、键盘接口设计。键盘——向单片机输入数据、命令等功能,是人机对话的主要手段。由若干按键按照一定规则组成。每一个按键实质上是一个按键开关,按构造可分为有触点开关按键和无触点按键。有触点开关按键常见的有

    2024年02月11日
    浏览(44)
  • 使用51单片机的矩阵键盘和LCD1602做一个密码锁

    文章目录 前言 一、工具准备 工具一:51单片机 工具二:LCD1602液晶显示屏 工具三:Keil软件 二、开始操作 1.LCD1602的程序调试 2.矩阵键盘的程序调试 3.密码锁程序设计 总结 51单片机是一种8位的可编程控制元件,广泛应用于各种工业生产、家电中。51单片机的厂家有很多,如

    2023年04月09日
    浏览(44)
  • 蓝桥杯单片机(三)矩阵按键

    上章说了独立按键 蓝桥杯单片机(二)独立按键 这章说一下矩阵按键 所谓矩阵按键,就是每一个按键的两端都同时由单片机的IO口进行控制,如原理图所示,上图要想使用矩阵按键,就需要使用跳线帽将排针2引脚和1引脚连接在一起。 连接好了以后,这四排四列就可以看成四列

    2024年02月11日
    浏览(53)
  • 51单片机矩阵键盘

    目录 前言 一、矩阵键盘扫描 二、LCD1602显示矩阵键盘键值 三、趣味小项目——密码锁 总结          矩阵键盘的原理很浅显易懂,不涉及任何寄存器,就是纯线路连接。         矩阵键盘的内部接线图如下:         不难看出其组成就是多个独立按键彼此相连形成,在

    2024年02月08日
    浏览(64)
  • 51单片机--矩阵键盘

    一、接线(4×4) 将16个键盘排成4行4列,第一行将每个按键的一端连接在一起构成行线,第一列将每个按键的另一端连接在一起构成列线,所以共有4行4列8根线,连接到单片机的GPIO口。 二、原理 总体来说检测该键对应IO口是否为低电平。 1、检测时,先将一行设为低电平,其

    2024年02月11日
    浏览(42)
  • 单片机矩阵键盘扫描

    本讲任务:       了解矩阵键盘检测原理及如何获得键盘扫描值。 逐行扫描:       我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。

    2024年02月14日
    浏览(55)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包