一、前期准备
单片机: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)相关推荐

  1. NB-IOT开发|nbiot开发教程《三》AT指令类模组驱动-STM32实现AT指令状态机

    嵌入式开发中我们要时刻保持代码的高效与整洁看之前,先点赞 好习惯,要养成 一.前言 嵌入式开发中我们要时刻保持代码的高效与整洁.在第一节中"NB-IOT开发|nbiot开发教程<一&g ...

  2. A7139 无线通信驱动(STM32) 增加FIFO扩展模式,可以发送超大数据包

    A7139 拥有电磁波唤醒以及10mW的发射功率,非常容易实现长距离通信,目前测试有障碍物可以轻松达到300m以上. 通过几天的调试,目前可以发送任意大小的数据包,大小为1-16KB,全部使用中断收发 ...

  3. A7139 无线通信驱动(STM32) 添加FIFO扩展模式,能够发送超大数据包

    A7139 拥有电磁波唤醒以及10mW的发射功率,很easy实现长距离通信,眼下測试有障碍物能够轻松达到300m以上. 通过几天的调试,眼下能够发送随意大小的数据包,大小为1-16KB.所有使用中断收 ...

  4. linux 薄膜键盘驱动,有限状态机的嵌入式Linux按键驱动设计

    0  引言 一般的按键驱动程序通常非常简单.在程序中一旦检测到按键输入口为低电平时,就采用软件延时10 ms后再次检测按键输入口.如果仍然是低电平则表示有按键按下,便转入执行按键处理程序:否则,当按键 ...

  5. linux 薄膜键盘驱动,全志T3核心板 (512M/1G DDR3,8G EMMC)

    T3核心板硬件资源基本需求 基本硬件资源 1.电源供应 DC电源输入,5V单电源输入,CPU要能检测到这个电源是否供电: 电池输入,锂电池电源输入: 实时时钟电源,使用纽扣电池: 2.显示接口 要支持 ...

  6. WM8994驱动 STM32 WM8994驱动( STM32f746gdiscovery WM8994驱动)

    描述 WM8994 是一款高度集成的超低功耗高保真 CODEC,专为智能手机和其他具有丰富多媒体功能的便携式设备而设计. 集成的立体声 D/AB 扬声器驱动器和 W 类耳机驱动器,可最大限度降低音频播 ...

  7. LoRa开发|LoRa(SX1276/8)串口透传代码-将LoRa封装成单独的驱动(STM32)

    一.前言 嵌入式开发中我们要时刻保持代码的高效与整洁.2020年,开年注定不平凡,新型冠状肺炎的出现哪里也去不了,在家无聊写点东西吧.最近和一友人聊天,友人一直在抱怨学习lora没有前途,一直在纠结要 ...

  8. linux平台xpt2046驱动,stm32 触摸屏 XPT2046

    引脚功能描述 控制字的控制位命令 控制字节各位描述 单端模式输入配置 差分模式输入配置 时序 前8个时钟用来通过DIN引脚输入控制字节,接着的12个时钟周期将完成真正的模数转换,剩下的3个多时钟周期将 ...

  9. STM32 之三 标准外设版USB驱动库详解(架构+文件+函数+使用说明+示例程序)

    写在前面 目前,ST的USB驱动有两套,一套是早期的独立版USB驱动,官方培训文档中称为Legacy library:一套为针对其Cube 系列的驱动,根据芯片不同可能有区别,具体见对应芯片的Cube ...

最新文章

  1. 一位美女博士的人脸识别历程
  2. Xamarin XAML语言教程基本页面ContentPage占用面积(二)
  3. 批量设置Service Order成transferred状态
  4. [HNOI2016]网络 树链剖分,堆
  5. 据说有99%的人都会做错的面试题
  6. oracle等待事件查询,Oracle查看等待事件_yh_zeng2的博客-CSDN博客
  7. DataSet与DataTable与DataRow的关系
  8. lock condition
  9. 检查word里参考文献引用依出现先后顺序排列(半自动化)
  10. fscan扫描工具安装
  11. 花3150本钱拉一车菠萝,在马路边摆摊卖水果,卖7天收入4170
  12. 基于docker实现人人影视CVNT虚拟化多开,基于selinum实现自动化点击程序
  13. 24点小游戏(C语言实现)
  14. unsigned char,char ,uchar ,UCHAR的区别
  15. 记canvas优化图片抠图历程
  16. Pytorch中的detach用法
  17. 用友NC系统考勤机自动同步方案(适合大型商超)
  18. 数字藏品是怎么赋能的?
  19. PDF文件怎么设置加密
  20. 蓝桥杯单片机之NE555频率发生计的使用(IO模式)

热门文章

  1. BCDEdit命令修改windows启动菜单
  2. 李永乐复习全书高等数学 第五章 多元函数微分学
  3. wps怎么统一修改标点符号_如何批量修改字母标点全角半角?
  4. 电脑断开,电脑怎么断开本地连接
  5. 阿里云总裁胡晓明:“拿来主义”盖不起高楼大厦
  6. 人在洪荒,我改了亿点点天道小势(一)
  7. vue整合Echarts 实例PM2.5全国主要城市空气质量 百度地图
  8. CAS客户端整合(三) Otrs
  9. TD-SCDMA理论试题
  10. 风控建模之外部数据评估