本周扩展了一下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矩阵键盘的实现相关推荐

  1. 4*4按键扫描程序c语言,【资料】单片机4*4矩阵键盘扫描程序(c语言+汇编语言2个版本)...

    ;4X4矩阵键盘程序.主要原理为扫描键盘矩阵时,每次只有一行电平拉低.在逐次扫描拉低的这些行的同时,去读那些列的电平. ;被拉低的行上,按下的键对应的列的电平为0 ,其它为1. 用左移位的指令,在进位 ...

  2. 单片机入门-矩阵键盘控制数码管显示

    任务简述:通过按下4X4矩阵键盘实现数码管对应显示数字 实现方式:通过行列分接法,可以节省使用单片机的I/O口,扫描矩阵键盘是否有按下,判断P2端口得到的值. protues 硬件系统 单片机晶振复位 ...

  3. 4x4矩阵键盘工作原理及扫描程序_4X4矩形键盘

    介绍 什么是矩阵键盘 矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组,由于电路设计时需要更多的外部输入,单独的控制一个按键需要浪费很多的IO资源,所以就有了矩阵键盘,常用的矩阵键盘有4X4和 ...

  4. PIC16F877矩阵键盘的识别

    原文地址:http://blog.sina.com.cn/s/blog_4a3946360100mwqh.html 关于矩阵键盘的识别方法在51矩阵键盘识别中已经说过,现在要说的是PIC单片机与51单 ...

  5. 矩阵键盘程序_独立按键与矩阵按键

    一.独立按键原理 按键在闭合和断开时,触点会存在抖动现象 硬件消抖电路 独立按键控制程 二.独立按键控制程序 #include "reg52.h" typedef unsigned ...

  6. vba循环通过键盘某个按键按下退出循环_51单片机按键检测--独立按键与矩阵键盘...

    按键可以说是51单片机项目开发的一个重要组件了,它是作为51单片机IO口输入的一种重要方式.我们可以通过按键控制单片机执行相应的程序,得到我们想要得效果.51单片机的按键输入主要有两种,一种是独立按键 ...

  7. c51单片机矩阵键盘1602计算器_基于51单片机矩阵键盘的简易计算器制作

    1. 运算过程.符号公式实时显示在显示屏上(I2C 1602). 2. 自带三角函数.开根号.平方运算. 3. 计算得出的结果可设置保存并用以下一次计算. 4. 所有运算结果精确到至少小数点后两位. ...

  8. 51单片机独立键盘和矩阵键盘

    独立键盘代码: #include<reg52.h> #include<intrins.h>#define uint unsigned int #define uchar uns ...

  9. c语言键盘控制数码管显示,3*4矩阵键盘控制4位数码管显示的C程序

    这个很简单 ;******************************************************************************** ;*  标题:  伟纳电 ...

  10. 【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 ...

最新文章

  1. 使用MATLAB实现的小算法练习1
  2. java二分查找法_java算法之二分查找法的实例详解
  3. utc时间 单位换算_数学基础知识点总结,常用单位换算长度、时间、面积等分类...
  4. SpringBoot+Vue+OpenOffice实现文档管理(文档上传、下载、在线预览)
  5. mysql 自动归档,如何将数据库从非归档模式转为自动归档模式:
  6. Java编译和执行模式包括两种,Java程序的编译和执行模式包括2点,是【 】和半解释。...
  7. git rebase 后找回消失的commit
  8. linux6.5如何打开ftp服务,CentOs6.5上快速搭建ftp服务器
  9. vue中Axios网络请求之Vue知识点归纳(十)
  10. 艺术美的价值是什么?
  11. Java各层之间的关系
  12. 超大水箱持久水润,让这个冬天不干燥,摩飞有雾加湿器体验
  13. 奥林匹克计算机竞赛保送,电脑奥赛中最寂寥的竞赛 5学生夺牌直通清华
  14. 华为手机鸿蒙系统测评,华为发布的鸿蒙系统到底有多牛(让理想成为现实)
  15. 【CZY选讲·最大子矩阵和】
  16. 使用微搭低代码集成腾讯地图
  17. 电商APP首页楼层架构设计详解
  18. ELSEVIER期刊论文投稿全流程实例讲解
  19. 解决GoLand上面出现的Couldn‘t copy unpacked SDK问题
  20. 2013华为校园招聘机试题

热门文章

  1. 选择服务器租用托管机房的关键
  2. 店湾妹:终于相信,包治百病不是假的!最新包包来袭!
  3. 孔子怀疑徒弟(zt)
  4. win10系统问题-the boot configuration date for your pc is missing or contains errors 解决办法
  5. cdh报 Unable to acquire JDBC Connection
  6. 求一维数组中的最大数c语言,C语言 求一维数组中最大值的位置
  7. fullPage.js和Wow.js不兼容的问题(已解决,方法待优化)
  8. module java.base does not “opens java.lang“ to unnamed module
  9. socket源码分析之accept
  10. 计算机老师任课教师寄语,一年级一句话任课老师寄语