STM32
直播中

张鑫

7年用户 801经验值
私信 关注
[问答]

请问一下STM32F407ZE是怎样通过按键去控制LED灯的

请问一下STM32F407ZE是怎样通过按键去控制LED灯的?

回帖(1)

陈丹丽

2021-11-25 11:05:46
STM32F407ZE 通过按键控制LED灯示例,要求:
①按键按下 D1亮 按键松开 D1灭
②按键按下一次 D1亮 按键再按下一次 D1灭 ----(按键每按下一次D1实现翻转)
需要注意的是按键需用到延时消抖,延时时长按实际进行修改,检测按键按下与松开应该使用标志位等区分,如果只是通过读取按键返回值判断,在while循环里可能会对同一个LED灯多次操作。

#include


void delay_ms(int ms)                                                                        //延时函数
{
        int i,j;
        for(i=0; i                 for(j=0; j<10000;j++);
}


void LED_Init()
{
        GPIO_InitTypeDef led1,led2;
        //先开启对应用到的模块时钟节拍
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
       
        //初始化LED1、LED2、蜂鸣器
        led1.GPIO_Pin         = GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_8;
        led1.GPIO_Mode         = GPIO_Mode_OUT;
        led1.GPIO_Speed = GPIO_Fast_Speed;
        led1.GPIO_OType = GPIO_OType_PP;
        led1.GPIO_PuPd  = GPIO_PuPd_UP;
        GPIO_Init(GPIOF,&led1);
       
        //初始化LED3、LED4
        led2.GPIO_Pin         = GPIO_Pin_13 | GPIO_Pin_14;
        led2.GPIO_Mode         = GPIO_Mode_OUT;
        led2.GPIO_Speed = GPIO_Fast_Speed;
        led2.GPIO_OType = GPIO_OType_PP;
        led2.GPIO_PuPd  = GPIO_PuPd_UP;
        GPIO_Init(GPIOE,&led2);
       
        //所有LED灯置高电平(熄灯)
        GPIO_ToggleBits(GPIOF,GPIO_Pin_9);       
        GPIO_ToggleBits(GPIOF,GPIO_Pin_10);       
        GPIO_ToggleBits(GPIOE,GPIO_Pin_13);       
        GPIO_ToggleBits(GPIOE,GPIO_Pin_14);       
}


void KEY_Init()
{
        GPIO_InitTypeDef KEY1,KEY2;
        //先开启对应用到的模块时钟节拍
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
       
        //初始化KEY1
        KEY1.GPIO_Pin         = GPIO_Pin_0 ;
        KEY1.GPIO_Mode         = GPIO_Mode_IN;
        KEY1.GPIO_Speed         = GPIO_Fast_Speed;
        KEY1.GPIO_OType         = GPIO_OType_PP;
        KEY1.GPIO_PuPd          = GPIO_PuPd_UP;
        GPIO_Init(GPIOA,&KEY1);
       
        //初始化KEY2、KEY3、KEY4
        KEY2.GPIO_Pin         = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
        KEY2.GPIO_Mode         = GPIO_Mode_IN;
        KEY2.GPIO_Speed = GPIO_Fast_Speed;
        KEY2.GPIO_OType = GPIO_OType_PP;
        KEY2.GPIO_PuPd  = GPIO_PuPd_UP;
        GPIO_Init(GPIOE,&KEY2);
}


int main()
{       
        LED_Init();
        KEY_Init();
       
       
        int key1 = 1;
        int key2 = 1;
        int key3 = 1;
        int key4 = 1;
       
        while(1)
        {
                if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0)                                        //判断KEY1是否被按下
                {
                        delay_ms(50);                                                                                                        //延时消抖
                        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0)                                //判断KEY1是否被按下
                        {
                                if(key1)                                                                                                        //标志位
                                {
                                        key1 = 0;                                                                                                //标志位置0
                                        GPIO_ToggleBits(GPIOF,GPIO_Pin_9);                                                //点亮D1
                                        GPIO_ToggleBits(GPIOF,GPIO_Pin_8);                                                //按键提示音(开)
                                        delay_ms(5);
                                        GPIO_ToggleBits(GPIOF,GPIO_Pin_8);                                                //按键提示音(关)       
                                }
                        }
                }
                if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1)                                        //判断KEY1是否被松开
                        key1 = 1;                                                                                                                //标志位置1
               
               
                if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 0)                                        //判断KEY2是否被按下
                {
                        GPIO_ToggleBits(GPIOF,GPIO_Pin_10);                                                                //点亮D2
                        GPIO_ToggleBits(GPIOF,GPIO_Pin_10);                                                                //熄灭D1
                       
                        if(key2)                                                                                                                //标志位
                        {
                                key2 = 0;                                                                                                        //标志位置0
                                GPIO_ToggleBits(GPIOF,GPIO_Pin_8);                                                        //按键提示音(开)
                                delay_ms(5);
                                GPIO_ToggleBits(GPIOF,GPIO_Pin_8);                                                        //按键提示音(关)
                        }               
                }       
                if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 1)                                        //判断KEY2是否被松开
                        key2 = 1;                                                                                                                //标志位置1
               
               
                if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0)                                        //判断KEY3是否被按下
                {
                        delay_ms(50);                                                                                                        //延时消抖
                        if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0)                                //判断KEY3是否被按下
                        {
                                if(key3)                                                                                                        //标志位
                                {
                                        key3 = 0;                                                                                                //标志位置0
                                        GPIO_ToggleBits(GPIOE,GPIO_Pin_13);                                                //点亮D3
                                        GPIO_ToggleBits(GPIOF,GPIO_Pin_8);                                                //按键提示音(开)
                                        delay_ms(5);
                                        GPIO_ToggleBits(GPIOF,GPIO_Pin_8);                                                //按键提示音(关)       
                                }
                        }
                }
                if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 1)                                        //判断KEY3是否被松开
                        key3 = 1;                                                                                                                //标志位置1
               
                       
                if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 0)                                        //判断KEY4是否被按下
                {
                        GPIO_ToggleBits(GPIOE,GPIO_Pin_14);                                                                //点亮D4
                        GPIO_ToggleBits(GPIOE,GPIO_Pin_14);                                                                //熄灭D4       
                       
                        if(key4)                                                                                                                //标志位
                        {
                                key4 = 0;                                                                                                        //标志位置0
                                GPIO_ToggleBits(GPIOF,GPIO_Pin_8);                                                        //按键提示音(开)
                                delay_ms(5);
                                GPIO_ToggleBits(GPIOF,GPIO_Pin_8);                                                        //按键提示音(关)                               
                        }
                }
                if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 1)                                        //判断KEY4是否被松开
                        key4 = 1;                                                                                                                //标志位置1
        }
}
举报

更多回帖

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