主页 > 电脑硬件  > 

6、GPIO输入按键检测(轮询检测)

6、GPIO输入按键检测(轮询检测)

目录

0x01、简介

0x02、硬件设计

0x03、编写函数

0x001、按键初始化

 0x002、按键检测

 0x003、按键led翻转

0x04、源程序下载地址


0x01、简介

       本次实验主要实现按键控制LED灯。

       由于机械按键在按下和抬起的时候会产生按键抖动,所以在设计的时候需要考虑如何消除抖

动,达到准确判断按键状态的目的。

       消除抖动有软硬两种方式,硬件方式可利用电容充放电的延时进行消除,软件可以通过程序进

行消除。

硬件消除抖动电路图如下:

在没有被按下的时候,GPIO 引脚的输入状态为低电平(按键所在的电路不通,引脚接地),当按键

按下时,GPIO 引脚的输入状态为高电平(按键所在的电路导通,引脚接到电源)

 由于我手上的开发板不具备硬件去除抖动的功能,所以我们这里主要介绍软件去抖动程序。

0x02、硬件设计

0x03、编写函数 0x001、按键初始化 /** *@brief key初始化 *@param 无 *@return 无 */ void Key_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 设置成上拉输入 GPIO_Init(GPIOC, &GPIO_InitStructure); }  0x002、按键检测 /** *@brief 按键扫描 *@param mode:0,不支持连续按;1,支持连续按; *@return 0,没有任何按键按下;KEY_PRES,按键被按下 */ uint8_t KEY_Scan(uint8_t mode) { static uint8_t key_up = 1; // 按键按松开标志 if(mode)key_up = 1; // 支持连按 if(key_up && (KEY == 0)) { Delay_ms(10);//去抖动 key_up = 0; if(KEY == 0) { return KEY_PRES; } } else if(KEY == 1) { key_up = 1; } return 0; // 无按键按下 }  0x003、按键led翻转 /** *@brief 按键led翻转测试 *@param 无 *@return 无 */ void Key_Led(void) { if(KEY_Scan(0) == KEY_PRES) //得到键值 { if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10) == 1) { GPIO_ResetBits(GPIOC, GPIO_Pin_10); } else { GPIO_SetBits(GPIOC, GPIO_Pin_10); } } } 0x04、源程序下载地址

下面上传一个源程序供大家参考:

download.csdn.net/download/thebestleo/87351982 download.csdn.net/download/thebestleo/87351982

标签:

6、GPIO输入按键检测(轮询检测)由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“6、GPIO输入按键检测(轮询检测)