STM32学习---GPIO和按键(流水灯学习)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XUCHEN1230/article/details/84303366
//main的完整过程:
int main(void){
	 
	LED_GPIO_CONFIG();	//定义LED灯;
	
	
	KEY_GPIO_CONFIG();	//定义按键;
	 
	 //循环判断按键的过程:
	 while(1){
			if((KEY_SCANF(GPIOC,GPIO_Pin_5)==0)){				//确定按键完全按下
				if(GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2)==0)	//当灯都亮起时,GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2)读到输出数据;
				      GPIO_SetBits(GPIOD,GPIO_Pin_2);			//置位,灯灭;
				else
					GPIO_ResetBits(GPIOD,GPIO_Pin_2);			//复位,灯亮
			}
	}
}
 
//关于KEY的操作;
 //实现操作:(初始时灯亮)按一下按键后灯灭,再按一下灯亮;
 
 先按之前的代码点亮一个LED灯;
 GPIO_InitTypeDef GPIO_D;
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

	 GPIO_D.GPIO_Pin=GPIO_Pin_2;
	 GPIO_D.GPIO_Mode=GPIO_Mode_Out_PP;
	 GPIO_D.GPIO_Speed=3;
	 GPIO_Init(GPIOD,&GPIO_D);

//然后定义按键;
void KEY_GPIO_CONFIG(void)
{
	GPIO_InitTypeDef GPIO_C;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	
    GPIO_C.GPIO_Pin=GPIO_Pin_5;
	GPIO_C.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_C.GPIO_Speed=1;
	GPIO_Init(GPIOC,&GPIO_C);
}
//定义按键和定义LED灯的过程差不多,主要区别在于Mode的配置上;
/*
4种输入模式 :
GPIO_Mode_IPD(下拉输入模式):在默认情况下(GPIO引脚无输入的情况下),读取得GPIO的引脚数据为1;
GPIO_Mode_IPU(上拉输入模式):在默认情况下(GPIO引脚无输入的情况下),读取得GPIO的引脚数据为0;
GPIO_Mode_IN_FLOATING(浮空输入模式):在芯片内部既没有上拉也没有下拉,经由触发器输入。由于其阻抗较大,所以一般把这种模式用于标准的通信协议如I2C,USART的接收端。
GPIO_Mode_AIN(模拟输入模式):关闭施密特触发器,不接入上、下拉电阻,经由另一线路把电压信号传送到片上外设模块。如传送到ADC模块,由ADC模块采集电压信号。所以使用ADC外设的时候,必须设置为模拟输入模式。

4种输出模式:
GPIO_Mode_Out_PP(普通推挽输出):一般用于输出电平为0和3.3V的场合。
GPIO_Mode_Out_OD(普通开漏输出):一般应用在电平不匹配的场合,如需要输出5V的高电平,就需要在外部接一个上拉电阻,电源为5V,把GPIO设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5V的电平。
GPIO_Mode_AF_PP(复用推挽输出):
GPIO_Mode_AF_OD(复用开漏输出):
*/
//根据原理图:当KEY没有按下时为高电平,按下时为低电平,根据上述模式的介绍,可以选择上拉输入模式(GPIO_Mode_IPU)

//定义一个扫描KEY输入的函数:
u8 KEY_SCANF(GPIO_TypeDef* a,u16 PIN)
{
	if(GPIO_ReadInputDataBit(a,PIN)==0){
		Delay(10000);	//按键消抖
		if(GPIO_ReadInputDataBit(a,PIN)==0){
			while(GPIO_ReadInputDataBit(a,PIN)==0);//
						return 0;
		}
		else{
			return 1;
		}
	}
	else
		return 1;
}
//逐句分析:
if(GPIO_ReadInputDataBit(a,PIN)==0):
//新的库函数:GPIO_ReadInputDataBit(a,PIN),读取输入的数据,可用输入电平高低判断。
//根据调用函数:KEY_SCANF(GPIOC,GPIO_Pin_5) 可知,判断的是KEY是否有输入;
//当没有按下KEY时,应输入模式确定为上拉输入模式,所以默认为高电平。然后,若有按下KEY,则输入变为低电平。
//第二个
if(GPIO_ReadInputDataBit(a,PIN)==0) //是确认确实有按键按下,而不是按下一半返回。
while(GPIO_ReadInputDataBit(a,PIN)==0);//不停的检测按键的电平,直至按键被释放,被释放后,按键的电平又恢复到默认的高电平。
//实际上这一整个过程都是按键扫描、消抖。

猜你喜欢

转载自blog.csdn.net/XUCHEN1230/article/details/84303366