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

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

矩阵键盘

一.基础知识

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

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

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

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

状态机法三行按键法

后面会详细介绍!
【蓝桥杯_学习_51单片机】矩阵键盘 状态机法

上图是矩阵键盘的电路图,我们通过电路图来对矩阵键盘的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;
}

状态机法

状态转移图如下:
【蓝桥杯_学习_51单片机】矩阵键盘 状态机法
状态机法代码如下:

//矩阵键盘 - 状态机法
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按键计数的功能!文章来源地址https://www.toymoban.com/news/detail-408741.html

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

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

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

相关文章

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

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

    2023年04月10日
    浏览(46)
  • 51单片机入门——矩阵键盘(附51代码)

    硬件如图非常简单,将一个4*4的矩阵键盘的8个管脚引到端子上,在连接到8个I/O口上,ARRAY_H代表着行,ARRAY_L代表着列,当行与列的电平都置低的时候,就选中的相应的矩阵按键,比如当s1按下时,ARRAY_H1会置低,其他ARRAY_H给高电平,那么选中的就是第一行,然后到列,ARRAY_

    2024年02月11日
    浏览(40)
  • 51单片机(六)矩阵键盘和矩阵键盘密码锁

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

    2024年02月04日
    浏览(49)
  • 6.51单片机之矩阵键盘

    👻 1.矩阵键盘的介绍 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态。 结构:在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条

    2024年02月07日
    浏览(42)
  • 51单片机矩阵键盘——LCD1602显示

    本次的实验需要用到LCD1602液晶屏,需要用到LCD1602.c 与LCD1602.h文件链接: https://download.csdn.net/download/YLG_lin/86404949 使用矩阵键盘随意按下按键,LCD1602第二行前两位就会显示对应按键按下的数字。 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用

    2023年04月09日
    浏览(42)
  • 51单片机实现矩阵键盘密码锁

    使用51单片机的矩阵键盘模块以及led1602显示屏,实现模拟密码锁。 当程序烧录到单片机中后,led1602屏幕会显示文字。 第一行会显示单词“PASSWORD”,第二行显示4个0,表示我们要写入的四位密码,每位默认为0。 矩阵键盘前两行与第三行的前两个分别代表输入1-9与0,第三行第

    2024年02月03日
    浏览(55)
  • 51单片机矩阵键盘——数码管显示

    当我们熟悉了数码管的位选与段选,并了解的矩阵键盘的扫描之后就可以编写程序了。 按下矩阵键盘S1并松开,数码管第一位(LED8)显示0;按下矩阵键盘S2并松开,数码管第一位显示1;...按下矩阵键盘S16并松开,数码管第一位显示F; 矩阵键盘扫描(输入扫描)     原理:

    2024年02月11日
    浏览(52)
  • 如何在51单片机上实现矩阵键盘功能

    本文详细介绍了在51单片机上实现矩阵键盘功能的方法,包括按键检测、消抖处理和键值映射等关键步骤。通过本文的学习,你将能够掌握在嵌入式系统中处理矩阵键盘输入的技术。

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

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

    2024年02月02日
    浏览(36)
  • 51单片机设计16个按键的矩阵键盘

    首先如图所示导入各个元器件,并连线。 因为P3口连接着矩阵键盘,所以上来要先付个初值,从高位到低位H0,H1,H2,H3,L0,L1,L2,L3的值是11110000,高位全是1,低位全是0,十六进制就是0xF0,也就是P3=0xF0。如果有按键按下了,肯定就不是这个值了。 比如说: 第一行789+中的任何一个按

    2024年02月05日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包