“呼吸灯”其实就是小灯的亮度是逐渐变化的,也就是说,只要能够使用单片机控制小灯的亮度,“呼吸灯”的效果也就实现了。
使用C语言控制单片机IO交替输出高低电平,实现LED小灯的闪烁效果。核心代码如下:
while(1){
P20 = 0;
delay(10);
P20 = 1;
delay(10);
}
IO输出的高低电平持续时间都是10个单位,一个完整的周期内,LED小灯的亮灭时间都是相等的。由此可见,使用单片机控制小灯亮度,就是控制一个周期内,LED小灯的亮灭持续时间长短而已。代码如下:
/* IO模拟呼吸灯*/
#include "gd32f30x.h"
#include "gd32f303c_eval.h"
#include "systick.h"
void delay(uint32_t i);
void delay(unsigned int n) {
char darkTime = 0, dir = 1;
unsigned int cnt = 0;
unsigned int x ;
while(n--) {
x=50;
while(x--);
}
}
void twinkle_once(unsigned char darkTime) {
gd_eval_led_off(LED2);
delay(100-darkTime);
gd_eval_led_on(LED2);
delay(darkTime);
}
int main(void)
{
char darkTime = 0, dir = 1;
unsigned int cnt = 0;
gd_eval_led_init(LED2);
while(1){
cnt ++;
twinkle_once(darkTime);
if(cnt == 50){
cnt = 0;
if(dir)
darkTime += 1;
else
darkTime -= 1;
if(darkTime >= 100)
dir = 0;
if(darkTime <= 60)
dir = 1;
}
}
}
通过按键控制呼吸频率代码如下:
/*
Copyright (C) 2017 GigaDevice
2017-06-23, V1.0.0, demo for GD32F30x
*/
/* IO模拟呼吸灯*/
#include "gd32f30x.h"
#include "gd32f303c_eval.h"
#include "systick.h"
uint16_t darkTime = 0, dir = 1;
unsigned int cnt = 0;
uint32_t temp;
void delay(unsigned int n) {
unsigned int x ;
while(n--) {
x=50;
while(x--);
}
}
/*闪烁次数*/
void twinkle_once(unsigned char darkTime) {
gd_eval_led_off(LED2);
delay(100-darkTime);
gd_eval_led_on(LED2);
delay(darkTime);
}
int main(void)
{
gd_eval_led_init(LED2);
gd_eval_led_init(LED3);
gd_eval_key_init(KEY_WAKEUP,KEY_MODE_GPIO);
gd_eval_key_init(KEY_TAMPER,KEY_MODE_GPIO);
systick_config();
while(1){
if(RESET == gd_eval_key_state_get(KEY_WAKEUP)){
/* delay 50ms for software removing jitter */
delay_1ms(50);
if(RESET == gd_eval_key_state_get(KEY_WAKEUP)){
while(1){
cnt ++;
twinkle_once(darkTime);
if(cnt == 50){
cnt = 0;
if(dir)
darkTime += 8;
else
darkTime -= 8;
if(darkTime >= 100)
dir = 0;
if(darkTime <= 60)
dir = 1;
}
}
}
}
}
}