3*3矩阵键盘的实现
本周扩展了一下STM32的按键个数。
矩阵键盘原理:通过六个引脚分别控制3*3矩阵键盘的三个行和三个列
实现:分别给按键标号1-9,按下按键后,通过串口输出按键的标号即可。
以下为代码实现:
分两次扫描计算出最终的按键号
key.c文件
#include "key.h"
#include "delay.h"
#include "sys.h"
//按键初始化函数 //PB5-7设置成输入 PB8-10设置成输出
void KEY_Init1(void)
{RCC->APB2ENR|=1<<3; //使能PORTB时钟JTAG_Set(SWD_ENABLE); //关闭JTAG,开启SWDGPIOB->CRL&=0X000FFFFF; //PB5-7设置成输入 GPIOB->CRL|=0X88800000;GPIOB->CRH&=0XFFFFF000; //PB8-10设置成输出 GPIOB->CRH|=0X00000333;
}
void KEY_Init2(void)
{GPIOB->CRL&=0X000FFFFF; //PB5-7设置成输出 GPIOB->CRL|=0X33300000;GPIOB->CRH&=0XFFFFF000; //PB8-10设置成输入 GPIOB->CRH|=0X00000888;
}//按键扫描函数
//默认优先级行 列为1 2 3
u8 KEY_Scan(u8 mode)
{ u8 l=0,h=0;static u8 key_con=1; //按键按松开标志if(mode) key_con=1; //支持连按KEY_ROW_out1=0; //行输出置低KEY_ROW_out2=0;KEY_ROW_out3=0;KEY_Init1();KEY_ROL_out1=1; //列输出置高KEY_ROL_out2=1;KEY_ROL_out3=1;if(key_con&&(KEY_ROW_in1==1||KEY_ROW_in2==1||KEY_ROW_in3==1)) //检测按下的按键所在行{delay_ms(10);key_con=0;if(KEY_ROW_in1==1) h=1; //返回行值else if(KEY_ROW_in2==1) h=2;else if(KEY_ROW_in3==1) h=3;}else if(KEY_ROW_in1==0&&KEY_ROW_in2==0&&KEY_ROW_in3==0) //无按键按下{key_con=1; return 0;}KEY_ROL_out1=0; //二次扫描 列输出置低KEY_ROL_out2=0;KEY_ROL_out3=0;KEY_Init2();KEY_ROW_out1=1; //行输出置高KEY_ROW_out2=1;KEY_ROW_out3=1;if(KEY_ROL_in1==1||KEY_ROL_in2==1||KEY_ROL_in3==1) //检测按下的按键所在列{delay_ms(10);if(KEY_ROL_in1==1) l=(h-1)*3+1;else if(KEY_ROL_in2==1) l=(h-1)*3+2;else if(KEY_ROL_in3==1) l=(h-1)*3+3;}return l;
}
key.h文件
#ifndef __KEY_H
#define __KEY_H
#include "sys.h" #define KEY_ROW_in1 PBin(5)
#define KEY_ROW_in2 PBin(6)
#define KEY_ROW_in3 PBin(7)
#define KEY_ROL_out1 PBout(8)
#define KEY_ROL_out2 PBout(9)
#define KEY_ROL_out3 PBout(10)#define KEY_ROW_out1 PBout(5)
#define KEY_ROW_out2 PBout(6)
#define KEY_ROW_out3 PBout(7)
#define KEY_ROL_in1 PBin(8)
#define KEY_ROL_in2 PBin(9)
#define KEY_ROL_in3 PBin(10)void KEY_Init1(void); //IO初始化
void KEY_Init2(void);
u8 KEY_Scan(u8 mode);#endif
main.c文件
#include "delay.h"
#include "led.h"
int main(void)
{ u8 key=0; Stm32_Clock_Init(9); //系统时钟设置delay_init(72); //延时初始化//LED_Init(); //初始化与LED连接的硬件接口uart_init(72,9600);KEY_Init1();while(1){ key=KEY_Scan(0);if(key!=0){printf("%d\r\n",key);}key=0;delay_ms(100);} }
3*3矩阵键盘的实现相关推荐
- 4*4按键扫描程序c语言,【资料】单片机4*4矩阵键盘扫描程序(c语言+汇编语言2个版本)...
;4X4矩阵键盘程序.主要原理为扫描键盘矩阵时,每次只有一行电平拉低.在逐次扫描拉低的这些行的同时,去读那些列的电平. ;被拉低的行上,按下的键对应的列的电平为0 ,其它为1. 用左移位的指令,在进位 ...
- 单片机入门-矩阵键盘控制数码管显示
任务简述:通过按下4X4矩阵键盘实现数码管对应显示数字 实现方式:通过行列分接法,可以节省使用单片机的I/O口,扫描矩阵键盘是否有按下,判断P2端口得到的值. protues 硬件系统 单片机晶振复位 ...
- 4x4矩阵键盘工作原理及扫描程序_4X4矩形键盘
介绍 什么是矩阵键盘 矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组,由于电路设计时需要更多的外部输入,单独的控制一个按键需要浪费很多的IO资源,所以就有了矩阵键盘,常用的矩阵键盘有4X4和 ...
- PIC16F877矩阵键盘的识别
原文地址:http://blog.sina.com.cn/s/blog_4a3946360100mwqh.html 关于矩阵键盘的识别方法在51矩阵键盘识别中已经说过,现在要说的是PIC单片机与51单 ...
- 矩阵键盘程序_独立按键与矩阵按键
一.独立按键原理 按键在闭合和断开时,触点会存在抖动现象 硬件消抖电路 独立按键控制程 二.独立按键控制程序 #include "reg52.h" typedef unsigned ...
- vba循环通过键盘某个按键按下退出循环_51单片机按键检测--独立按键与矩阵键盘...
按键可以说是51单片机项目开发的一个重要组件了,它是作为51单片机IO口输入的一种重要方式.我们可以通过按键控制单片机执行相应的程序,得到我们想要得效果.51单片机的按键输入主要有两种,一种是独立按键 ...
- c51单片机矩阵键盘1602计算器_基于51单片机矩阵键盘的简易计算器制作
1. 运算过程.符号公式实时显示在显示屏上(I2C 1602). 2. 自带三角函数.开根号.平方运算. 3. 计算得出的结果可设置保存并用以下一次计算. 4. 所有运算结果精确到至少小数点后两位. ...
- 51单片机独立键盘和矩阵键盘
独立键盘代码: #include<reg52.h> #include<intrins.h>#define uint unsigned int #define uchar uns ...
- c语言键盘控制数码管显示,3*4矩阵键盘控制4位数码管显示的C程序
这个很简单 ;******************************************************************************** ;* 标题: 伟纳电 ...
- 【51单片机快速入门指南】2.3:GPIO读取矩阵键盘 8个IO读16键
目录 硬知识 矩阵键盘介绍 测试程序 Key_Board.c Key_Board.h main.c 实验现象 普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK ...
最新文章
- 使用MATLAB实现的小算法练习1
- java二分查找法_java算法之二分查找法的实例详解
- utc时间 单位换算_数学基础知识点总结,常用单位换算长度、时间、面积等分类...
- SpringBoot+Vue+OpenOffice实现文档管理(文档上传、下载、在线预览)
- mysql 自动归档,如何将数据库从非归档模式转为自动归档模式:
- Java编译和执行模式包括两种,Java程序的编译和执行模式包括2点,是【 】和半解释。...
- git rebase 后找回消失的commit
- linux6.5如何打开ftp服务,CentOs6.5上快速搭建ftp服务器
- vue中Axios网络请求之Vue知识点归纳(十)
- 艺术美的价值是什么?
- Java各层之间的关系
- 超大水箱持久水润,让这个冬天不干燥,摩飞有雾加湿器体验
- 奥林匹克计算机竞赛保送,电脑奥赛中最寂寥的竞赛 5学生夺牌直通清华
- 华为手机鸿蒙系统测评,华为发布的鸿蒙系统到底有多牛(让理想成为现实)
- 【CZY选讲·最大子矩阵和】
- 使用微搭低代码集成腾讯地图
- 电商APP首页楼层架构设计详解
- ELSEVIER期刊论文投稿全流程实例讲解
- 解决GoLand上面出现的Couldn‘t copy unpacked SDK问题
- 2013华为校园招聘机试题
热门文章
- 选择服务器租用托管机房的关键
- 店湾妹:终于相信,包治百病不是假的!最新包包来袭!
- 孔子怀疑徒弟(zt)
- win10系统问题-the boot configuration date for your pc is missing or contains errors 解决办法
- cdh报 Unable to acquire JDBC Connection
- 求一维数组中的最大数c语言,C语言 求一维数组中最大值的位置
- fullPage.js和Wow.js不兼容的问题(已解决,方法待优化)
- module java.base does not “opens java.lang“ to unnamed module
- socket源码分析之accept
- 计算机老师任课教师寄语,一年级一句话任课老师寄语