STM32F103C8Z6按键扫描程序IO读取
IO输入的姿势
对于IO输入采用与IO输出类似的姿势
- 1 使能时钟
- 2 初始化IO口
- 2.1 定义一个初始化结构体
- 2.2 选择要初始化的IO口
- 2.3 配置IO口的输入模式
- 2.4 调用IO口初始化函数
- 3 读取IO口
GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
//配置输入io口的示例
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义一个初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//选择要初始化的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//配置IO口的输入模式
GPIO_Init(GPIOA,&GPIO_InitStructure);//调用IO口初始化函数
}
关于IO输入的模式 参考
我不太懂
- 1 模拟输入模式:此模式是将I/O口上的信号作为模拟信号直接输到STM32内部的ADC上,进行采样转换。
- 2 上拉输入模式:没有输入信号的时候默认输入高电平(因为有弱上拉)等同于在IO上接一个上拉电阻,当IO没有任何连接,即悬空,那么此时我们读该IO的电平就是高电平
- 3 下拉输入模式:没有输入信号的时候默认输入低电平(因为有弱下拉)等同于在IO上接一个下拉电阻,当IO没有任何连接,即悬空,那么此时我们读该IO的电平就是低电平
- 4 浮空输入模式:好似浮在空中,上面用绳子一拉就上去了,下面用绳子一拉就沉下去了,输入什么信号才是什么信号,对于浮空输入要保证有明确的输入信号
//这是一个与主题没什么关系的延时函数
void Delay(__IO u32 Count)
{
for(; Count != 0; Count--);
}
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY2按下
//4,KEY3按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!!
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);//去抖动
key_up=0;
if(KEY0==0)return KEY0_PRES;
else if(KEY1==0)return KEY1_PRES;
else if(KEY2==0)return KEY2_PRES;
else if(WK_UP==1)return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0;// 无按键按下
}