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