stm32按键切换灯的颜色

1.全部代码

#include "stm32F4xx.h"
#include "stm32f4xx_conf.h"
#include "stdio.h"

int couter = 0;
uint8_t key1;
uint8_t key2;
uint8_t color=0;

void delay(__IO uint32_t ms)
{
    for(;ms!=0;ms--);
}

void LED_init()
{
    GPIO_InitTypeDef gpio_info;
    //PH0
    //初始化GPIOH时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE);
    
    gpio_info.GPIO_Mode = GPIO_Mode_OUT;
    gpio_info.GPIO_OType = GPIO_OType_PP;
    gpio_info.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
    gpio_info.GPIO_PuPd = GPIO_PuPd_UP;
    gpio_info.GPIO_Speed = GPIO_Low_Speed;
    
    GPIO_Init(GPIOH,&gpio_info);
}

void key_init()
{
    GPIO_InitTypeDef gpio_info;
    EXTI_InitTypeDef exti_info;
    NVIC_InitTypeDef  NVIC_InitStructure;
    //PA0
    //初始化GPIOA的时钟    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    //初始化中断时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
    
    //配置按键
    gpio_info.GPIO_Mode = GPIO_Mode_IN;
    gpio_info.GPIO_OType = GPIO_OType_PP;
    gpio_info.GPIO_Pin = GPIO_Pin_0;
    gpio_info.GPIO_PuPd = GPIO_PuPd_NOPULL;
    gpio_info.GPIO_Speed = GPIO_Low_Speed;
    GPIO_Init(GPIOA,&gpio_info);
    
      gpio_info.GPIO_Mode = GPIO_Mode_IN;
    gpio_info.GPIO_OType = GPIO_OType_PP;
    gpio_info.GPIO_Pin = GPIO_Pin_13;
    gpio_info.GPIO_PuPd = GPIO_PuPd_NOPULL;
    gpio_info.GPIO_Speed = GPIO_Low_Speed;
    GPIO_Init(GPIOC,&gpio_info);
    

    //配置按键的外部中断
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
    exti_info.EXTI_Line = EXTI_Line0;
    exti_info.EXTI_LineCmd = ENABLE;
    exti_info.EXTI_Mode = EXTI_Mode_Interrupt;
    exti_info.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_Init(&exti_info);
    
    //配置这个外部中断的优先级
    NVIC_InitStructure.NVIC_IRQChannel =  EXTI0_IRQn;   //PA0 对应的是EXTI0_IRQn
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_Init(&NVIC_InitStructure);
}


//编写中断服务函数
void EXTI0_IRQHandler()
{
   if(EXTI_GetITStatus(EXTI_Line0)!= RESET)
    color ++;
    if (color >2)
    color =0;
    EXTI_ClearITPendingBit(EXTI_Line0);
}
#define led_red GPIO_Pin_10
#define led_green GPIO_Pin_11
#define led_blue GPIO_Pin_12

int main(void)
{
    
    LED_init();
    key_init();
    
    //关闭11、12
    GPIO_SetBits(GPIOH,GPIO_Pin_11|GPIO_Pin_12);
     
while(1)
    {
      if(color ==0)
                 {
                    GPIO_ResetBits(GPIOH,led_red );
                     GPIO_SetBits(GPIOH,led_green|led_blue);

                   }
                else 
              {
                    GPIO_SetBits(GPIOH,led_red );
                    }
                    
            if(color ==1)
                   {
                    GPIO_ResetBits(GPIOH,led_green);
                    GPIO_SetBits(GPIOH,led_red|led_blue);

                      }
                else 
                   {
                    GPIO_SetBits(GPIOH,led_green);
                     }
                    
         if(color ==2)
                   {
                    GPIO_ResetBits(GPIOH,led_blue);
                    GPIO_SetBits(GPIOH,led_red|led_green);

                      }
                else 
                   {
                    GPIO_SetBits(GPIOH,led_blue);
                      }    
    }
}

2.代码解读:

1.LED灯开

GPIO_ResetBits(GPIOH,led_red );开红灯

GPIO_ResetBits(GPIOH,led_green);开绿灯

GPIO_ResetBits(GPIOH,led_blue);开蓝灯

2.LED灯关

GPIO_SetBits(GPIOH,led_red );关红灯

GPIO_SetBits(GPIOH,led_green);关绿灯

GPIO_SetBits(GPIOH,led_blue);关蓝灯
        

3.

if(color ==0)//当color=0时,
                
                 {
                    GPIO_ResetBits(GPIOH,led_red );、

                               //   led红灯开
                     GPIO_SetBits(GPIOH,led_green|led_blue);

                               //     led绿和蓝灯关(防止三种颜色混合)

                   }
                else 
              {
                    GPIO_SetBits(GPIOH,led_red );

                                //   最后关led红灯
                    }

3.运行结果

  • 32
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值