yuzhongzhen 发表于 2018-3-29 14:22:48

STM32——按键

转载请注明出处:http://blog.csdn.net/wqx521
STM32——按键
宗旨:技术的学习是有限的,分享的精神是无限的。

一、GPIO工作模式https://img-blog.csdn.net/201603211022421611、当I/O端口配置为输入时:
输出缓冲器被禁止施密特触发输入被激活
根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
对输入数据寄存器的读访问可得到I/O状态2、当I/O端口被配置为输出时:
输出缓冲器被激活
─ 开漏模式:输出寄存器上的’0’激活 N-MOS,而输出寄存器上的’1’将端口置于高阻状态(P-MOS 从不被激活)。
─ 推挽模式:输出寄存器上的’0’激活 N-MOS,而输出寄存器上的’1’将激活 P-MOS。施密特触发输入被激活
弱上拉和下拉电阻被禁止
出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。
二、库函数GPIO_ReadInputDataBit
view plain copy



[*]typedef enum
[*]{
[*]Bit_RESET = 0,
[*]Bit_SET
[*]} BitAction;
[*]
[*]uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx, uint16_t GPIO_Pin) // 返回输入引脚电平的状态
[*]{
[*]uint8_t bitstatus = 0x00;
[*]
[*]/*Check the parameters */
[*]assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
[*]assert_param(IS_GET_GPIO_PIN(GPIO_Pin));
[*]
[*]if((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
[*]{
[*]    bitstatus = (uint8_t)Bit_SET; // 按键没被按下返回1
[*]}
[*]else
[*]{
[*]    bitstatus = (uint8_t)Bit_RESET; // 按键按下返回0
[*]}
[*]return bitstatus;
[*]}<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>


三、按键【消抖】
view plain copy



[*]#ifndef _KEY_H_
[*]#define _KEY_H_
[*]
[*]#include "stm32f10x.h"
[*]/*******
[*]*按键按下标置
[*]KEY_ON 0
[*]KEY_OFF 1
[*]********/
[*]#define KEY_ON0
[*]#define KEY_OFF 1
[*]
[*]void KeyGPIOConfig(void);
[*]uint8_t KeyScan(GPIO_TypeDef *GPIOx, u16 GPIO_Pin);
[*]
[*]#endif /* _KEY_H_ */

view plain copy



[*]#include "key.h"
[*]
[*]void Delay(__IO u32 count)
[*]{
[*]while(count--);
[*]}
[*]
[*]void KeyGPIOConfig(void)
[*]{
[*]GPIO_InitTypeDef GPIO_InitStructure;
[*]
[*]/*开启按键端口(PE5)的时钟*/
[*]RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
[*]
[*]GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
[*]//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; // GPIO输入模式时,不用配置速率
[*]GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
[*]
[*]GPIO_Init(GPIOE, &GPIO_InitStructure);
[*]}
[*]
[*]
[*]uint8_t KeyScan(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
[*]{
[*]/*检测是否有按键按下 */
[*]if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON )
[*]{
[*]    /*延时消抖*/
[*]    Delay(10000);
[*]    if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON )
[*]    {
[*]      /*等待按键释放 */
[*]      while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON);
[*]      returnKEY_ON;
[*]    }
[*]    else
[*]    {
[*]      return KEY_OFF;
[*]    }
[*]}
[*]else
[*]{
[*]    return KEY_OFF;
[*]}
[*]}


1、利用 GPIO_ReadInputDataBit() 读取输入数据,若从相应引脚读取得的数据等于 0 (KEY_ON),低电平,表明可能有按键按下,调用延时函数。否则返回 KEY_OFF,表示按键没有被按下。2、 延时之后再次利用 GPIO_ReadInputDataBit() 读取输入数据,若依然为低电平,表明确实有按键被按下了。否则返回 KEY_OFF,表示按键没有被按下。3、 循环调用 GPIO_ReadInputDataBit()一直检测按键的电平,直至按键被释放,被释放后,返回表示按键被按下的标志 KEY_ON。
----------------------------------华丽的分界线-----------------------------北京万邦易嵌科技有限公司:专业提供单片机、M3/M4、linux、Android、QT技术服务、技术培训。详细咨询请加QQ:715493858
页: [1]
查看完整版本: STM32——按键