打印
[应用相关]

STM32单片机的按键检测程序设计

[复制链接]
413|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yyller|  楼主 | 2020-9-3 17:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

        STM32的按键检测相对比较简单,首先按部就班的初始化连接的到的i/o,然后写一个按键扫描函数,这个和51单片机的差不多。
         

       
       

        以下是一个比较典型的例子:

        利用按键控制LED

        key.h文件

        #ifndef__KEY_H

        #define__KEY_H

        #include“sys.h“

        #defineKEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0

        #defineKEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1

        #defineKEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//读取按键2

        #defineKEY3 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP)

        #defineKEY_UP 4

        #defineKEY_LEFT 3

        #defineKEY_DOWN 2

        #defineKEY_RIGHT 1

        void KEY_Init(void);//IO初始化

        u8 KEY_Scan(u8); //按键扫描函数

        #endif

        key.c文件

        void KEY_Init(void)//IO初始化

        {

        GPIO_InitTypeDef GPIO_InitStructure;

        //初始化KEY0--》GPIOA.13,KEY1--》GPIOA.15 上拉输入

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能时钟

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//PE2~4

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入

        GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;初始化 WK_UP--》GPIOA.0 下拉输入

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//PA0设置成输入,默认下拉

        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0

        }

        u8 KEY_Scan(u8mode)

        { static u8 key_up=1;//按键按松开标志

        if(mode)key_up=1;//支持连按

        if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))

        {

        delay_ms(10);//去抖动

        key_up=0;

        if(KEY0==0)return KEY_RIGHT;

        else if(KEY1==0)return KEY_DOWN;

        else if(KEY2==0)return KEY_LEFT;

        else if(KEY3==1)return KEY_UP;

        }elseif(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;

        return0;// 无按键按下

        }

        main.c文件

        int main(void)

        {

        u8 t;

        delay_init(); //延时函数初始化

        LED_Init(); //LED端口初始化

        KEY_Init(); //初始化与按键连接的硬件接口

        BEEP_Init(); //初始化蜂鸣器端口

        LED0=0; //先点亮红灯

        while(1) {

        t=KEY_Scan(0); //得到键值

        if(t){

        switch(t) {

        caseKEY_UP: //控制蜂鸣器

        BEEP=!BEEP;

        break;

        caseKEY_LEFT: //控制LED0翻转

        LED0=!LED0;

        break;

        caseKEY_DOWN: //控制LED1翻转

        LED1=!LED1;

        break;

        caseKEY_RIGHT: //同时控制LED0,LED1翻转

        LED0=!LED0;

        LED1=!LED1;

        break;

        }

        }else delay_ms(10);

        }

        }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

241

帖子

1

粉丝