一、按键的检测的原理
根据STMF103VET6的原理图我们可以知道按键在没有按下时I/O口的电平为低电平,按键按下时I/O的电平为高电平。因此我们只需要读取按键对应的I/O口的电平就可以判断按键。
二、示例代码
1、首要初始化两个按键的GPIO。
void KEY_Init(void)
{
//打开GPIOA GPIOC的时钟
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC,ENABLE);
//初始化GPIO
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);
}
2、检测按键是否被按下。
uint8_t Key_Scan(void)
{
/*检测是否有按键按下 */
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1 )
{
/*等待按键释放 */
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1);
return 1;
}
else
return 0;
}
uint8_t Key_PC13_Scan(void)
{
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == 1)
{
while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == 1)
return 1;
}
else
return 0;
}
三、功能验证
在主函数中调用相关函数,通过按键来控制小灯的亮灭,按下PA0连接的按键小灯被点亮,按下PC13连接的按键小灯熄灭
int main()
{
LED_Init();
KEY_Init();
while(1)
{
if(Key_Scan()==1)
{
LED_Red_On();
}
if(Key_PC13_Scan()==1)
{
LED_Red_Off();
}
}
}