简介
继上篇 普中STM32-PZ6806L开发板(有点悲伤的故事) 说到 关于 普中STM32-PZ6806L开发板的LED流水灯也被烧坏掉了,再也无法玩流水灯, 内心充满了只会流水灯的不甘, 流水灯就是单片机的Hello World,怎么能没有呢?
事情发展
好巧不巧想起最近电磁炉坏掉啦,这不是《歇后语》省略…, 拆掉了电磁炉上的四个数码管, LED灯10个,又可以玩LED灯啦…
电路
电路原理图
高电平驱动
实物图
步骤
STM32CubeMX 创建STM32F103CBT6
不说太多, 参考简介说到的上篇, 画葫芦吧
引脚初始化
初始化 PA0~PA7 & PC13 为推挽输出, 下拉;
用户代码
流水灯示例
main.c
typedef enum {
LED_OFF,
LED_ON,
}LED_Status;
typedef enum {
LED1,
LED2,
LED3,
LED4,
LED5,
LED6,
LED7,
LED8,
LED_ALL
}LED_Number;
/***
* LED_LightControl : LED控制
* num : LED1 ~ LED8 / LED_ALL
* status: LED_ON/LED_OFF
***/
void LED_LightControl(LED_Number num, LED_Status status)
{
uint16_t pin = 0;
if (num == LED_ALL)
pin = 0xFF; // 引脚0 ~ 7
else
pin = 0x01<<num;
HAL_GPIO_WritePin(LED_PORT, pin, status==LED_ON ? GPIO_PIN_SET:GPIO_PIN_RESET);
}
/***
* LED_DoFlowAction : 流水灯效果实现
* num : LED1 ~ LED8 / LED_ALL
* delay_ms: 延时, 亮灭的间隔
* time : 执行的次数
***/
void LED_DoFlowAction(uint32_t delay_ms, uint16_t time)
{
int i = 0;
int offset = 0;
int ledNum = 0;
LED_LightControl(LED_ALL, LED_OFF);
while (time--)
{
for (i = LED1; i < LED_ALL; ++i)
{
ledNum = offset > 0 ? ( offset - i ) : i;
LED_LightControl((LED_Number)ledNum, LED_ON);
HAL_Delay(delay_ms);
LED_LightControl((LED_Number)ledNum, LED_OFF);
HAL_Delay(delay_ms);
}
if (offset)
offset = 0;
else
offset = LED_ALL-1;
}
}
int main(void)
{
...
while (1)
{
LED_DoFlowAction(100, 1);
}
...
}
代码
上面都提供了,不需要下载
共赏
普中STM32-PZ6806L开发板(有点悲伤的故事续-人灯还未了)