优秀的编程知识分享平台

网站首页 > 技术文章 正文

【STM32F103ZET6开发板】第2-4讲:触摸按键输入检测

nanyue 2024-09-10 16:17:45 技术文章 8 ℃

触摸按键输入检测

实验目的

  • 掌握STM32 GPIO输入检测原理。
  • 掌握触摸按键检测电路的设计:触摸芯片的工作原理。
  • 掌握触摸按键检测的程序设计及算法。

实验内容

  • 编写程序实现对触摸按键的检测。

硬件电路设计

开发板触摸按键硬件电路

触摸按键是电路中常用的一种开关元器件,也是一种常用的人机接口。因触摸按键具有坚固耐用、反应速度快、节省空间、易于操作等优点,而得到广泛的应用。

根据工作原理不同,触摸按键可以分为四大类:电阻式、电容式、红外线式和表面声波式。电阻式、红外线式和表面声波式触摸按键主要应用于触摸屏上,单个按键很少使用。

IK-ZET6开发板上设计了1个电容式触摸按键,该触摸按键电路采用专门触摸按键检测芯片JR223B,检测电路如下图。

图1:开发板触摸按键检测电路

  • 1个触摸按键占用的单片机的引脚如下表:

表1:触摸按键引脚分配

KEY

形状

引脚

说明

触摸按键

白色环纹

PE1

独立GPIO

  • 注:独立GPIO表示开发板没有其他的电路使用这个GPIO。

触摸按键检测IC

JR223B是电容式单键触摸按键IC,电压输入范围为2.0V~5.5V。JR223B利用操作者的手指与触摸按键焊盘之间产生电荷电平来进行检测,通过监测电荷的微小变化来确定手指接近或者触摸到感应表面。没有任何机械部件,不会磨损,其感测部分可以放置到任何绝缘层(通常为玻璃或塑料材料)的后面,很容易制成与周围环境相密封的键盘。

下面介绍下JR223B电容式单键触摸芯片的引脚图和引脚定义。

图2:触摸芯片引脚图

表2:触摸芯片引脚定义

引脚号

引脚名称

类型

详细说明

1

OUT

OutPut

电平输出脚

2

GND

POWER

负电源,地

3

S0

InPut

传感器输入检测脚

4

SLH

I-PL

输出高低电平选择,系统内置上拉电阻

5

VDD

POWER

正电源

6

STG

I-PL

模式选择脚,系统内置上拉电阻

  • SLH引脚用于设置JR223B的输出方式。

1) SLH = 0:触摸时,JR223B的OUT引脚输出高电平,即高电平有效。

2) SLH = 1:触摸时,JR223B的OUT引脚输出地电平,即低电平有效。

  • STG引脚用于设置JR223B的工作模式。

1) STG = 0:JR223B工作在LEVEL Hold模式。

2) STG = 1:JR223B工作在ON/OFF模式。

表3:触摸芯片模式输出控制

STG

SLH

详细说明

0

0

LEVEL Hold模式,高电平有效,CMOS输出

0

1

LEVEL Hold模式,低电平有效,CMOS输出

1

0

ON/OFF模式,上电状态为CMOS低电平输出

1

1

ON/OFF模式,上电状态为CMOS高电平输出

  • 灵敏度调节:

1) 触摸芯片S0引脚上会外接一个外部电容,该电容称为灵敏度调节电容。

2) 可通过选择不同容值的灵敏度调节电容实现对触摸灵敏度的调节。

3) 灵敏度调节电容的容值必须在(0~50pF)范围内。

4) 灵敏度调节电容的容值越大,灵敏度就越低,感应面板的厚度就越薄,反之,灵敏度调节电容的容值越小,灵敏度就越高,感应面板的厚度就越厚。

  • 触摸芯片供电:触摸芯片VDD引脚供电需稳定,必要时可加LDO芯片实现。

选择哪种模式输出控制方式

用户可以根据自己项目应用的需要,来设置触摸芯片的STG和SLH引脚,实现对触摸芯片模式输出控制的选择。艾克姆科技IK-ZET6开发板将触摸芯片的STG和SLH引脚均通过下拉电阻置低,这样,触摸时,JR223B的OUT引脚输出高电平,不触摸时,JR223B的OUT引脚输出高电平。这样设计的原因是:

  • 实现触摸按键的输出和轻触按键的电路输出刚好是反的,作为开发板,要方便用户测试,2种不同类型的输出方式更方便我们使用,另外在后续的实验中我们我们还会用到按键信号的上升沿和下降沿,这时就可以通过轻触键和触摸按键来获取,而不需要另外接线。
  • 选择LEVEL Hold模式,可保证单片机对触摸按键的检测引脚电平是恒定的,有利于检测。
  • 注:开发板轻触按键电路是按键按下时,电路输出低电平,无按键按下时电路输出高电平。

软件设计

GPIO寄存器汇集

STM32F103提供了10个用于操作GPIO的寄存器,如下表所示:

表4:GPIO相关寄存器

序号

寄存器名

读/写

功能描述

1

GPIOx_CRL

读/写

端口配置低寄存器。

2

GPIOx_CRH

读/写

端口配置高寄存器。

3

GPIOx_IDR

只读

端口输入数据寄存器。

4

GPIOx_ODR

读/写

端口输出数据寄存器。

5

GPIOx_BSRR

只写

端口位设置/清除寄存器。

6

GPIOx_BRR

只写

端口位清除寄存器。

7

GPIOx_LCKR

读/写

端口配置锁定寄存器。

8

AFIO_EVCR

读/写

事件控制寄存器。

9

AFIO _MAPR

读/写

复用重映射和调试 I/O 配置寄存器。

10

AFIO _EXTICRy

读/写

外部中断线路 0-15 配置寄存器。

  • 注:x取值:A、B、C、D、E、F、G , y取值:1、2、3、4。

每一种寄存器详细的描述在这里不做具体的介绍,大家可以参考目录:“第1部分:开发板硬件资料”--->“2 - 芯片资料”中“STM32英文参考手册_V15”或“STM32中文参考手册_V10”对应的GPIO章节的寄存器部分认真研读。

GPIO库函数版本编写程序

官方提供的最终库函数版本是V3.5版本,该版本库函数提供了17个与GPIO操作有关的库函数,如下表所示:

表5:GPIO相关库函数汇集

序号

函数名

功能描述

1

GPIO_DeInit

将外设 GPIOx 寄存器重设为缺省值。

2

GPIO_AFIODeInit

将复用功能(重映射事件控制和 EXTI设置)重设为缺省值。

3

GPIO_Init

将GPIO_InitStruct中指定参数初始化外设 GPIOx 寄存器。

4

GPIO_StructInit

把GPIO_InitStruct中的每一个参数按缺省值填入。

5

GPIO_ReadInputDataBit

读取指定端口管脚的输入。

6

GPIO_ReadInputData

读取指定的 GPIO 端口输入。

7

GPIO_ReadOutputDataBit

读取指定端口管脚的输出。

8

GPIO_ReadOutputData

读取指定的 GPIO 端口输出。

9

GPIO_SetBits

设置指定的数据端口位。

10

GPIO_ResetBits

清除指定的数据端口位。

11

GPIO_WriteBit

设置或者清除指定的数据端口位。

12

GPIO_Write

向指定 GPIO 数据端口写入数据。

13

GPIO_PinLockConfig

锁定 GPIO 管脚设置寄存器。

14

GPIO_EventOutputConfig

选择 GPIO 管脚用作事件输出。

15

GPIO_EventOutputCmd

使能或者失能事件输出。

16

GPIO_PinRemapConfig

改变指定管脚的映射。

17

GPIO_EXTILineConfig

选择 GPIO 管脚用作外部中断线路。

  • 注:x取值:A、B、C、D、E、F、G 。

每一种寄存器详细的描述在这里不做具体的介绍,大家可以参考目录:“第1部分:开发板硬件资料”--->“2 - 芯片资料”中“STM32固件库使用手册的中文翻译版”对应的GPIO章节的库函数部分认真研读。


触摸按键的输入检测

  • 注:本节对应的实验源码是:“实验4:触摸按键输入检测”。

工程需要用到的库文件

在使用库函数建“实验4:触摸按键输入检测”工程时,需要用到的c文件如下表所示。

表6:实验需要用到的C文件

序号

文件名

后缀

功能描述

1

stm32f10x_rcc

.c

复位与时钟控制器。

2

stm32f10x_gpio

.c

通用输入输出。

  • 注:所建工程必须添加上面c文件。

可按下图所示在新建工程时添加需要的c文件。

图3:在新建工程中添加所需库函数c文件

表7:实验需要用到的H文件

序号

文件名

后缀

功能描述

1

stm32f10x_rcc

.h

复位与时钟控制器。

2

stm32f10x_gpio

.h

通用输入输出。

  • 注:所建工程必须添加上面h文件所在的目录:..\..\ Lib\ F10x_FWLIB\ inc。

在使用该实验工程时,需要用到的h文件如表5所示。需要在MDK中点击魔术棒,打开工程配置窗口,按照下图所示添加头文件包含路径。

图4:如何添加头文件包含路径

编写代码

首先是调用库函数完成用户指示灯D1和触摸按键的初始化配置,初始化代码如下。

代码清单:初始化用户指示灯D1的GPIO引脚

  1. /***************************************************************************
  2. * 描 述 : 初始化单片机控制D1的引脚PG6,并将D1的初始状态设置为熄灭
  3. * 参 数 : 无
  4. * 返回值 : 无
  5. **************************************************************************/
  6. void led_init(void)
  7. {
  8. //定义IO初始化配置结构体
  9. GPIO_InitTypeDef GPIO_InitStructure;
  10. //打开PG端口时钟
  11. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
  12. //配置的IO是PG6
  13. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  14. //配置为通用推挽输出
  15. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  16. //IO口速度为50MHz
  17. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18. //调用库函数GPIO_Init()配置IO
  19. GPIO_Init(GPIOG, &GPIO_InitStructure);
  20. //设置D1初始化状态为熄灭
  21. GPIO_SetBits(GPIOG,GPIO_Pin_6);
  22. }


代码清单:初始化触摸按键的GPIO引脚

  1. /***************************************************************************
  2. * 描 述 : 初始化单片机检测触摸按键的引脚PE1
  3. * 参 数 : 无
  4. * 返回值 : 无
  5. **************************************************************************/
  6. void touchkey_init(void)
  7. {
  8. //定义IO初始化配置结构体
  9. GPIO_InitTypeDef GPIO_InitStructure;
  10. //打开PE端口时钟
  11. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
  12. //配置的IO是PE1
  13. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  14. //配置为上拉输入
  15. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  16. //调用库函数GPIO_Init()配置IO
  17. GPIO_Init(GPIOE, &GPIO_InitStructure);
  18. }

然后,在主函数中加入对触摸按键GPIO口PE1检测的函数,一旦检测到PE1为高电平,先软件上进行按键消抖设计,再将用户指示灯D1点亮。若人手不触摸触摸按键,则检测到PE1为低电平,则将用户指示灯D1熄灭。

代码清单:主函数

  1. int main(void)
  2. {
  3. //初始化用于驱动指示灯D1的引脚PG6
  4. led_init();
  5. //初始化用于检测触摸按键的引脚PE1
  6. touchkey_init();

  7. //主循环
  8. while(1)
  9. {
  10. //调用库函GPIO_ReadInputDataBit()检测触摸按键对应引脚PE1的电平是否为低电平
  11. //(可参考开发板原理图易知当手指触摸触摸按键感应区域时,PE1会有高电平信号)
  12. if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1) == 1 )
  13. {
  14. //软件延时10ms,如果延时后按键S1的电平依然没有变化,说明按键确实被有效操作,简称按键防抖动
  15. sw_delay_ms(10);
  16. //检测触摸按键对应引脚PE1的电平依然为低电平,即手指触摸触摸按键
  17. if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1) == 1 )
  18. {
  19. //驱动LED指示灯D1的引脚(PG6)输出低电平,即点亮D1
  20. GPIO_ResetBits(GPIOG,GPIO_Pin_6);
  21. //等待触摸按键释放,即如果PE1一直为高电平,会一直执行空命令
  22. while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1) == 1 )
  23. {
  24. ; //条件GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1) == 1成立,会执行这个空命令
  25. }
  26. //触摸按键释放,会执行下一行语句,即驱动LED指示灯D1的引脚(PG6)输出高电平,熄灭D1
  27. GPIO_SetBits(GPIOG,GPIO_Pin_6);
  28. }
  29. }
  30. }
  31. }

实验步骤

  1. 解压“…\第3部分:标准库教程和实验源码\ 1 - 基础实验程序\”目录下的压缩文件“实验4:触摸按键输入检测”,将解压后得到的文件夹拷贝到合适的目录,如“D\STM32F103ZET6”。
  2. 启动MDK5.23。
  3. 在MDK5中执行“Project→Open Project”打开“…\ TOUCH_KEY \projec”目录下的工程“TOUCH_KEY.uvproj”。
  4. 点击编译按钮编译工程。注意查看编译输出栏,观察编译的结果,如果有错误,修改程序,直到编译成功为止。编译后生成的HEX文件“TOUCH_KEY.hex”位于工程目录下的“Objects”文件夹中。
  5. 点击下载按钮下载程序。如果需要对程序进行仿真,点击Debug按钮,即可将程序下载到STM32F103ZET6中进行仿真。
  6. 程序运行后,可观察到用手触摸开发板右下角的触摸按键对应用户指示灯D1状态会亮,否则用户指示灯D1状态会灭。

Tags:

最近发表
标签列表