龙空技术网

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

电子友人章 662

前言:

此时同学们对“c语言监控键盘输入”大约比较重视,小伙伴们都想要知道一些“c语言监控键盘输入”的相关文章。那么小编在网上收集了一些有关“c语言监控键盘输入””的相关文章,希望同学们能喜欢,看官们快快来学习一下吧!

触摸按键输入检测

实验目的掌握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状态会灭。

标签: #c语言监控键盘输入 #c语言判断按键按下运行功能 #c语言检测键盘输入的按键