自己找了别人的代码修改了一下,加了连按和不连续按的功能,很稳定。
原理放在代码的注释里了,就是行扫描和列扫描去确定哪个按键按下。

引脚和单片机的连线

薄膜键盘有8个脚,标好数字的。
1接 B11
2接 B10
3接 B9
4接 B8
5接 C6
6接 C7
7接 C8
8接 C9

.H文件

> #ifndef __MATRIX_KEY_H__
#define __MATRIX_KEY_H__
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#define     ROW_1       PCout(6)
#define     ROW_2       PCout(7)
#define     ROW_3       PCout(8)
#define     ROW_4       PCout(9)
#define     COL_1       PBout(11)
#define     COL_2       PBout(10)
#define     COL_3       PBout(9)
#define     COL_4       PBout(8)
#define     ROW1        GPIO_Pin_6
#define     ROW2        GPIO_Pin_7
#define     ROW3        GPIO_Pin_8
#define     ROW4        GPIO_Pin_9
#define     COL1        GPIO_Pin_11
#define     COL2        GPIO_Pin_10
#define     COL3        GPIO_Pin_9
#define     COL4        GPIO_Pin_8
typedef enum
{Column,Row,Normal
} MatirxMode;
extern void MatrixKeyConfiguration(void);
extern uint8_t GetMatrixKeyValue(void);
extern uint8_t GetMatrixKeyValue_Once(void);
#endif

.C文件

#include "matrixkey.h"//R1,R2,R3,R4,C1,C2,C3,C4
//C6,C7,C8,C9,B11,B10,B9,B8void MatrixKeyConfiguration(void)       //按键初始化
{GPIO_InitTypeDef    GPIO;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC, ENABLE);//Register IO GPIO.GPIO_Pin   = ROW3 | ROW4 | ROW1 | ROW2;GPIO.GPIO_Speed = GPIO_Speed_50MHz;GPIO.GPIO_Mode  = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO);GPIO.GPIO_Pin   = COL1 | COL2|COL3|COL4;GPIO_Init(GPIOB, &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
//C6,C7,C8,C9,B11,B10,B9,B8
void MatrixModeConfig(MatirxMode mode)//行扫描时,需要把行对应的IO口设置成上拉输入,列设置成推挽输出并全部赋值为0。行对应的IO口检测是否有低电平的输入,从而判断是哪一行按下了。
{GPIO_InitTypeDef    GPIO;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC, ENABLE);switch(mode){case Column:GPIO.GPIO_Pin   =COL1 | COL2 |COL3 |COL4;GPIO.GPIO_Mode  = GPIO_Mode_IPU;            GPIO_Init(GPIOB, &GPIO);           //列扫描模式时,列上拉输入                 //==============================================//GPIO.GPIO_Pin   = ROW1 | ROW2|ROW3|ROW4;GPIO.GPIO_Speed = GPIO_Speed_50MHz;GPIO.GPIO_Mode  = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO);          //行推挽输出0//BIT_ADDR(GPIOA_IDR_Addr,n)BIT_ADDR(GPIOC_ODR_Addr,6) = 0;BIT_ADDR(GPIOC_ODR_Addr,7) = 0;BIT_ADDR(GPIOC_ODR_Addr,8) = 0;BIT_ADDR(GPIOC_ODR_Addr,9) = 0;break;case Row:GPIO.GPIO_Pin   = COL1 | COL2|COL3|COL4;GPIO.GPIO_Speed = GPIO_Speed_50MHz;GPIO.GPIO_Mode  = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO);           //行扫描模式时,行上拉,列推挽输出0BIT_ADDR(GPIOB_ODR_Addr,11) = 0;BIT_ADDR(GPIOB_ODR_Addr,10) = 0;BIT_ADDR(GPIOB_ODR_Addr,9) = 0;BIT_ADDR(GPIOB_ODR_Addr,8) = 0;//==============================================//GPIO.GPIO_Pin   =  ROW1 | ROW2|ROW3|ROW4;GPIO.GPIO_Mode  = GPIO_Mode_IPU;GPIO_Init(GPIOC, &GPIO);break;}
}/************************************/
/*return 1 to 16                    */
/*erturn 0 is error or not respnose */
/************************************/
//R1,R2,R3,R4,C1,C2,C3,C4
//C6,C7,C8,C9,B11,B10,B9,B8
uint8_t GetMatrixKeyValue(void)    //支持连按
{uint8_t value = 0;uint8_t Rowvalue = 0;MatrixModeConfig(Row);//行扫描if (BIT_ADDR(GPIOC_IDR_Addr,9) == 0){delay_ms(5);if (BIT_ADDR(GPIOC_IDR_Addr,9) == 0){value += 0;}}else if (BIT_ADDR(GPIOC_IDR_Addr,8) == 0){delay_ms(5);if (BIT_ADDR(GPIOC_IDR_Addr,8) == 0){value += 4;}}else if (BIT_ADDR(GPIOC_IDR_Addr,7) == 0){delay_ms(5);if (BIT_ADDR(GPIOC_IDR_Addr,7) == 0){value += 8;}}else if (BIT_ADDR(GPIOC_IDR_Addr,6) == 0){delay_ms(5);if (BIT_ADDR(GPIOC_IDR_Addr,6) == 0){value +=12;}}else{value = 0;}Rowvalue=value;MatrixModeConfig(Column);   //列扫描if (BIT_ADDR(GPIOB_IDR_Addr,8) == 0){delay_ms(5);if (BIT_ADDR(GPIOB_IDR_Addr,8) == 0){value += 1;}}else if (BIT_ADDR(GPIOB_IDR_Addr,9) == 0){delay_ms(5);if (BIT_ADDR(GPIOB_IDR_Addr,9) == 0){value += 2;}}else if (BIT_ADDR(GPIOB_IDR_Addr,10) == 0){delay_ms(5);if (BIT_ADDR(GPIOB_IDR_Addr,10) == 0){value += 3;}}else if (BIT_ADDR(GPIOB_IDR_Addr,11) == 0){delay_ms(5);if (BIT_ADDR(GPIOB_IDR_Addr,11) == 0){value += 4;}}else{value = 0;}if(value==Rowvalue){return 0;}     //说明列扫描失败,可能按键已经松开,防止行扫描成功后按键松开而导致列扫描失败的错误情况。return value;
}uint8_t GetMatrixKeyValue_Once(void)   //不支持连按
{static u8 key_up=1;//按键按松开标志  u8 t;t=GetMatrixKeyValue();if(key_up&&t){key_up=0;return t;}else if(t==0)key_up=1;          return 0;// 无按键按下
}

STM32F103 4*4薄膜键盘代码分享相关推荐

  1. .net之工作流工程展示及代码分享(二)工作流引擎

    在介绍完表单类的时候,接下来介绍工作流引擎,主要由四个类组成,分别是流程.流程步骤.流程实例.流程步骤实例类. 流程类: 1 [Serializable] 2 public class Flow 3 ...

  2. arima模型matlab代码_PSTR面板平滑转换模型简介(附Matlab代码分享)

    写论文的时候用到的~相关的资料太少了,做一些简单内容和资料的分享.(PSTR模型的Matlab代码分享在最后)本文主要为简单理论和粗暴实操~ 有用的话可以点个赞哟(知乎小白卑微求赞) 嘻嘻下面进入正题 ...

  3. python登录代码思路_用python登录Dr.com思路以及代码分享

    用python登录Dr.com思路以及代码分享 发布于 2014-08-28 22:31:52 | 192 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对 ...

  4. python turtle画画 30排以内_Python竟能画这么漂亮的花,帅呆了(代码分享)

    阅读本文大概需要3分钟 关于函数和模块讲了这么久,我一直想用一个好玩有趣的小例子来总结一下,同时也作为实战练习一下. 趣味编程其实是最好的学习途径,回想十几年前我刚毕业的时候,第一份工作就给手机上写a ...

  5. Airlaunch 快捷设置代码分享

    Airlaunch 快捷设置代码分享 设置:prefs:root=SETTING 蜂窝网络:prefs:root=MOBILE_DATA_SETTINGS_ID WIFI:prefs:root=WIF ...

  6. JAVA基础代码分享--学生成绩管理

    问题描述: 从键盘读入学生成绩,找出最高分,并输出学生成绩等级. 成绩>=最高分-10  等级为'A'   成绩>=最高分-20  等级为'B' 成绩>=最高分-30  等级为'C' ...

  7. python爬取网页书籍名称代码_python爬取亚马逊书籍信息代码分享

    我有个需求就是抓取一些简单的书籍信息存储到mysql数据库,例如,封面图片,书名,类型,作者,简历,出版社,语种. 我比较之后,决定在亚马逊来实现我的需求. 我分析网站后发现,亚马逊有个高级搜索的功能 ...

  8. python简单代码画图-Python竟能画这么漂亮的花,帅呆了(代码分享)

    阅读本文大概需要3分钟 关于函数和模块讲了这么久,我一直想用一个好玩有趣的小例子来总结一下,同时也作为实战练习一下. 趣味编程其实是最好的学习途径,回想十几年前我刚毕业的时候,第一份工作就给手机上写a ...

  9. python画图完整代码-Python科学画图代码分享

    Python画图主要用到matplotlib这个库.Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形. 具体来说是pylab和p ...

最新文章

  1. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并
  2. 深入理解java虚拟机(7)---线程安全  锁优化
  3. 从range和xrange的性能对比到yield关键字(中)
  4. HTTP错误汇总及其解决方法
  5. 『MCSE 2008系统管理视频』Unit 6 文件资源管理——NTFS MCSE 2008
  6. Linux进程通信之mmap
  7. 男人动心的3种傻女孩[转载]
  8. STL 中的容器们(四)
  9. Master of Typing - Tutor for Mac(打字大师—盲打练习课程)
  10. 重磅开源!一款引入实时语音与声纹识别的网络辩论系统!
  11. 智能算法-模拟退火-粒子群-鱼群算法
  12. java实现即时通讯软件
  13. PySpark机器学习 ML
  14. 谁能走得更远?百度、阿里、腾讯的区块链技术与布局对垒
  15. stm32的语音识别_基于STM32的嵌入式语音识别模块设计实现
  16. 一行一行读取文件的两种方式
  17. 一年前寫的:計算所得稅以及計算24點遊戲
  18. html 表格 选择,html表格选择与colspan或rowspan
  19. 洞态漏洞检出测试第二期:NoSQL LDAP注入漏洞
  20. android 盘点软件,安卓还能这么用!盘点那些神奇的安卓App

热门文章

  1. 千里走单骑:09-北京到上海骑记--Day8.艰难连云港
  2. 高通CES 2018发布QCC5100低功耗蓝牙芯片
  3. 计算机技能训练bcd是什么,BCD是什么,BCDEdit命令是什么?
  4. lay-verify
  5. 第二篇-用Flutter手撸一个抖音国内版,看看有多炫
  6. 软件推荐-AntDownload
  7. xmut,JavaPTA-01
  8. 站上新风口的“智慧城市”,却还在使用“数字脚本”
  9. 一文读懂关于开源的7大理念
  10. NRRC handover有哪些关键点?