stc32g12k128五个呼吸灯代码
时间: 2024-12-06 08:06:32 浏览: 20
在STC32G12K128单片机上使用五个LED作为呼吸灯,你可以通过定时器配合中断的方式来实现。这里是一个简单的示例代码,假设我们使用GPIOA口的PA0-PA4来控制LED,并使用TCCR1B寄存器配置定时器1:
```c
#include "stm32f1xx.h"
#define LED_PIN_0 GPIO_Pin_0
#define LED_PIN_1 GPIO_Pin_1
#define LED_PIN_2 GPIO_Pin_2
#define LED_PIN_3 GPIO_Pin_3
#define LED_PIN_4 GPIO_Pin_4
// 定义LED状态数组
uint8_t led_states[5] = {0, 0, 0, 0, 0}; // 初始全关
void setup_lights(void) {
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 启动GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = LED_PIN_0 | LED_PIN_1 | LED_PIN_2 | LED_PIN_3 | LED_PIN_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 输出推挽模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
// 定义呼吸灯函数
void breathe_light(uint8_t led_num, uint8_t duty_cycle) {
led_states[led_num] = duty_cycle;
GPIO_SetBits(GPIOA, led_states[led_num]); // 开启LED
TIM1->CCR1 = (SystemCoreClock / 100) * duty_cycle; // 设置定时器周期
TIM1->CCR2 = (SystemCoreClock / 100) * (duty_cycle + 1); // 高电平持续时间比低电平稍长
TIM1->EGR = TIM_EGR_UG = 1; // 更新溢出标志并开始计时
TIM1->ITR1 = TIM_IT_Update; // 设置定时器1溢出中断
TIM_Cmd(TIM1, ENABLE); // 启动定时器1
}
void timer1_IRQHandler(void) {
if (TIM1->SR & TIM_SR_UI) { // 检查定时器溢出标志
TIM1->SR &= ~TIM_SR_UI; // 清除溢出标志
if (led_states[0]) { // 变化下一个LED状态
LED_CHANGE(next_led()); // 调用下一个LED的改变函数
}
}
}
void LED_CHANGE(uint8_t new_led) {
static uint8_t next_led_index = 0;
GPIO_ResetBits(GPIOA, led_states[new_led]);
led_states[next_led_index] = 0;
next_led_index = (next_led_index + 1) % 5; // 循环处理
breathe_light(new_led, led_states[new_led]); // 开始新LED的呼吸效果
}
int main(void) {
setup_lights();
while (1) {
breathe_light(0, 64); // 初始化第一个LED呼吸
LED_CHANGE(1); // 自动切换到下一个LED
}
return 0;
}
```
这个代码只是一个基本框架,实际应用可能需要调整延时、颜色变化等细节。运行此程序后,LED将按照呼吸灯的效果循环闪烁。
阅读全文