2023.12.7学习笔记 GPIO做输入

发布时间 2023-12-08 00:00:35作者: 潘守登

按键做输入:步骤仍为使能,初始化,读取IO口电平。

前两步与CPIO做输入相同,不再赘述。

读取IO口输入电平函数为       库函数: GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//第一个越火参数为哪组GPIO,第二个越火参数为第几个口。

                                              寄存器:GPIOx_IDR:端口输入寄存器(用的很少)

                                              位带操作:PEin(4) //读CPIOE.4的电平(最为简洁)。

 

一般GPIO做输入必定是要实现某些功能:今天介绍的是用key1,key2.key0,wk_up做输入操作蜂鸣器及LED0,LED1的实验。则GPIOF.8,GPIOF.9,GPIOF.10做输出,GPIOE.2,GPIOE.3,GPIOE.4(控制key0,key1,key2),GPIOA.0(控制wk_up)做输入。当按下这四个按钮是,会有不同的输出现象。

思路:先编译输出的IO口,让其能在调用时产生输出现象。(简单)

         编译一个读取按钮状态的函数,当某个按钮被点击时,返回一个值,然后一会将在主函数中利用返回值构建一个分支语句,达到不同返回值控制不同输出io口的目的

      具体函数如下:       这个

u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按键按松开标志
if(mode==1)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 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(WK_UP==1)return 4;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;//保留当前键值。
return 0;// 无按键按下
}

KEY0,1,2,WK_UP在头文件中宏定义,代表读取相应io口键值。key0,1,2为0代表被按下,WK_UP为1代表被按下。

在主函数中,我们用一个数接收返回值,然后构建switch分支语句,实现对不同IO口输出控制。

主函数:

int main(void)
{

u8 key; //保存键值
delay_init(168); //初始化延时函数
LED_Init(); //初始化LED端口
BEEP_Init(); //初始化蜂鸣器端口
KEY_Init(); //初始化与按键连接的硬件接口
LED0=0; //先点亮红灯
while(1)
{
key=KEY_Scan(0); //得到键值
if(key)
{
switch(key)
{
case WKUP_PRES: //控制蜂鸣器
BEEP=!BEEP;
break;
case KEY0_PRES: //控制LED0翻转
LED0=!LED0;
break;
case KEY1_PRES: //控制LED1翻转
LED1=!LED1;
break;
case KEY2_PRES: //同时控制LED0,LED1翻转
LED0=!LED0;
LED1=!LED1;
break;
}
}else delay_ms(10);
}

}