stm32工程和算法分享(7)--按键切换灯的频率

2021/12/25 17:09:24

本文主要是介绍stm32工程和算法分享(7)--按键切换灯的频率,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

按键切换灯的频率

1.CubeMX配置工程

这里使用的是stm32最小系统核心板和自己搭建的小电路实现的。
请添加图片描述
这里使用的是有源蜂鸣器(按键有提示音)
使用的是有源蜂鸣器
在这里插入图片描述

CubeMX新建工程,选择芯片,配置时钟树,外部晶振以及调试接口。具体设置可参考使用cubemx配置stm32(二)__核心配置

然后配置GPIO口,电路图看到按键按下时接地为低电平,不按下应该为高电平,所以选择内部上拉
在这里插入图片描述
在这里插入图片描述
上图配置完BEEP和KEY,再配置LED1 LED2
配置完成后生成代码

2.在main.c中添加代码,完成工程的编写

定义全局变量,和函数,在main函数的while中循环调用,两个函数通过一个全局变量 flg 联系起来

CubeMX生成的代码有“/* USER CODE BEGIN WHILE / ” “ / USER CODE END WHILE */”在BEGIN,END之间加入的代码不会在重新配置时被覆盖掉

在这里插入图片描述

找到 USER CODE BEGIN 0 ,在后面写上三个函数的具体定义

在这里插入图片描述

代码如下:

uint8_t flg=0;
uint8_t style=0;
static void KEY_Task(void);
static void BEEP_Task(void);
static void LED_Task(void);
void KEY_Task(void)
{
    static uint32_t count=0;
    static uint8_t step=0;
    
    switch(step)
     {
         case 0:
         {
              if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==GPIO_PIN_RESET) 
              {
                   count++;
                   if(count>=10000) 
                   {
                        count=0;
                        step=1;
                   }
              }
              else
              {
                   count=0;
              }  
         }
         break;
         
         case 1:
         {
             if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==GPIO_PIN_SET) 
             {
                  style++;
                  style=style%3;
                  step=0;
                  flg =1;
             }
         }
         break;
     }
}

void BEEP_Task(void)
{
    static uint32_t count=0;
    static uint8_t step=0;
    
    if(flg)
     {
           switch(step)
           {
               case 0:
               {
                    HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_SET); //打开蜂鸣器
                    step=1;
               }
               break;
               
               case 1:
               {
                    count++;
                    if(count>=150000)
                    {
                        count=0;
                        HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_RESET); //关闭蜂鸣器
                        step=0;
                        flg=0;
                    }
               }
               break;
           }
     }
}

void LED_Task(void)
{
    static uint32_t count=0;
    static uint8_t step=0;
    
    switch(style)
    {
        case 0:
        {
            switch(step)
            {
                case 0:
                {
                    count++;
                    if(count>=50000)
                    {
                        count=0;
                        HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //灭LED1
                        HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET); //灭LED2
                        step=1;
                    }
                }
                break;
                
                 case 1:
                {
                    count++;
                    if(count>=50000)
                    {
                        count=0;
                        HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //亮LED1
                        HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET); //亮LED2
                        step=0;
                    }
                }
                break;
            }
        }
        break;
        
        case 1:
        {
            switch(step)
            {
                case 0:
                {
                    count++;
                    if(count>=150000)
                    {
                        count=0;
                        HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //灭LED1
                        HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET); //灭LED2
                        step=1;
                    }
                }
                break;
                
                 case 1:
                {
                    count++;
                    if(count>=150000)
                    {
                        count=0;
                        HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //亮LED1
                        HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET); //亮LED2
                        step=0;
                    }
                }
                break;
            }
        }
        break;
        
        case 2:
        {
            switch(step)
            {
                case 0:
                {
                    count++;
                    if(count>=450000)
                    {
                        count=0;
                        HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //灭LED1
                        HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET); //灭LED2
                        step=1;
                    }
                }
                break;
                
                 case 1:
                {
                    count++;
                    if(count>=450000)
                    {
                        count=0;
                        HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //亮LED1
                        HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET); //亮LED2
                        step=0;

                    }
                }
                break;
            }
        }
        break;
    }
}
     KEY_Task();
     BEEP_Task();
	 LED_Task();


这篇关于stm32工程和算法分享(7)--按键切换灯的频率的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程