本节通过按键处理led来演示IO输入模式的配置
1、根据原理图按键找到对应的引脚
2、打开cubemx选择对应的芯片创建工程
3、配置系统时钟,打开外部高速时钟,配置时钟频率为72MHz
4、按键对应的引脚模式配置为输入模式
5、这里还要打开led用来做效果
6、根据原理图可知按键均是低电平触发(高电平触发的引脚这里没有展示,只需要反转后面的配置即可)
7、对于低电平触发的按键我们要将IO口配置为上拉模式(对于高电平触发的按键要配置成下拉模式)
8、生成工程,打开工程,在gpio.c文件里面添加下面的函数
uint8_t KEY_Scan(uint8_t bu_sign)
{
static uint8_t sign=1;
if(bu_sign) //支持连按
sign=1;
if((sign==1)&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
HAL_Delay(10);
sign=0;
if(KEY0==0||KEY1==0||KEY2==0||WK_UP==1)
{
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) sign=1;
return 0;
}
9、在gpio.h文件里面添加图示宏定义以及函数声明
#define KEY0 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)
#define KEY1 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)
#define KEY2 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)
#define WK_UP HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
uint8_t KEY_Scan(uint8_t bu_sign);
10、主函数如图所示
uint8_t key;
key=KEY_Scan(0);
if(key)
switch(key)
{
case 1:HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); break;
case 2:HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET); break;
case3:HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET); break;
case4:HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET); break;
default:break;
}
11、烧录进单片机即可观察现象啦。
本节通过按键处理led来演示IO输入模式的配置
1、根据原理图按键找到对应的引脚
2、打开cubemx选择对应的芯片创建工程
3、配置系统时钟,打开外部高速时钟,配置时钟频率为72MHz
4、按键对应的引脚模式配置为输入模式
5、这里还要打开led用来做效果
6、根据原理图可知按键均是低电平触发(高电平触发的引脚这里没有展示,只需要反转后面的配置即可)
7、对于低电平触发的按键我们要将IO口配置为上拉模式(对于高电平触发的按键要配置成下拉模式)
8、生成工程,打开工程,在gpio.c文件里面添加下面的函数
uint8_t KEY_Scan(uint8_t bu_sign)
{
static uint8_t sign=1;
if(bu_sign) //支持连按
sign=1;
if((sign==1)&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
HAL_Delay(10);
sign=0;
if(KEY0==0||KEY1==0||KEY2==0||WK_UP==1)
{
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) sign=1;
return 0;
}
9、在gpio.h文件里面添加图示宏定义以及函数声明
#define KEY0 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)
#define KEY1 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)
#define KEY2 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)
#define WK_UP HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
uint8_t KEY_Scan(uint8_t bu_sign);
10、主函数如图所示
uint8_t key;
key=KEY_Scan(0);
if(key)
switch(key)
{
case 1:HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); break;
case 2:HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET); break;
case3:HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET); break;
case4:HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET); break;
default:break;
}
11、烧录进单片机即可观察现象啦。
举报