不同的按键对应实现不同功能的灯闪烁

简介: 不同的按键对应实现不同功能的灯闪烁功能介绍程序解读总结


功能介绍



本程序使用STM32F103VE板子

实现功能:

按键1:实现单个灯闪烁

按键2:实现全部灯闪烁

按键3:实现流水灯

按键4:实现跑马灯


程序解读



#include "stm32f10x.h"   // 相当于51单片机中的  #include <reg51.h>
void InitScan(void);
void InitLed(void);
void Delay_us(unsigned long time);
void Delay_ms(unsigned long time);
void InitLedStatus();
void ControlSingleLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey,GPIO_TypeDef* GPIO_LED,u16 GPIO_Pin_Led);
void ControlAllLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey);
void ControlHorseRaceLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey);
void ControlWaterLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey);
/*四个标志位分别用于控制单个灯闪烁,全部灯闪烁,流水灯,跑马灯按键扫描*/
 int Flag_SingleLed = 0;
 int Flag_AllLed = 0; 
 int Flag_WaterLed = 0;
 int Flag_HorseRaceLed = 0;
int main(void)
{
  InitLedStatus();
    InitScan();
  // 来到这里的时候,系统的时钟已经被配置成72M。
  InitScan();
  InitLed();
  while(1){
  /*LED0*/
  ControlSingleLed(GPIOC,GPIO_Pin_0,GPIOA,GPIO_Pin_0); //控制灯闪烁
  /*LED1*/
  ControlAllLed(GPIOC,GPIO_Pin_1);//控制全部灯亮与灭
  /*LED2*/
  ControlWaterLed(GPIOC,GPIO_Pin_2);//实现流水灯
  /*LED3*/
  ControlHorseRaceLed(GPIOC,GPIO_Pin_3);//实现跑马灯
 }
}
void Delay_us(unsigned long time){
  unsigned long i;
  while(time--){
    i = 8;
    while(i--);
  }
}
void Delay_ms(unsigned long time){
  while(time--)
  Delay_us(1100); 
}
/**
*@param void
*Function : 对四个按键进行时钟配置,并配置引脚,模式为上拉输入,速度
*/
void InitScan(void){
   GPIO_InitTypeDef GPIO_Scan;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    GPIO_Scan.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_Scan.GPIO_Mode = GPIO_Mode_IPU;
   GPIO_Init(GPIOC,&GPIO_Scan);
  }
void InitLedStatus(){
    GPIO_SetBits(GPIOA,GPIO_Pin_All);   
}
/**
*@param void
*Function : 对四个LED邓进行时钟配置,并配置引脚,模式为推挽输出,速度
*/
void InitLed(void){
    GPIO_InitTypeDef GPIO_Led;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 
    GPIO_Led.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_Led.GPIO_Mode =  GPIO_Mode_Out_PP;
    GPIO_Led.GPIO_Speed = GPIO_Speed_10MHz;
   GPIO_Init(GPIOA,&GPIO_Led);
  }
/**
 *@ControlSingleLed ControlSingleLed
 *@param GPIO_Scan 按键端口
 *@param GPIO_Pin_ScanKey 按键引脚
 *@param GPIO_LED 灯端口
 *@param GPIO_Pin_Led 灯引脚
*Function : 按下按键,对应的LED灯亮
*/
void ControlSingleLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey,GPIO_TypeDef* GPIO_LED,u16 GPIO_Pin_Led){
    if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0){
      Delay_ms(50);
    if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0)    
      Flag_SingleLed = !Flag_SingleLed;
      if(Flag_SingleLed == 1){
          InitLedStatus(); 
          GPIO_ResetBits(GPIO_LED,GPIO_Pin_Led);  
      }else{        
        GPIO_SetBits(GPIO_LED,GPIO_Pin_Led);  
      }
  }
}
/**
 *@ControlAllLed ControlAllLed
 *@param GPIO_Scan 按键端口
 *@param GPIO_Pin_ScanKey 按键引脚
 *@param GPIO_LED 灯端口
 *@param GPIO_Pin_Led 灯引脚
*Function : 按下按键所有的灯亮
*/
void ControlAllLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey){
  if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0){
      Delay_ms(50);
    if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0)  
      Flag_AllLed = !Flag_AllLed;
    if(Flag_AllLed == 1){
     GPIO_ResetBits(GPIOA,GPIO_Pin_0);
     GPIO_ResetBits(GPIOA,GPIO_Pin_1);
     GPIO_ResetBits(GPIOA,GPIO_Pin_2);
     GPIO_ResetBits(GPIOA,GPIO_Pin_3);
      }else{        
     GPIO_SetBits(GPIOA,GPIO_Pin_0);  
     GPIO_SetBits(GPIOA,GPIO_Pin_1);  
     GPIO_SetBits(GPIOA,GPIO_Pin_2);  
     GPIO_SetBits(GPIOA,GPIO_Pin_3);    
      } 
  }
}
/**
 *@MethodName ControlWaterLed
 *@param GPIO_Scan 按键端口
 *@param GPIO_Pin_ScanKey 按键引脚
 *@param GPIO_LED 灯端口
 *@param GPIO_Pin_Led 灯引脚
*Function : 按下按键,实现流水灯
*/
void ControlWaterLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey){
  if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0){
      Delay_ms(50);
    if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0)  
      Flag_WaterLed = !Flag_WaterLed;
    if(Flag_WaterLed == 1){
      GPIO_ResetBits(GPIOA,GPIO_Pin_0);
      Delay_ms(300);
      GPIO_SetBits(GPIOA,GPIO_Pin_0);
      Delay_ms(300);
      GPIO_ResetBits(GPIOA,GPIO_Pin_1);
      Delay_ms(300);
      GPIO_SetBits(GPIOA,GPIO_Pin_1); 
      Delay_ms(300);
      GPIO_ResetBits(GPIOA,GPIO_Pin_2);
      Delay_ms(300);
      GPIO_SetBits(GPIOA,GPIO_Pin_2);
      Delay_ms(300);
      GPIO_ResetBits(GPIOA,GPIO_Pin_3);
      Delay_ms(300);
      GPIO_SetBits(GPIOA,GPIO_Pin_3);
      Delay_ms(300);
      }else{        
        InitLedStatus();
      } 
  }
}
/**
 *@MethodName ControlHorseRaceLed
 *@param GPIO_Scan 按键端口
 *@param GPIO_Pin_ScanKey 按键引脚
 *@param GPIO_LED 灯端口
 *@param GPIO_Pin_Led 灯引脚
*Function : 按下按键,实现跑马灯
*/
void ControlHorseRaceLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey){
  if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0){
      Delay_ms(50);
    if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0)  
      Flag_HorseRaceLed = !Flag_HorseRaceLed;
    if(Flag_HorseRaceLed == 1){
      GPIO_ResetBits(GPIOA,GPIO_Pin_0);
      Delay_ms(300);
      GPIO_ResetBits(GPIOA,GPIO_Pin_1);
      Delay_ms(300);
      GPIO_ResetBits(GPIOA,GPIO_Pin_2);
      Delay_ms(300);
      GPIO_ResetBits(GPIOA,GPIO_Pin_3);
      Delay_ms(300);
      InitLedStatus();
      }else{        
        InitLedStatus();
      } 
  }
}


总结



上面程序所用到的4个灯,4个按键在电路图上的位置

image.png

相关文章
|
4月前
|
JavaScript
闪烁的灯泡
闪烁的灯泡
35 0
|
1月前
|
机器人 Linux 异构计算
实例1:控制树莓派板载LED灯闪烁
本文是一个关于如何使用Python编程控制树莓派板载LED灯闪烁的实验教程,涵盖了树莓派的基本概念、LED控制文件的读写操作、Python `open()` 和 `sleep()` 函数的使用方法,以及具体的实验步骤和代码实现,目的是让读者通过实践熟悉树莓派操作和Linux文件读写。
45 1
实例1:控制树莓派板载LED灯闪烁
|
1月前
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
单片机按键的使用
单片机按键的使用
155 0
|
C语言
51单片机按键
学习按键处理
105 0
51单片机按键
|
C语言
MSP430F5529学习笔记(5)——按键切换灯的亮灭
MSP430F5529学习笔记(5)——按键切换灯的亮灭
107 0
LabVIEW控制Arduino LED灯闪烁(基础篇—2)
利用LIAT中的数字I/O函数库,通过LabVIEW控制Arduino Uno控制板上D13管脚上LED灯,实现等间隔闪烁。
|
编译器
【51单片机】按键操作(单个灯闪烁&&流水灯)
按键操作(单个灯闪烁&&流水灯)
501 0
按键控制数码管闪烁
按键控制数码管闪烁
75 0