【小安派试玩】花式点灯

[复制链接]
查看1587 | 回复5 | 2023-8-31 19:30:02 | 显示全部楼层 |阅读模式
前言:嵌入式点灯是一种广受硬件爱好者喜爱的事情,只要通过控制输出引脚电平状态就可以实现LED灯的控制。在嵌入式系统中,LED通常被连接到一个GPIO引脚上,我们可以通过控制GPIO引脚的电平状态,来控制LED的开关状态,实现LED的点亮和熄灭,可以使用循环检测的方式,不断地改变LED的状态,使其闪烁或呈现特定的灯光效果。除此之外,我们还可以通过使用定时器、延时函数等方式,来实现更复杂的点灯效果。

大家好,俺又来水贴了,今天楼楼我是来点灯的,一共4种,点灯没啥好说的,直接上才艺,代码放到最好,喜欢可以拿走,不谢!

· 第一种灯:通过pwm实现的呼吸灯

呼吸.gif




· 第二种灯:按键触发,通过扫描按键状态控制灯的亮灭,按下灯亮放开灯灭(其实可以用中断实现,楼楼还没研究中断,所以先这样吧~)



按键.gif




· 第三种灯:流水灯,因为一个灯接着一个灯亮,很像流水而得名



流水.gif




· 第四种灯:全部亮灭,所有灯一起亮或灭



全闪.gif




楼楼相信点灯这件事对于大家来说简直就是信手拈来不要太简单,楼楼在这里献丑了.


楼楼把代码贴在下面

  1. #include "bflb_mtimer.h"
  2. #include "bflb_gpio.h"
  3. #include "bflb_pwm_v2.h"
  4. #include "bflb_clock.h"
  5. #include "board.h"


  6. struct bflb_device_s *gpio;
  7. struct bflb_device_s *pwm;

  8. //led io
  9. uint8_t leds[] = {31,32,33,34};

  10. //按键io
  11. uint8_t keys[] = {24,25,26,27};

  12. //pwm通道
  13. uint8_t pwm_channel[] = {0,1,2,3}; // 31->3, 32->0, 33->2, 34->1


  14. // 按下键灯亮
  15. void led_0(void){
  16.     for(int i=0;i<4;i++){
  17.         if(! bflb_gpio_read(gpio,keys[i])){
  18.             bflb_gpio_set(gpio,leds[i]);
  19.         }else{
  20.             bflb_gpio_reset(gpio,leds[i]);
  21.         }
  22.     }
  23.     bflb_mtimer_delay_ms(10);

  24. }

  25. // 流水灯
  26. void led_1(int tim){

  27.     for(int i=0;i<4;i++){
  28.         bflb_gpio_set(gpio,leds[i]);
  29.         bflb_mtimer_delay_ms(tim);
  30.         bflb_gpio_reset(gpio,leds[i]);
  31.         bflb_mtimer_delay_ms(tim);
  32.     }
  33.     for(int i=4;i>0;i--){
  34.         bflb_gpio_set(gpio,leds[i-1]);
  35.         bflb_mtimer_delay_ms(tim);
  36.         bflb_gpio_reset(gpio,leds[i-1]);
  37.         bflb_mtimer_delay_ms(tim);
  38.     }
  39. }

  40. // 全部点亮
  41. void led_all(int tim){

  42.     for(int i=0;i<4;i++){
  43.         bflb_gpio_set(gpio,leds[i]);
  44.     }
  45.     bflb_mtimer_delay_ms(tim);
  46.     for(int i=0;i<4;i++){
  47.         bflb_gpio_reset(gpio,leds[i]);
  48.     }
  49.     bflb_mtimer_delay_ms(tim);
  50. }


  51. // pwm呼吸灯
  52. void led_pwm(){
  53.     for(int i=100;i>0;i--)
  54.     {
  55.         for(int j=0;j<4;j++){
  56.             bflb_pwm_v2_channel_set_threshold(pwm, pwm_channel[j], i, 100);
  57.         }
  58.         bflb_mtimer_delay_ms(10);
  59.     }
  60.     for(int i=1;i<100;i++)
  61.     {
  62.         for(int j=0;j<4;j++){
  63.             bflb_pwm_v2_channel_set_threshold(pwm, pwm_channel[j], i, 100);
  64.         }
  65.         bflb_mtimer_delay_ms(10);
  66.     }

  67.     // for(int i=0;i<4;i++){
  68.     //     bflb_pwm_v2_channel_positive_stop(pwm, pwm_channel[i]);
  69.     // }
  70.    
  71. }



  72. # define LED //初始化pwm,默认输入输出

  73. int main(void)
  74. {
  75.     board_init();
  76.     gpio = bflb_device_get_by_name("gpio");
  77.     pwm = bflb_device_get_by_name("pwm_v2_0");
  78.     # ifdef LED
  79.         // led pwm初始化
  80.         for (int i =0; i<4; i++)
  81.         {
  82.             bflb_gpio_init(gpio, leds[i], GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
  83.         }
  84.         struct bflb_pwm_v2_config_s cfg = {
  85.             .clk_source = BFLB_SYSTEM_XCLK,
  86.             .clk_div = 40,
  87.             .period = 1000,
  88.         };
  89.         bflb_pwm_v2_init(pwm, &cfg);
  90.         bflb_pwm_v2_start(pwm);
  91.         for(int i=0;i<4;i++){
  92.             bflb_pwm_v2_channel_positive_start(pwm, pwm_channel[i]);
  93.         }

  94.     #else
  95.         // led输出初始化
  96.         for(int i=0;i<4;i++){
  97.             bflb_gpio_init(gpio, leds[i], GPIO_OUTPUT);
  98.         }
  99.         // //按键输入初始化
  100.         for(int i=0;i<4;i++){
  101.             bflb_gpio_init(gpio, keys[i], GPIO_INPUT|GPIO_PULLUP);
  102.         }
  103.     # endif

  104.     printf("hello world\r\n");
  105.     while (1) {
  106.         // led_0(); //按键按下灯亮
  107.         // led_1(500); //流水灯
  108.         // led_all(500); //全部亮灭
  109.         led_pwm();  //呼吸灯
  110.     }
  111. }
复制代码


好啦,以上就是楼楼的才艺展示,如果有问题的话大家可以自行修正,如果可以帮到大家的话楼楼会感到非常欣慰的~

本帖被以下淘专辑推荐:

回复

使用道具 举报

粉肠 | 2023-8-31 19:41:16 | 显示全部楼层
资瓷期哥
回复

使用道具 举报

ai_mcu | 2023-8-31 20:21:03 | 显示全部楼层
明天点亮一颗mcu
明天总会更好
回复 支持 反对

使用道具 举报

iiv | 2023-9-16 19:15:20 | 显示全部楼层
大佬大佬!
回复

使用道具 举报

LV36 | 2023-9-18 12:40:48 | 显示全部楼层
会玩
回复

使用道具 举报

cnfulishe | 2024-3-27 14:26:38 | 显示全部楼层
楼主太厉害了!加油,点个赞
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则