目录
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、源程序下载地址
下面上传一个源程序供大家参考:
https://download.csdn.net/download/thebestleo/87351982https://download.csdn.net/download/thebestleo/87351982