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 ...
最新文章
- Android10.0系统启动之Launcher(桌面)启动流程-[Android取经之路]
- 江苏省计算机一级考试知识点总结,江苏省计算机一级考试注意要点1
- 数组、结构体和共用体的长度计算?
- 苹果发布被拒绝的种种惨剧
- matlab gm 1 1,MATLAB 如何用GM(1,1)做预测?请大神帮忙!
- PSD分层模板|电商促销海报设计技巧
- php 到精通 书,PHP从入门到精通——读书笔记(第20章:Zend Framwork框架)
- Visual Studio Code(VS Code)与Git Source Control集成
- (二)匈牙利算法简介
- Oauth2认证图解
- lvm扩容-缩减磁盘
- 智能眼镜的两种显示方式
- 利用python提取企查查企业的工商基本信息
- 团体程序设计天梯赛-练习集-L1-031. 到底是不是太胖了
- MySql按中文姓名排序
- qt学习总结之探索Qt的安装目录结构
- 百度大脑驾驶证识别使用攻略
- u深度制作linux启动盘制作工具,U深度U盘启动盘制作工具怎么操作?U深度U盘启动盘制作工具使用...
- 基于51单片机的温度监测控制系统仿真程序原理图设计
- 在机顶盒上被移除adb后恢复的办法