【蓝桥杯_学习_51单片机】矩阵键盘 状态机法

news2024/12/23 4:03:50

矩阵键盘

一.基础知识

  • 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式
  • 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态
    矩阵键盘和独立按键一样,也需要进行消抖处理!
    于此补充一下抖动的含义:

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动

20230130_1

消抖的话,我们采用两种方式:

状态机法三行按键法

后面会详细介绍!
20230130_2

上图是矩阵键盘的电路图,我们通过电路图来对矩阵键盘的IO口进行分析!
其中P30,P31,P32,P33来控制矩阵键盘的行,P34,P35,P42,P44来控制矩阵键盘的列。

接下来介绍一下我们的编程思路:
(1) 给控制矩阵键盘的四位赋值为0,检测控制矩阵键盘的四位中哪一位为0,由此确定按键所在
(2) 给控制矩阵键盘的四位赋值为0,检测控制矩阵键盘的四位中哪一位为0,由此确定按键所在
(3) 根据行和列,确定按键的位置
选(1)(2)中(1)步骤来进行分析:

P30=0,P31=0,P32=0,P33=0;
P34=1,P35=1,P42=1,P44=1;
//可以看出上述赋值操作略微有些繁琐,我们进行简化
P3 = 0xF0;
P4 = 0xFF;
//这样赋值可以实现异曲同工之妙!

赋值之后,进行选择判断操作

if(P34==0){
    //...
}
if(P35==0){
    //...
}
if(P44==0){
    //...
}
if(P44==0){
    //...
}

获取键值

关键代码如下:

//矩阵键盘_获取键值
u8 KBD_KeyIO()
{
	u8 key_io = 0;
	P3 = 0xf0,P4 = 0xff;	//列扫描,低四位输出0,读取高四位的值
	if(P44==0)
	{
		key_io = 4;
	}
	if(P43==0)
	{
		key_io = 8;
	}
	if(P35==0)
	{
		key_io = 12;
	}
	if(P34==0)
	{
		key_io = 16;
	}
	
	P3 = 0x0f,P4 = 0x00;//行扫描,高四位输出0,读取低四位的值
	if(P33==0)
	{
		key_io = key_io + 0;
	}
	if(P32==0)
	{
		key_io = key_io + 1;
	}
	if(P31==0)
	{
		key_io = key_io + 2;
	}
	if(P30==0)
	{
		key_io = key_io + 3;
	}
	return key_io;
}

状态机法

状态转移图如下:
20230202_1
状态机法代码如下:

//矩阵键盘 - 状态机法
u8 vKBD_KeyIO()
{
	u8 key_io = 0;
	P3 = 0xf0;P4 = 0xff;	//列扫描
	if(P44==0) key_io = 4;
	if(P42==0) key_io = 8;
	if(P35==0) key_io = 12;
	if(P34==0) key_io = 16;
	
	P3 = 0x0f;P4 = 0x00;	//行扫描
	if(P33==0) key_io += 0;
	if(P32==0) key_io += 1;
	if(P31==0) key_io += 2;
	if(P30==0) key_io += 3;
	
	return key_io;
}

#define KEY_NO 0	//无按键状态
#define KEY_DOWN 1	//有按键按下状态,判断是否为抖动
#define KEY_UP 2	//等待松手状态,判断是否弹起
u8 vKBD_Read_State()
{
	static u8 key_state = 0;
	u8 key_io = 0,key_return = 0;
	key_io = vKBD_KeyIO();
	switch(key_state)
	{
		case KEY_NO:						//无按键状态,用于判断是否按下
			if(key_io) key_state = KEY_DOWN;
		break;
		case KEY_DOWN:						//有按键按下状态,判断是否为抖动
			if(key_io)
			{
				key_state = KEY_UP;
				key_return  = key_io;
			}
			else
			{
				key_state = KEY_NO;
			}
		break;
		case KEY_UP:
			if(key_io == 0)					//等待松手状态,判断是否弹起
			{
				key_state = KEY_NO;
			}
		break;
	}
	return key_return;
}

//矩阵键盘处理函数
u8 cnt_kbd;
u8 s4_number;
u8 key_val;
void vKBD_Process(void)
{
	if(cnt_kbd>=10)
	{
		cnt_kbd = 0;
		key_val = vKBD_Read_State();
		if(key_val==4)
		{
			s4_number++;
		}
	}
}

以上核心代码实现了检测按键和S4按键计数的功能!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/196206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++之基础入门一

一、c的初始化typedef struct student {int age;char name[10];int num; }student;int main() {//在c中可以利用花括号进行初始化struct student student1{12,"zs",123456 };int a 10, b 20;int b{ 20 }, a{ 10 };double c{ 20 };int* p{ nullptr };int arr[10]{ 1…

Day877.数据空洞 -MySQL实战

数据空洞 Hi,我是阿昌,今天学习记录的是关于数据空洞的内容。 数据库占用空间太大,把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变? 一个 InnoDB 表包含两部分,即: 表结构定义数…

我通过 tensorflow 预测了博客的粉丝数

前言:由于最近接触了 tensorflow.js,出于试一下的心态,想通过线性回归预测一下博客的粉丝走向和数量,结果翻车了。虽然场景用错地方,但是整个实战方法用在身高体重等方面的预测还是有可行性,所以就记录下来…

亚马逊云科技助力游戏上云学习心得-增长篇

云服务已经是大势所趋了,通过购置传统服务器来进行应用开发,无法与现代化敏捷的开发方法相结合,对于系统运维的难度也大大增加,而云服务的弹性伸缩、动态计费可以很好地帮助中小企业实现快速应用开发,使得产品的价值最…

LeetCode题目笔记——1337. 矩阵中战斗力最弱的 K 行

文章目录题目描述题目难度——简单方法一:暴力,统计代码/Python方法二:优化代码总结彩蛋题目描述 给你一个大小为 m * n 的矩阵 mat,矩阵由若干军人和平民组成,分别用 1 和 0 表示。 请你返回矩阵中战斗力最弱的 k 行…

Dubbo服务方消费方通信案例

文章目录Maven_服务方Maven_服务消费方测试通信使用注册中心自动找服务设置超时时间重试次数单独设置某个方法不可重试处理多版本的问题本地存根策略负载均衡策略Dubbo高可用服务降级服务降级实现方式Maven_服务方 pom文件&#xff0c;注意依赖的版本。 <properties><…

《无线电发射设备管理规定》解读

2022年12月22日&#xff0c;工业和信息化部公布了《无线电发射设备管理规定》&#xff08;工业和信息化部令第57号&#xff0c;以下简称《规定》&#xff09;。为了更好地理解和执行《规定》&#xff0c;工业和信息化部产业政策与法规司负责同志对《规定》进行了解读。 问题一 …

7.卷积神经网络

7.卷积神经网络 目录 从全连接层到卷积图像卷积 互相关运算&#xff08;手撕卷积&#xff09;卷积层图像中目标的边缘检测学习卷积核 填充和步幅 填充Padding步幅stride 多输入多输出通道 多输入通道多输出通道11 卷积层总结 池化层 最大池化层和平均池化层填充和步幅多个通道…

Matlab 与 Excel 文件的交互

事实上&#xff0c;excel可以解决绝大多数的建模问题&#xff0c;只不过&#xff0c;更加复杂。。。而且难以操作。。。其实可以看看excel的 功能还是很多的不过嘛 术业有专攻的 有专攻的多主体 NetLogo仿真 Comsol 。。。Excel 文件写入向量与张量的excel写入xlswrite(<pat…

JTAG 基础和svf specification介绍

参考&#xff1a; https://www.youtube.com/watch?vUuDf3q5aBjM https://zh.m.wikipedia.org/zh-cn/JTAG浅谈dft之boundary scan JTAG: Joint Test Action Group是开发IEEE 1149.1的工作组&#xff0c;1149.1定义了一个测试开发版上芯片的标准。现在变成了芯片的一个最常见…

yolov5增加iou loss,无痛涨点trick

yolo无痛涨点trick&#xff0c;简单实用 先贴一张最近一篇论文的结果 后来的几种iou的消融实验结果在一定程度上要优于CIoU&#xff0c;最新的WIoU暂时还没复现。 本文将在yolov5的基础上增加SIoU&#xff0c;EIoU&#xff0c;Focal-XIoU&#xff08;X为C,D,G,E,S等&#xff09…

使用Kindling 观测 Kubernetes 应用网络连接状态

kindling介绍&#xff1a; Kindling 解决的是&#xff0c;在不入侵应用的前提下&#xff0c;如何观测网络的问题&#xff0c;其功能主要是通过暴露内核事件来实现观测。如果主机内核版本高于 4.14&#xff0c;可以使用 eBPF 模块&#xff1b;如果主机内核是低版本&#xff0c;…

多级缓存实现

多级缓存实现1.什么是多级缓存2.JVM进程缓存2.1.导入案例2.2.初识Caffeine2.3.实现JVM进程缓存2.3.1.需求2.3.2.实现3.Lua语法入门3.1.初识Lua3.1.HelloWorld3.2.变量和循环3.2.1.Lua的数据类型3.2.2.声明变量3.2.3.循环3.3.条件控制、函数3.3.1.函数3.3.2.条件控制3.3.3.案例4…

俯卧撑计数 opencv-python + mediapipe

分享一个国外的趣味项目&#xff0c;可以计数&#xff0c;也可以完善进行动作是打分&#xff0c;确定标准程度 原文链接&#xff1a;https://aryanvij02.medium.com/push-ups-with-python-mediapipe-open-a544bd9b4351 程序原理介绍 在新加坡军队中&#xff0c;有一种测试叫做…

程序股票交易接口怎么撤单?

在程序股票交易接口的开发基础上&#xff0c;还能增加一个撤单的委托模块&#xff0c;因为程序股票交易接口的开发不单单是委托下单&#xff0c;那照样也能撤单&#xff0c;这两种的开发原理上&#xff0c;都不冲突&#xff0c;有的股票接口需要计算多种算法&#xff0c;算起来…

CNCAP2021法规adas功能场景

CNCAP2021法规adas功能场景概述功能介绍试验场景概述 C-NCAP是中国汽车技术研究中心于2006年3月2日正式发布的首版中国新车评价规程。中国新车评价规程每三年进行一次规程改版&#xff0c;最新的是2021版本。本文只针对cncap2021主动安全场景进行梳理。 功能介绍 1、AEB(Aut…

vue2低代码平台搭建(三)组件间交互的实现

前言 大家好,我是L丶Y,我们在上一篇文章中主要介绍了低代码平台的页面设计器相关的一些功能原理,打通了页面设计器顶部操作栏、左侧组件列表,中间画布、右侧属性配置四个部分的关系。能够实现组件列表的展示、组件到画布的拖动,属性配置修改对组件渲染效果影响,并说明了…

Picgo配置Bilibili图床

Picgo 配置Bilibili 图床 picgo-plugin-bilibili 为 PicGo 开发的一款插件&#xff0c;新增了B站图床 图床。 使用用户动态的图片上传API。填写SESSDATA即可&#xff0c;获取方式在下面。 文章目录Picgo 配置Bilibili 图床在线安装获取B站SESSDATA图片样式解决B站防盗链&#…

隐函数及参数方程求导——“高等数学”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是隐函数求导和参数方程求导&#xff0c;下面&#xff0c;就让我们进入求导数的世界吧 一、隐函数的导数 二、隐函数求导 三、由参数方程确定的函数的导数 四、相关变化率 一、隐函数的导数 要想知道隐函数…

官宣:计算中间件 Apache Linkis 正式毕业成为 Apache 顶级项目

Apache 软件基金会&#xff08;ASF&#xff09;孵化器于2022年12月03日&#xff0c;通过了 Apache Linkis 计算中间件项目的孵化毕业投票。2023年01月18日&#xff0c;Apache 软件基金会官方宣布 Apache Linkis 顺利毕业&#xff0c;成为 Apache 顶级项目&#xff08;TLP&#…