【正点原子】STM32开发板实验教程(F103)第17讲按键输入实验—GPIO做输入

GPIO输操作说明

  1. 读取IO口输入电平调用库函数为:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

2.读取IO口输入电平操作寄存器为:
GPIOx_IDR:端口输入寄存器

3.使用位带操作读取IO口输入电平:
PEin(4) -读取GPIOE.4口电平
PEin(n) -读取GPIOE.n口电平

3.按键输入实验

使能按键对应IO口时钟。调用函数:
RCC_APB2PeriphClockCmd();

初始化IO模式:上拉/下拉输入。调用函数:
GPIO——Init();

扫描IO口电平(库函数/寄存器/位操作)。

C语言关键字:Static

Static申明的局部变量,存储在静态存储区
它在函数调用结束后,不会被释放。它的值会一直保留下来。
所以可以说static申明的局部变量,具有记忆功能。

每次调用getValue函数之后,返回值是多少?

int getValue(void)
{
int flag = 0;
flag++;
return flag;
}
int getValue(void)
{
static int flag = 0;
flag++;
return flag;
}

按键扫描(支持连续按)的一般思路

如果我要实现:按键按下,没有松开,只能算按下一次,这个函数无法实现。

u8 KEY_Scan(void)
{
if(KEY按下)
{
delay_ms(10);//延时10-20ms,防抖。
}
if(KEY确实按下)
{
return KEY_Value;
}
return 无效值;
}

按键扫描(不支持连续按)的一般思路

不支持连续按:就是说,按键按下了,没有松开,只能算一次。

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;
}
else if(KEY没有按下)key_up = 1;
return 没有按下
}
}

按键扫描(两种模式合二为一)的一般思路

u8 KEY_Scan(u8 mode)
{
static u8 key_up =1;
if(mode == 1)key_up =1;//支持连续按(如果没有这句话,就不支持连续按了)
if(key_up && KEY按下)
{
delay_ms(10);//延时,防抖
key_up = 0;//标记这次key已经按下
if(KEY确实按下)
{
return KEY_VALUE;
}
}
else if(KEY没有按下)key_up = 1;
return 没有按下

}

你可能感兴趣的:(【正点原子】STM32开发板实验教程(F103)第17讲按键输入实验—GPIO做输入)