久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3693|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)+WS2812控制LED燈算法請(qǐng)教,從中間往兩邊跑,以及多種效果

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:136485 發(fā)表于 2021-11-10 11:44 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
如何我要從中間往兩邊跑,以及多種效果,請(qǐng)教下算法思路,現(xiàn)在就三種流法,也可以說(shuō)是兩種
單片機(jī)源程序如下:
  1. #include<STC8H1K28.H>
  2. #include"intrins.h"

  3. sbit WS2812 = P1^0;
  4. sbit on = P2^4;
  5. #define numLEDs 36  //燈的個(gè)數(shù)
  6. unsigned char buf_R[numLEDs] = {0};//顏色緩存
  7. unsigned char buf_G[numLEDs] = {0};
  8. unsigned char buf_B[numLEDs] = {0};

  9. void RGB_Set_Up();  //送0碼
  10. void RGB_Set_Down(); //送1碼

  11. void HAL_Delay(unsigned long t)
  12. {
  13. unsigned int x,y;
  14. for(x=114;x>0;x--)
  15. for(y=t;y>0;y--);
  16. }

  17.    //復(fù)位延時(shí)
  18. void Delay50us()                //@22.1184MHz
  19. {
  20. unsigned char i, j;
  21. _nop_();
  22. _nop_();
  23. i = 2;
  24. j = 15;
  25. do
  26.   {
  27.    while (--j);
  28.   } while (--i);
  29. }
  30. //1碼,高電平850ns 低電平400ns 誤差正負(fù)150ns

  31. void RGB_Set_Up()
  32. {
  33. WS2812 = 1;//經(jīng)過(guò)邏輯分析儀調(diào)試的的延時(shí)
  34. _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  35. _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  36. WS2812 = 0;
  37. }
  38. //1碼,高電平400ns 低電平850ns 誤差正負(fù)150ns
  39. void RGB_Set_Down()
  40. {
  41. WS2812 = 1;//經(jīng)過(guò)邏輯分析儀調(diào)試的的延時(shí)
  42. _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();  
  43. WS2812 = 0;
  44. }

  45. //發(fā)送24位數(shù)據(jù)
  46. void Send_2812_24bits(unsigned char G8,unsigned char R8,unsigned char B8)
  47. {
  48. unsigned int n = 0;
  49. for(n=0;n<8;n++) //發(fā)送G8位
  50.   {
  51.    G8<<=n;
  52.    if(G8&0x80 == 0x80)
  53.     {
  54.      RGB_Set_Up();
  55.     }
  56.    else
  57.     {
  58.      RGB_Set_Down();
  59.     }
  60.   }
  61.                   
  62. for(n=0;n<8;n++)//發(fā)送R8位
  63.   {
  64.    R8<<=n;
  65.    if(R8&0x80 == 0x80)
  66.         {
  67.          RGB_Set_Up();
  68.         }
  69.    else
  70.         {
  71.          RGB_Set_Down();
  72.         }
  73.   }
  74.                         
  75. for(n=0;n<8;n++)//發(fā)送B8位
  76.   {
  77.    B8<<=n;
  78.    if(B8&0x80 == 0x80)
  79.         {
  80.          RGB_Set_Up();
  81.         }
  82.    else
  83.         {
  84.          RGB_Set_Down();
  85.         }
  86.   }
  87. }                 
  88. //復(fù)位碼
  89. void RGB_Rst()
  90. {
  91.   WS2812 = 0;
  92.   Delay50us();
  93. }

  94. //顏色交換24位不拆分發(fā)

  95. void SetPixelColor(unsigned char num,unsigned long c)
  96. {
  97. unsigned char i;
  98. for(i=0;i<numLEDs;i++)
  99.   {
  100.    buf_R[num] = (unsigned char)(c>>16);
  101.    buf_G[num] = (unsigned char)(c>>8);
  102.    buf_B[num] = (unsigned char)(c);
  103.   }

  104. for(i=0;i<numLEDs;i++)
  105.   {
  106.    Send_2812_24bits(buf_G[i],buf_R[i],buf_B[i]);
  107.   }

  108. }

  109. //復(fù)位
  110. void PixelUpdate()
  111. {
  112. RGB_Rst();
  113. }


  114. // Fill the dots one after the other with a color
  115. //用一種顏色填充這些圓點(diǎn)
  116. void colorWipe(unsigned long c, unsigned int wait)
  117. {
  118. unsigned char i=0;
  119. for( i=0; i<numLEDs; i++)
  120.   {
  121.    SetPixelColor(i, c);
  122.    PixelUpdate();
  123.    HAL_Delay(wait*5);
  124.   }

  125. }
  126. void Watercolor(unsigned long c, unsigned int wait)
  127. {
  128. unsigned char i=0;
  129. for( i=0; i<numLEDs; i++)
  130.   {
  131.    SetPixelColor(i, c);
  132.    PixelUpdate();
  133.    HAL_Delay(wait*5);
  134.    SetPixelColor(i, 0);
  135.    PixelUpdate();
  136.    HAL_Delay(wait);
  137.   }

  138. }



  139. void main()
  140. {
  141. P1M0=0xFF;
  142. P1M1=0x00;
  143. P2M0=0xFF;
  144. P2M1=0x00;
  145. while(1)
  146.   {                                 
  147.    on=0;
  148.    /*colorWipe(0xff0000,1);        //紅色
  149.    HAL_Delay(10000);
  150.    colorWipe(0xff00,1);         //綠色
  151.    HAL_Delay(10000);
  152.    colorWipe(0xff,1);//藍(lán)色
  153.    HAL_Delay(10000);
  154.    colorWipe(0xffff00,1);        //黃色
  155.    HAL_Delay(10000);
  156.    colorWipe(0xffff,1);        //青色
  157.    HAL_Delay(10000);
  158.    colorWipe(0xff00ff,1);        //紫色
  159.    HAL_Delay(10000);
  160.    colorWipe(0xffffff,1);        //白色
  161.    HAL_Delay(10000);
  162.    colorWipe(0x00,1);        //off
  163.    HAL_Delay(10000);*/

  164.    Watercolor(0xff0000, 100);//紅色
  165.    HAL_Delay(1000);
  166.    Watercolor(0xff00, 100);//綠色
  167.    HAL_Delay(1000);
  168.    Watercolor(0xff, 100);//藍(lán)色
  169.    HAL_Delay(1000);
  170.    Watercolor(0xffff00, 100);        //黃色
  171.    HAL_Delay(1000);
  172.    Watercolor(0xffff, 100);//青色
  173.    HAL_Delay(1000);
  174.    Watercolor(0xff00ff, 100);        //紫色
  175.    HAL_Delay(1000);
  176.    Watercolor(0xffffff, 100);        //白色
  177.    HAL_Delay(1000);
  178.         
  179.    colorWipe(0x00,1);        //off
  180.    HAL_Delay(10000);

  181.    /*colorWipe(0xff0000,100);        //紅色
  182.    HAL_Delay(1000);
  183.    colorWipe(0x00,100);        //0ff
  184.    HAL_Delay(1000);
  185.    colorWipe(0xff00,100);         //綠色
  186.    HAL_Delay(1000);
  187.    colorWipe(0x00,100);        //0ff
  188.    HAL_Delay(1000);
  189.    colorWipe(0xff,100);//藍(lán)色
  190.    HAL_Delay(1000);
  191.    colorWipe(0x00,100);        //0ff
  192.    HAL_Delay(1000);
  193.    colorWipe(0xffff00,100);        //黃色
  194.    HAL_Delay(1000);
  195.    colorWipe(0x00,100);        //0ff
  196.    HAL_Delay(1000);
  197.    colorWipe(0xffff,100);        //青色
  198.    HAL_Delay(1000);
  199.    colorWipe(0x00,100);        //0ff
  200.    HAL_Delay(1000);
  201.    colorWipe(0xff00ff,100);        //紫色
  202.    HAL_Delay(1000);
  203.    colorWipe(0x00,100);        //0ff
  204.    HAL_Delay(1000);
  205.    colorWipe(0xffffff,100);        //白色
  206.    HAL_Delay(1000);
  207.    colorWipe(0x00,100);        //0ff
  208.    HAL_Delay(1000);*/                                          
  209. }
  210. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:88256 發(fā)表于 2021-11-10 13:09 | 只看該作者
2812不需要所有的燈珠一起更新,需要改變哪個(gè)就指定哪個(gè)進(jìn)行改變,對(duì)于對(duì)開的,可以在中間燈珠先往下循環(huán)送數(shù)據(jù),送完后再?gòu)闹虚g往上送數(shù)據(jù),完成一次點(diǎn)亮
回復(fù)

使用道具 舉報(bào)

板凳
ID:824490 發(fā)表于 2021-11-10 15:25 | 只看該作者
就一個(gè)思路:36個(gè)燈就開108個(gè)字節(jié)的數(shù)組。把要顯示的色值,填充到對(duì)應(yīng)數(shù)組單元中,填滿108個(gè)字節(jié)后,一次發(fā)出。切記一點(diǎn):發(fā)送過(guò)程要關(guān)總中斷,發(fā)完再開總中斷,就不會(huì)被其它的中斷打擾發(fā)送了。
至于點(diǎn)燈花樣就看你如何去構(gòu)思了。
回復(fù)

使用道具 舉報(bào)

地板
ID:419909 發(fā)表于 2021-11-10 16:23 | 只看該作者
沒有其它辦法的。只能全部一起更新。因?yàn)閿?shù)據(jù)是單向串聯(lián)傳輸?shù)摹D阋褦?shù)據(jù)送到中間。必須先經(jīng)過(guò)前面的LED中轉(zhuǎn)。
回復(fù)

使用道具 舉報(bào)

5#
ID:532127 發(fā)表于 2021-11-10 18:10 | 只看該作者
void acc_mode555(void) //á½±ßíùÖD¼ä¶Ñ»y
{
        u8 i,xx, yy;
       
        flow_color0 = retColor(choose_color);
       
        xx = WS2811_TOTAL_NODES1 - g_flow_temp - 1;
        yy = WS2811_TOTAL_NODES1 - g_flow - 1;
       
       
        EA = 0;
       
        for(i = 0; i < WS2811_TOTAL_NODES1; i++)
        {
                if(g_flow == i || i > xx)ws28xxSend_24Bits(flow_color0);
                else ws28xxSend_24Bits(flow_color1);
        }
       
        for(i = 0; i < WS2811_TOTAL_NODES1; i++)
        {
                if(yy == i || i < g_flow_temp)ws28xxSend_24Bits(flow_color0);
                else ws28xxSend_24Bits(flow_color1);
        }
       
       
        EA = 1;
        nrzSendResetCode();
       
        g_flow++;
        if(g_flow >= WS2811_TOTAL_NODES1 - g_flow_temp)
        {
                g_flow = 0;
                g_flow_temp++;
                if(g_flow_temp >= WS2811_TOTAL_NODES1)
                {
                        g_flow_temp = 0;
                        flow_color1 = flow_color0;
                        choose_color++;
                        if(choose_color >= 7)
                        {
                                choose_color = 0;
                        }
                }
        }
}
回復(fù)

使用道具 舉報(bào)

6#
ID:824490 發(fā)表于 2021-11-10 21:36 | 只看該作者
hhdsdy 發(fā)表于 2021-11-10 13:09
2812不需要所有的燈珠一起更新,需要改變哪個(gè)就指定哪個(gè)進(jìn)行改變,對(duì)于對(duì)開的,可以在中間燈珠先往下循環(huán)送 ...

你確定?除非你是一個(gè)燈一個(gè)IO才能做到。。
回復(fù)

使用道具 舉報(bào)

7#
ID:136485 發(fā)表于 2021-11-11 08:47 | 只看該作者
感謝大家的回復(fù)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天堂av在线影院 | a看片| 久久精品国产一区二区电影 | 日韩在线免费 | 一区视频| 国产欧美视频一区 | 91麻豆产精品久久久久久夏晴子 | 午夜精品一区二区三区在线观看 | av一级| 91精品国产高清久久久久久久久 | 四虎最新视频 | 亚洲 精品 综合 精品 自拍 | 色男人的天堂 | 国产日韩欧美一区二区 | 国产一区二区三区四区hd | 日韩一区二区在线播放 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 欧美日韩国产中文 | 91在线精品一区二区 | 久久99久久 | 亚洲欧美激情国产综合久久久 | 黄色精品视频网站 | 成人老司机 | 午夜一区| 日韩在线免费播放 | 日韩中文字幕第一页 | 久久久免费少妇高潮毛片 | www.天天操.com | 狠狠干狠狠操 | 国产99久久精品 | 欧美日韩一区在线 | 中文字幕 在线观看 | 看a级黄色毛片 | 国产福利91精品 | 精品真实国产乱文在线 | 中文二区 | 午夜男人免费视频 | 亚洲天天 | 91在线精品视频 | 人人做人人澡人人爽欧美 | 91看片官网 |