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;// 无按键按下
}

原文地址:https://www.cnblogs.com/uestcman/p/9037963.html