ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-12-25 15:30:35  阅读:198  来源: 互联网

标签:LED1 count LED2 PIN -- stm32 step 按键 GPIO


按键切换灯的频率

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();

标签:LED1,count,LED2,PIN,--,stm32,step,按键,GPIO
来源: https://blog.csdn.net/li520_fei/article/details/122143714

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有