GD32用IO口模拟呼吸灯

“呼吸灯”其实就是小灯的亮度是逐渐变化的,也就是说,只要能够使用单片机控制小灯的亮度,“呼吸灯”的效果也就实现了。

使用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;elsedarkTime -= 1;if(darkTime >= 100)dir = 0;if(darkTime <= 60)dir = 1;}}
}

通过按键控制呼吸频率代码如下:

/*Copyright (C) 2017 GigaDevice2017-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;elsedarkTime -= 8;if(darkTime >= 100)dir = 0;if(darkTime <= 60)dir = 1;}}
}
}
}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部