前言:嵌入式点灯是一种广受硬件爱好者喜爱的事情,只要通过控制输出引脚电平状态就可以实现LED灯的控制。在嵌入式系统中,LED通常被连接到一个GPIO引脚上,我们可以通过控制GPIO引脚的电平状态,来控制LED的开关状态,实现LED的点亮和熄灭,可以使用循环检测的方式,不断地改变LED的状态,使其闪烁或呈现特定的灯光效果。除此之外,我们还可以通过使用定时器、延时函数等方式,来实现更复杂的点灯效果。
大家好,俺又来水贴了,今天楼楼我是来点灯的,一共4种,点灯没啥好说的,直接上才艺,代码放到最好,喜欢可以拿走,不谢!
· 第一种灯:通过pwm实现的呼吸灯
· 第二种灯:按键触发,通过扫描按键状态控制灯的亮灭,按下灯亮放开灯灭(其实可以用中断实现,楼楼还没研究中断,所以先这样吧~)
· 第三种灯:流水灯,因为一个灯接着一个灯亮,很像流水而得名
· 第四种灯:全部亮灭,所有灯一起亮或灭
楼楼相信点灯这件事对于大家来说简直就是信手拈来不要太简单,楼楼在这里献丑了.
楼楼把代码贴在下面
- #include "bflb_mtimer.h"
- #include "bflb_gpio.h"
- #include "bflb_pwm_v2.h"
- #include "bflb_clock.h"
- #include "board.h"
- struct bflb_device_s *gpio;
- struct bflb_device_s *pwm;
- //led io
- uint8_t leds[] = {31,32,33,34};
- //按键io
- uint8_t keys[] = {24,25,26,27};
- //pwm通道
- uint8_t pwm_channel[] = {0,1,2,3}; // 31->3, 32->0, 33->2, 34->1
- // 按下键灯亮
- void led_0(void){
- for(int i=0;i<4;i++){
- if(! bflb_gpio_read(gpio,keys[i])){
- bflb_gpio_set(gpio,leds[i]);
- }else{
- bflb_gpio_reset(gpio,leds[i]);
- }
- }
- bflb_mtimer_delay_ms(10);
- }
- // 流水灯
- void led_1(int tim){
- for(int i=0;i<4;i++){
- bflb_gpio_set(gpio,leds[i]);
- bflb_mtimer_delay_ms(tim);
- bflb_gpio_reset(gpio,leds[i]);
- bflb_mtimer_delay_ms(tim);
- }
- for(int i=4;i>0;i--){
- bflb_gpio_set(gpio,leds[i-1]);
- bflb_mtimer_delay_ms(tim);
- bflb_gpio_reset(gpio,leds[i-1]);
- bflb_mtimer_delay_ms(tim);
- }
- }
- // 全部点亮
- void led_all(int tim){
- for(int i=0;i<4;i++){
- bflb_gpio_set(gpio,leds[i]);
- }
- bflb_mtimer_delay_ms(tim);
- for(int i=0;i<4;i++){
- bflb_gpio_reset(gpio,leds[i]);
- }
- bflb_mtimer_delay_ms(tim);
- }
- // pwm呼吸灯
- void led_pwm(){
- for(int i=100;i>0;i--)
- {
- for(int j=0;j<4;j++){
- bflb_pwm_v2_channel_set_threshold(pwm, pwm_channel[j], i, 100);
- }
- bflb_mtimer_delay_ms(10);
- }
- for(int i=1;i<100;i++)
- {
- for(int j=0;j<4;j++){
- bflb_pwm_v2_channel_set_threshold(pwm, pwm_channel[j], i, 100);
- }
- bflb_mtimer_delay_ms(10);
- }
- // for(int i=0;i<4;i++){
- // bflb_pwm_v2_channel_positive_stop(pwm, pwm_channel[i]);
- // }
-
- }
- # define LED //初始化pwm,默认输入输出
- int main(void)
- {
- board_init();
- gpio = bflb_device_get_by_name("gpio");
- pwm = bflb_device_get_by_name("pwm_v2_0");
- # ifdef LED
- // led pwm初始化
- for (int i =0; i<4; i++)
- {
- bflb_gpio_init(gpio, leds[i], GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
- }
- struct bflb_pwm_v2_config_s cfg = {
- .clk_source = BFLB_SYSTEM_XCLK,
- .clk_div = 40,
- .period = 1000,
- };
- bflb_pwm_v2_init(pwm, &cfg);
- bflb_pwm_v2_start(pwm);
- for(int i=0;i<4;i++){
- bflb_pwm_v2_channel_positive_start(pwm, pwm_channel[i]);
- }
- #else
- // led输出初始化
- for(int i=0;i<4;i++){
- bflb_gpio_init(gpio, leds[i], GPIO_OUTPUT);
- }
- // //按键输入初始化
- for(int i=0;i<4;i++){
- bflb_gpio_init(gpio, keys[i], GPIO_INPUT|GPIO_PULLUP);
- }
- # endif
- printf("hello world\r\n");
- while (1) {
- // led_0(); //按键按下灯亮
- // led_1(500); //流水灯
- // led_all(500); //全部亮灭
- led_pwm(); //呼吸灯
- }
- }
复制代码
好啦,以上就是楼楼的才艺展示,如果有问题的话大家可以自行修正,如果可以帮到大家的话楼楼会感到非常欣慰的~
|