今天学习了STM32F1x系列的按键输入实验,具体上分为三个步骤:
(1)使能按键对应IO口时钟,调用函数:RCC_APB2PeriphClockCmd()
(2)初始化IO模式:上拉/下拉输入。调用函数:GPIO_Init()
(3)扫描IO口电平(库函数/寄存器/位操作)
主要说一下其中的按键扫描,思路图如下:
(1)按键扫描(支持连续按)的一般思路代码:
u8 KEY_Scan(void)
{
if(KEY按下)
{
delay_ms(10) ; //延时10-20ms 用来去抖
if(KEY确实按下)
{
return KEY_Value ;
}
return 无效值 ;
}
}
(2) 按键扫描(不支持连续按)的一般思路代码:(就是说按键按下了,没有松开只能算按了一次)
在这里会用到c语言里的关键字:static
a. static声明的局部变量,存储在静态存储区
b. 它在函数调用结束之后,不会被释放,它的值会一直保留下来
c. 所以可以说static声明的局部变量,具有记忆功能
u8 KEY_Scan(void)
{
static u8 key_up = 1 ;
if(key_up&&KEY按下)
{
dealy_ms(10) ; //延时,防抖
key_up = 0 ; //标记这次key已经按下
if(KEY确实按下)
{
return KEY_Value ;
}
}
else if(KEY没有按下)
{
return 没有按下 ;
}
}
(3)按键扫描(两种模式合二为一)的一般思路:
u8 KEY_Scan(u8 mode)
{
static u8 key_up = 1 ;
if(mode == 1)
{
key_up = 1 ; //支持连续按
}
if(key_up&&KEY按下)
{
dealy_ms(10) ; //延时,防抖
key_up = 0 ; //标记这次key已经按下
if(KEY确实按下)
{
return KEY_Value ;
}
}
else if(KEY没有按下)
{
return 没有按下 ;
}
}
对函数传入的参数进行判断,就可以将两种模式合二为一,放入一个函数中去处理。