STM32——不同的按键对应实现不同功能的灯闪烁
-
- 功能介绍
- 程序解读
- 总结
功能介绍
本程序使用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){
ControlSingleLed(GPIOC,GPIO_Pin_0,GPIOA,GPIO_Pin_0); //控制灯闪烁
ControlAllLed(GPIOC,GPIO_Pin_1);//控制全部灯亮与灭
ControlWaterLed(GPIOC,GPIO_Pin_2);//实现流水灯
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);
}
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);
}
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);
}
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);
}
}
}
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);
}
}
}
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();
}
}
}
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个按键在电路图上的位置