stm32 HAL库 4X4 矩阵键盘 附原理图和C语言代码

您所在的位置:网站首页 单片机3*3矩阵按键原理图及代码详解 stm32 HAL库 4X4 矩阵键盘 附原理图和C语言代码

stm32 HAL库 4X4 矩阵键盘 附原理图和C语言代码

2024-07-15 23:06:27| 来源: 网络整理| 查看: 265

目录

原理图:

鉴于最近实训,需要写一份矩阵键盘的代码,看到网上大部分矩阵键盘不是很方便修改引脚,遂自己手敲了一份,可以随便修改引脚的代码方便移植。

不过我是直接把函数写在了main函数的while循环里,没有消抖,有需求的同志可以自行添加,或者可以进行一点修改放到定时器里也可以。这里只把代码放出来供大家参考学习,有错误也请各位大佬指出,一起学习。

原理图:

使用的是立创EDA专业版,单片机使用的是stm32C8T6,OLED和HX177可以忽略,主要还是看矩阵键盘。左下角哪个8P的排针是留给矩阵键盘模块用的,我为了以防万一预留的,他跟键盘主体其实是一个东西,可以不用管。

这里简述一下原理,矩阵键盘原理就是动态扫描,Key0-3配置为输出,Key4-7配置成上拉输入,一定要是上拉输入。

首先Key3输出低电平(扫描哪一行就把那一行拉低),Key0-2输出高电平,记为0x07(行);然后检测Key4-7的输入,举个栗子,假设SW1按下,因为Key3行我们输出低电平,同时1脚和3脚导通,所以Key4就被拉低了,读引脚就会读出低电平,而其他没有被按下的并没有导通,所以他们还是高电平,就可以记为0x07(列);同理,SW5、9、13按下时分别为0x0b(列)、0x0d(列)和0x0e(列),就可以判断出第一行是哪个按键被按下,要是都没被按下就是0x0f(列)。

然后同理扫描Key2、Key1、Key0行,分别是0x0b(行)、0x0d(行)和0x0e(行),再次重复判断哪一列被按下后就可以得到16个按键的情况了。

代码 key.c #include "key.h" uchar key_scan; //键盘扫描的值 /********* * *函数:按键GPIO输出重写 * *传参:key(0-3):按键号; lev(0/1);电平高低 * *例:Key_GpioOut(0, 1) Key_0置高 *********/ void Key_GpioOut(uchar key, uchar lev) { switch(key) { case 0: if(lev) HAL_GPIO_WritePin(KEY_0_GPIO_Port, KEY_0_Pin, GPIO_PIN_SET); else HAL_GPIO_WritePin(KEY_0_GPIO_Port, KEY_0_Pin, GPIO_PIN_RESET); break; case 1: if(lev) HAL_GPIO_WritePin(KEY_1_GPIO_Port, KEY_1_Pin, GPIO_PIN_SET); else HAL_GPIO_WritePin(KEY_1_GPIO_Port, KEY_1_Pin, GPIO_PIN_RESET); break; case 2: if(lev) HAL_GPIO_WritePin(KEY_2_GPIO_Port, KEY_2_Pin, GPIO_PIN_SET); else HAL_GPIO_WritePin(KEY_2_GPIO_Port, KEY_2_Pin, GPIO_PIN_RESET); break; case 3: if(lev) HAL_GPIO_WritePin(KEY_3_GPIO_Port, KEY_3_Pin, GPIO_PIN_SET); else HAL_GPIO_WritePin(KEY_3_GPIO_Port, KEY_3_Pin, GPIO_PIN_RESET); break; } } /********* * *函数:按键GPIO输出重写 * *传参:key(0-3):按键号; * *传回参数:lev(0/1): 0:低 1:高 * *例:Key_GpioIn(4) 读取Key_4的值 *********/ uchar Key_GpioIn(uchar key) { uchar lev; //防止warning switch(key) { case 4: if(HAL_GPIO_ReadPin(KEY_4_GPIO_Port, KEY_4_Pin) == GPIO_PIN_SET) lev = 1; else lev = 0; break; case 5: if(HAL_GPIO_ReadPin(KEY_5_GPIO_Port, KEY_5_Pin) == GPIO_PIN_SET) lev = 1; else lev = 0; break; case 6: if(HAL_GPIO_ReadPin(KEY_6_GPIO_Port, KEY_6_Pin) == GPIO_PIN_SET) lev = 1; else lev = 0; break; case 7: if(HAL_GPIO_ReadPin(KEY_7_GPIO_Port, KEY_7_Pin) == GPIO_PIN_SET) lev = 1; else lev = 0; break; } if(lev) return 1; else return 0; } /********* * *函数:按键输出 * *传参:out(0x0a):方便按键扫描 * *例:Key_Output(0x07) Key_3置低,Key_0-2置高 *********/ void Key_Output(uchar out) { uchar temp; for(uchar i=0; i


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭