功能介绍
本程序使用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个按键在电路图上的位置