版权声明:本文为博主原创文章,未经博主允许不得转载。 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);//不停的检测按键的电平,直至按键被释放,被释放后,按键的电平又恢复到默认的高电平。
//实际上这一整个过程都是按键扫描、消抖。