薄膜键盘驱动(STM32)
一、前期准备
单片机:STM32F103ZET6
开发环境:MDK5.14
固件库:标准库 V3.5
薄膜开关:淘宝上很多,价格便宜
薄膜开关原理图:
二、实验效果
串口配置:
开机欢迎信息:
实验效果:
三、驱动原理
如原理图所示,薄膜开关分为行和列,只要分别对其进行扫描便可以得出是哪一个按键按下的了。行扫描时,需要把行对应的IO口设置成上拉输入,列设置成推挽输出并全部赋值为0。行对应的IO口检测是否有低电平的输入,从而判断是哪一行按下了。列扫描与行扫描一样,只不过对应的IO状态不一样,具体的见
驱动代码。需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。
四、驱动代码
MatrixKey.h
#ifndef __MATRIX_KEY_H__
#define __MATRIX_KEY_H__
#include "stm32f10x.h"
#include "gpio.h"
#include "delay.h"//C0,C2,A0,A2,A4,A6,C4,B0#define ROW_1 PCout(0)
#define ROW_2 PCout(2)
#define ROW_3 PAout(0)
#define ROW_4 PAout(2)#define COL_1 PAout(4)
#define COL_2 PAout(6)
#define COL_3 PCout(4)
#define COL_4 PBout(0)#define ROW1 GPIO_Pin_0
#define ROW2 GPIO_Pin_2
#define ROW3 GPIO_Pin_0
#define ROW4 GPIO_Pin_2
#define COL1 GPIO_Pin_4
#define COL2 GPIO_Pin_6
#define COL3 GPIO_Pin_4
#define COL4 GPIO_Pin_0typedef enum
{Column,Row,Normal
} MatirxMode;extern void MatrixKeyConfiguration(void);
extern uint8_t GetMatrixKeyValue(void);
#endif
MatrixKey.c
#include "matrixkey.h"//R1,R2,R3,R4,C1,C2,C3,C4
//C0,C2,A0,A2,A4,A6,C4,B0
void MatrixModeConfig(MatirxMode mode);void MatrixKeyConfiguration(void)
{GPIO_InitTypeDef GPIO;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC, ENABLE);//Register IO GPIO.GPIO_Pin = ROW3 | ROW4 | COL1 | COL2;GPIO.GPIO_Speed = GPIO_Speed_50MHz;GPIO.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO);GPIO.GPIO_Pin = COL4;GPIO_Init(GPIOB, &GPIO);GPIO.GPIO_Pin = ROW1 | ROW2 | COL3;GPIO_Init(GPIOC, &GPIO);ROW_1 = 1;ROW_2 = 1;ROW_3 = 1;ROW_4 = 1;COL_1 = 1;COL_2 = 1;COL_3 = 1;COL_4 = 1;//MatrixModeConfig(Column);
}//R1,R2,R3,R4,C1,C2,C3,C4
//C0,C2,A0,A2,A4,A6,C4,B0
void MatrixModeConfig(MatirxMode mode)
{GPIO_InitTypeDef GPIO;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC, ENABLE);switch(mode){case Column:GPIO.GPIO_Pin = ROW1 | ROW2;GPIO.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOC, &GPIO);GPIO.GPIO_Pin = ROW3 | ROW4;GPIO_Init(GPIOA, &GPIO);//==============================================//GPIO.GPIO_Pin = COL1 | COL2;GPIO.GPIO_Speed = GPIO_Speed_50MHz;GPIO.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO);GPIO.GPIO_Pin = COL3;GPIO_Init(GPIOC, &GPIO);GPIO.GPIO_Pin = COL4;GPIO_Init(GPIOB, &GPIO);//BIT_ADDR(GPIOA_IDR_Addr,n)BIT_ADDR(GPIOA_ODR_Addr,4) = 0;BIT_ADDR(GPIOA_ODR_Addr,6) = 0;BIT_ADDR(GPIOC_ODR_Addr,4) = 0;BIT_ADDR(GPIOB_ODR_Addr,0) = 0;break;case Row:GPIO.GPIO_Pin = ROW1 | ROW2;GPIO.GPIO_Speed = GPIO_Speed_50MHz;GPIO.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO);GPIO.GPIO_Pin = ROW3 | ROW4;GPIO_Init(GPIOA, &GPIO);//==============================================//GPIO.GPIO_Pin = COL1 | COL2;GPIO.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO);GPIO.GPIO_Pin = COL3;GPIO_Init(GPIOC, &GPIO);GPIO.GPIO_Pin = COL4;GPIO_Init(GPIOB, &GPIO);BIT_ADDR(GPIOC_ODR_Addr,0) = 0;BIT_ADDR(GPIOC_ODR_Addr,2) = 0;BIT_ADDR(GPIOA_ODR_Addr,0) = 0;BIT_ADDR(GPIOA_ODR_Addr,2) = 0;break;}
}/************************************/
/*return 1 to 16 */
/*erturn 0 is error or not respnose */
/************************************/
uint8_t GetMatrixKeyValue(void)
{uint8_t value = 0;MatrixModeConfig(Column);if (BIT_ADDR(GPIOC_IDR_Addr,0) == 0){DelayMs(5);if (BIT_ADDR(GPIOC_IDR_Addr,0) == 0){value += 0;}}else if (BIT_ADDR(GPIOC_IDR_Addr,2) == 0){DelayMs(5);if (BIT_ADDR(GPIOC_IDR_Addr,2) == 0){value += 4;}}else if (BIT_ADDR(GPIOA_IDR_Addr,0) == 0){DelayMs(5);if (BIT_ADDR(GPIOA_IDR_Addr,0) == 0){value += 8;}}else if (BIT_ADDR(GPIOA_IDR_Addr,2) == 0){DelayMs(5);if (BIT_ADDR(GPIOA_IDR_Addr,2) == 0){value += 12;}}else{value = 0;}MatrixModeConfig(Row);if (BIT_ADDR(GPIOA_IDR_Addr,4) == 0){DelayMs(5);if (BIT_ADDR(GPIOA_IDR_Addr,4) == 0){value += 1;}}else if (BIT_ADDR(GPIOA_IDR_Addr,6) == 0){DelayMs(5);if (BIT_ADDR(GPIOA_IDR_Addr,6) == 0){value += 2;}}else if (BIT_ADDR(GPIOC_IDR_Addr,4) == 0){DelayMs(5);if (BIT_ADDR(GPIOC_IDR_Addr,4) == 0){value += 3;}}else if (BIT_ADDR(GPIOB_IDR_Addr,0) == 0){DelayMs(5);if (BIT_ADDR(GPIOB_IDR_Addr,0) == 0){value += 4;}}else{value = 0;}return value;
}
由于作者能力有限,有不妥之处欢迎指正,邮箱alex_hua@foxmail.com
薄膜键盘驱动(STM32)相关推荐
- NB-IOT开发|nbiot开发教程《三》AT指令类模组驱动-STM32实现AT指令状态机
嵌入式开发中我们要时刻保持代码的高效与整洁看之前,先点赞 好习惯,要养成 一.前言 嵌入式开发中我们要时刻保持代码的高效与整洁.在第一节中"NB-IOT开发|nbiot开发教程<一&g ...
- A7139 无线通信驱动(STM32) 增加FIFO扩展模式,可以发送超大数据包
A7139 拥有电磁波唤醒以及10mW的发射功率,非常容易实现长距离通信,目前测试有障碍物可以轻松达到300m以上. 通过几天的调试,目前可以发送任意大小的数据包,大小为1-16KB,全部使用中断收发 ...
- A7139 无线通信驱动(STM32) 添加FIFO扩展模式,能够发送超大数据包
A7139 拥有电磁波唤醒以及10mW的发射功率,很easy实现长距离通信,眼下測试有障碍物能够轻松达到300m以上. 通过几天的调试,眼下能够发送随意大小的数据包,大小为1-16KB.所有使用中断收 ...
- linux 薄膜键盘驱动,有限状态机的嵌入式Linux按键驱动设计
0 引言 一般的按键驱动程序通常非常简单.在程序中一旦检测到按键输入口为低电平时,就采用软件延时10 ms后再次检测按键输入口.如果仍然是低电平则表示有按键按下,便转入执行按键处理程序:否则,当按键 ...
- linux 薄膜键盘驱动,全志T3核心板 (512M/1G DDR3,8G EMMC)
T3核心板硬件资源基本需求 基本硬件资源 1.电源供应 DC电源输入,5V单电源输入,CPU要能检测到这个电源是否供电: 电池输入,锂电池电源输入: 实时时钟电源,使用纽扣电池: 2.显示接口 要支持 ...
- WM8994驱动 STM32 WM8994驱动( STM32f746gdiscovery WM8994驱动)
描述 WM8994 是一款高度集成的超低功耗高保真 CODEC,专为智能手机和其他具有丰富多媒体功能的便携式设备而设计. 集成的立体声 D/AB 扬声器驱动器和 W 类耳机驱动器,可最大限度降低音频播 ...
- LoRa开发|LoRa(SX1276/8)串口透传代码-将LoRa封装成单独的驱动(STM32)
一.前言 嵌入式开发中我们要时刻保持代码的高效与整洁.2020年,开年注定不平凡,新型冠状肺炎的出现哪里也去不了,在家无聊写点东西吧.最近和一友人聊天,友人一直在抱怨学习lora没有前途,一直在纠结要 ...
- linux平台xpt2046驱动,stm32 触摸屏 XPT2046
引脚功能描述 控制字的控制位命令 控制字节各位描述 单端模式输入配置 差分模式输入配置 时序 前8个时钟用来通过DIN引脚输入控制字节,接着的12个时钟周期将完成真正的模数转换,剩下的3个多时钟周期将 ...
- STM32 之三 标准外设版USB驱动库详解(架构+文件+函数+使用说明+示例程序)
写在前面 目前,ST的USB驱动有两套,一套是早期的独立版USB驱动,官方培训文档中称为Legacy library:一套为针对其Cube 系列的驱动,根据芯片不同可能有区别,具体见对应芯片的Cube ...
最新文章
- 一位美女博士的人脸识别历程
- Xamarin XAML语言教程基本页面ContentPage占用面积(二)
- 批量设置Service Order成transferred状态
- [HNOI2016]网络 树链剖分,堆
- 据说有99%的人都会做错的面试题
- oracle等待事件查询,Oracle查看等待事件_yh_zeng2的博客-CSDN博客
- DataSet与DataTable与DataRow的关系
- lock condition
- 检查word里参考文献引用依出现先后顺序排列(半自动化)
- fscan扫描工具安装
- 花3150本钱拉一车菠萝,在马路边摆摊卖水果,卖7天收入4170
- 基于docker实现人人影视CVNT虚拟化多开,基于selinum实现自动化点击程序
- 24点小游戏(C语言实现)
- unsigned char,char ,uchar ,UCHAR的区别
- 记canvas优化图片抠图历程
- Pytorch中的detach用法
- 用友NC系统考勤机自动同步方案(适合大型商超)
- 数字藏品是怎么赋能的?
- PDF文件怎么设置加密
- 蓝桥杯单片机之NE555频率发生计的使用(IO模式)