1、综述
STM32F4的IO口做输入使用的时候,是通过调用函数GPIO_ReadInputDataBit()来读取IO口的状态的。
2、按键的“是否支持连续按”
(1)支持连续按下
是指,如果某个键一直按下,则会一直返回这个按键的键值。就像电视机的遥控器上音量键、频道加减键,你一直按下,音量或频道会一直变化,视作按下多次。
函数实现:
u8 KEY_Scan(void)
{
if(KEY按下)
{
delay_ms(10);//防抖
if(KEY确实被按下)
{
return KEY_Value;
}
return 无效值;
}
}
(2)不支持连续按
是指,如果某个键一直按下,没有松开,只能算作一次按下。
函数实现:
u8 KEY_Scan(void)
{
static u8 key_up = 1;
if(key_up && KEY按下)
{
delay_ms(10);//防抖
key_up = 0;//标志这次KEY已经按下
if(KEY确实被按下)
{
return KEY_Value;
}
return 无效值;
}
else if(KEY没有被按下)
{
key_up = 1;
}
}
3、按键实验源代码(将2中两种情况整合在一起)
//扫描这四个按键中是否有按键被按下,
//如果有按键被按下,返回对应的键值,否则返回0
u8 KEY_Scan(u8 mode)
{
static u8 key_up = 1;//按键松开标志
if(mode)//支持连按
{
key_up = 1;
}
if(key_up && (KEY0 == 0 || KEY1 == 0 || KEY2 == 0 || WK_UP == 1))//如果这几个按键中有按键被按下
{
delay_ms(10);//去除抖动
if(KEY0 == 0)
{
return 1;
}
else if(KEY1 == 0)
{
return 2;
}
else if(KEY2 == 0)
{
return 3;
}
else if(WK_UP == 1)
{
return 4;
}
}
else if(KEY0 == 1 && KEY1 == 1 && KEY2 == 1 && WK_UP == 0)//如果这几个按键都没有被按下
{
key_up = 1;
}
return 0;
}
4、IO口作为输入的配置
//初始化按键输入口的IO
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//两组GPIO的初始化,定义一个结构体就行
//使能对应的IO口时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
//GPIOA初始化
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;//重新选中
//GPIO_InitStructure.GPIO_OType = //做输入,不设置OTYPE
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
//GPIOE初始化
GPIO_Init(GPIOE,&GPIO_InitStructure);
}