单片机学习小组
直播中

幽默

9年用户 807经验值
擅长:362163
私信 关注

stm32按键初始化函数和扫描函数如何去实现呢

GPIO的引脚有哪些?如何对其进行配置?
STM32按键初始化函数和扫描函数如何去实现呢?



回帖(1)

杨春林

2022-2-21 14:36:20
GPIO引脚图及相关配置


  图1 由原理图,可以看出各按键的GPIO接口如下表。 | WK_UP | KEY0 | KEY1 | |:-----------:|:-----------:|:-----------:| | PA0| PC5 | PA15 | 而GPIO电平的读取代码为;GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
使用如下代码,将按键名与读取电平函数绑定。由于,当按键按下时,与之相连的GPIO电平会发生变化,因此,使用该函数可以检测按键是否按下。
#define KEY0  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
按键初始化函数


  图2
   图3 由图1,我们看到KEY0和KEY1按键外接地,再看图2,由于设置上拉输入,及上拉电阻以上的开关打开:在按键未按下时,使得输入电压为高电平;当按键按下时,有电流流过上拉电阻,由于I/O口外接地,因此,输入低电平。而且,由于硬件设计,只能这样设置,不可改变设置。
那么同理,如图1,WK_UP按键外接3.3V的稳压电源,因此只能设置为下拉输入,内置下拉电路如图3。

void KEY_Init(void)
{
       
        GPIO_InitTypeDef GPIO_InitStructure;


        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC端口时钟


        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;//PA15
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;//PC5
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //同样设置上拉输入(由于,结构体中的值已经在初始化GPIOA15时,定义过了,因此,此处可以省略)
        GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5

        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//PA0
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置输入模式为下拉输入  
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA0
       
}
按键扫描函数

在key.h的头文件中,使用如下代码,将KEY0_PRES等与数字绑定。以简单区分按下了哪一个按键。

#define KEY0_PRES        1                //KEY0  
#define KEY1_PRES        2                //KEY1
#define WKUP_PRES        3                //WK_UP  
// 不支持连按的模式下,一直按住按键,只有一次响应
// 支持连按的模式下,一直按着按键将一直响应按键
u8 KEY_Scan(u8 mode)//mode为是否支持连按的标志
{         
        static u8 key_up=1;
        if(mode)key_up=1;  //按键未按下的标志          
        if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
        {
                delay_ms(10);//延时10毫秒以防按键抖动而按下按键
                key_up=0;
                if(KEY0==0)return KEY0_PRES;//确认按下的按键为KEY0
                else if(KEY1==0)return KEY1_PRES;//确认按下的按键为KEY1
                else if(WK_UP==1)return WKUP_PRES;//确认按下的按键为WKUP_PRES
        }
        else if(KEY0==1&&KEY1==1&&WK_UP==0)//若检测按键一直按着,则不置位特征位。
                key_up=1;              
        return 0;// 无按键按下
}
按下按键给出对应响应


t=KEY_Scan(0);                //得到按键扫描所按下的按键
                switch(t)
                {                                 
                        case KEY0_PRES:
                                LED0=!LED0;
                                break;
                        case KEY1_PRES:
                                LED1=!LED1;
                                break;
                        case WKUP_PRES:                               
                                LED0=!LED0;
                                LED1=!LED1;
                                break;
                        default:
                                delay_ms(10);       
                }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分