网站首页 > 技术文章 正文
触摸按键输入检测
实验目的
- 掌握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引脚
- /***************************************************************************
- * 描 述 : 初始化单片机控制D1的引脚PG6,并将D1的初始状态设置为熄灭
- * 参 数 : 无
- * 返回值 : 无
- **************************************************************************/
- void led_init(void)
- {
- //定义IO初始化配置结构体
- GPIO_InitTypeDef GPIO_InitStructure;
- //打开PG端口时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
- //配置的IO是PG6
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- //配置为通用推挽输出
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- //IO口速度为50MHz
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- //调用库函数GPIO_Init()配置IO
- GPIO_Init(GPIOG, &GPIO_InitStructure);
- //设置D1初始化状态为熄灭
- GPIO_SetBits(GPIOG,GPIO_Pin_6);
- }
代码清单:初始化触摸按键的GPIO引脚
- /***************************************************************************
- * 描 述 : 初始化单片机检测触摸按键的引脚PE1
- * 参 数 : 无
- * 返回值 : 无
- **************************************************************************/
- void touchkey_init(void)
- {
- //定义IO初始化配置结构体
- GPIO_InitTypeDef GPIO_InitStructure;
- //打开PE端口时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
- //配置的IO是PE1
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- //配置为上拉输入
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- //调用库函数GPIO_Init()配置IO
- GPIO_Init(GPIOE, &GPIO_InitStructure);
- }
然后,在主函数中加入对触摸按键GPIO口PE1检测的函数,一旦检测到PE1为高电平,先软件上进行按键消抖设计,再将用户指示灯D1点亮。若人手不触摸触摸按键,则检测到PE1为低电平,则将用户指示灯D1熄灭。
代码清单:主函数
- int main(void)
- {
- //初始化用于驱动指示灯D1的引脚PG6
- led_init();
- //初始化用于检测触摸按键的引脚PE1
- touchkey_init();
- //主循环
- while(1)
- {
- //调用库函GPIO_ReadInputDataBit()检测触摸按键对应引脚PE1的电平是否为低电平
- //(可参考开发板原理图易知当手指触摸触摸按键感应区域时,PE1会有高电平信号)
- if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1) == 1 )
- {
- //软件延时10ms,如果延时后按键S1的电平依然没有变化,说明按键确实被有效操作,简称按键防抖动
- sw_delay_ms(10);
- //检测触摸按键对应引脚PE1的电平依然为低电平,即手指触摸触摸按键
- if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1) == 1 )
- {
- //驱动LED指示灯D1的引脚(PG6)输出低电平,即点亮D1
- GPIO_ResetBits(GPIOG,GPIO_Pin_6);
- //等待触摸按键释放,即如果PE1一直为高电平,会一直执行空命令
- while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1) == 1 )
- {
- ; //条件GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1) == 1成立,会执行这个空命令
- }
- //触摸按键释放,会执行下一行语句,即驱动LED指示灯D1的引脚(PG6)输出高电平,熄灭D1
- GPIO_SetBits(GPIOG,GPIO_Pin_6);
- }
- }
- }
- }
实验步骤
- 解压“…\第3部分:标准库教程和实验源码\ 1 - 基础实验程序\”目录下的压缩文件“实验4:触摸按键输入检测”,将解压后得到的文件夹拷贝到合适的目录,如“D\STM32F103ZET6”。
- 启动MDK5.23。
- 在MDK5中执行“Project→Open Project”打开“…\ TOUCH_KEY \projec”目录下的工程“TOUCH_KEY.uvproj”。
- 点击编译按钮编译工程。注意查看编译输出栏,观察编译的结果,如果有错误,修改程序,直到编译成功为止。编译后生成的HEX文件“TOUCH_KEY.hex”位于工程目录下的“Objects”文件夹中。
- 点击下载按钮下载程序。如果需要对程序进行仿真,点击Debug按钮,即可将程序下载到STM32F103ZET6中进行仿真。
- 程序运行后,可观察到用手触摸开发板右下角的触摸按键对应用户指示灯D1状态会亮,否则用户指示灯D1状态会灭。
猜你喜欢
- 2024-09-10 【STM32F103ZET6开发板】第2-1讲:GPIO硬件设计及原理介绍
- 2024-09-10 【STM32F103ZET6开发板】第2-5讲:外部中断EXTI
- 2024-09-10 关于Linux 进程编程入门(进阶)(linux进程代码)
- 2024-09-10 「STC8A8K64D4开发板」第2-12讲:数码管显示
- 2024-09-10 【STM32F103ZET6开发板】第2-6讲:USART串口通信
- 2024-09-10 【STM32F103ZET6开发板】第2-3讲:GPIO输出驱动蜂鸣器
- 2024-09-10 【STM32F103ZET6开发板】第2-2讲:GPIO输入按键检测
- 2024-09-10 【STM32F103ZET6开发板】第3-7讲:电子墨水屏显示
- 2024-09-10 【STC8A8K64D4开发板】——第2-2讲:有源蜂鸣器鸣响控制
- 2024-09-10 MySQL数据库审计核心实现(内有代码)
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)