普中STM32-PZ6806L开发板(有点悲伤的故事续-人灯还未了)

2024-01-08 22:38:00

简介

继上篇 普中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开发板(有点悲伤的故事续-人灯还未了)

文章来源:https://blog.csdn.net/halo_hsuh/article/details/135414339
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。