软件:STM32CubeMX Version 6.2.1 ??????MDK5 for ARM 硬件:战舰精英V3 STM32F103ZET6
前言
??红蓝警示灯是大街上最常见的一种单片机产物,同时款式功能也是多种多样。虽然款式不同但主要还是分为两种,一种是固定程序款,另一种是可编程款。今天这里就以红蓝两个LED设计第一种简单的固定程序款的“红蓝警示灯”。此程序常用在带警示灯款式的手电筒,之前在古镇从事LED照明程序设计时就帮一客户设计过类似的产品。
一、功能设计
??此项目使用的外设硬件也比较简单,只有按键和LED灯。程序设计思路采用定时10ms轮询的方式,LED灯闪烁主要就是控制延时,单时间线程序。
1.1.输入按键功能
这里我只使用了一个按键进行控制输出模式的切换及关机。 上电后默认工作在模式一(红色慢闪)。 按键功能; ?????1;短按按键后切换到下一模式,一直到最后一个模式(关灯),如果再短按又回到模式一。 ?????2;在任何模式下长按按键切换到关机模式,这里设计体验感差的地方是长按按键后会先执行一次短按功能然后再执行长按关机。在关机模式下也是如此。
??优化方法可以在长按松开时判断短按,如果松开时按键按了小于200ms/500ms则认为是短按。
1.2.输出LED灯的功能及模式
目前设计了4种模式;
- 红色LED以500ms慢闪,蓝色LED熄灭;
- 红色熄灭,蓝色LED以500ms慢闪;
- 先红色LED以150ms连续闪烁两次,然后全部熄灭800ms后蓝色LED以150ms连续闪烁两次,
然后全部熄灭800ms再回到红色LED闪烁; - 全部熄灭。(有时间的可以在此模式加入休眠程序用按键唤醒,以降低待机功耗。)
二、程序流程思维导图
三、编写用户程序代码
??新建项目请参考我之前写的一篇博文。
STM32CubeMX第一章 GPIO
int main(void)
{
uint8_t key_status=0;
uint8_t LED1_Start =0,LED1_STEP =0;
uint16_t LED1_Delay =0,LED2_Delay =0;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
HAL_Delay(10);
if(key_status==0 && HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) ==GPIO_PIN_RESET)
{
key_status =1;
}
else if(key_status==1 && HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) ==GPIO_PIN_RESET)
{
key_status =2;LED1_Start =1;
}
else if(key_status==2 && HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) ==GPIO_PIN_RESET)
{
key_status =2;
}
else
{
key_status =0;
}
if(LED1_Start ==1)
{
if(LED1_STEP<=3)
{
if(LED1_Delay++>=20)
{
LED1_Delay =0;
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
LED1_STEP ++;
}
}
else
{
LED1_STEP =0;
LED1_Start =0;
}
}
if(LED2_Delay++>=50)
{
LED2_Delay =0;
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
}
}
}
总结
??这里只是设计了一个简单版的“红蓝警示灯”。感兴趣的可以尝试的通过增加一些变量设计一个可编程版本的“红蓝警示灯”。
|