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

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

QQ登錄

只需一步,快速開(kāi)始

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

WS2811幻彩燈程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:208382 發(fā)表于 2017-6-6 14:21 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

  1. /****************************************************************************************
  2. * WS2811 彩燈驅(qū)動(dòng)函數(shù)
  3. *
  4. * 調(diào)用方法:
  5. *        修改宏定義: #define nWs 1        // 有多少顆WS2811級(jí)聯(lián)
  6. *        WS_Init();        // IO初始化
  7. *        WsDat[0] = 0x808080;//顯存賦值
  8. *        WS_SetAll();  // 發(fā)送數(shù)據(jù)
  9. *        ColorToColor(unsigned long color0, unsigned long color1);// 顏色漸變算法
  10. *
  11. * 作者:星希望(已校驗(yàn))
  12. * 日期:2015年6月24日
  13. ****************************************************************************************/
  14. #include "includes.h"

  15. #define RCC_PAout                 RCC_AHBPeriph_GPIOB
  16. #define PORT_PAout                GPIOB
  17. #define PIN_PAout                GPIO_Pin_15

  18. #define RCC_PEN                 RCC_AHBPeriph_GPIOB
  19. #define PORT_PEN                 GPIOB
  20. #define PIN_PEN                 GPIO_Pin_9

  21. #define PAout_0()                PORT_PAout->BRR = PIN_PAout
  22. #define PAout_1()                PORT_PAout->BSRR = PIN_PAout

  23. #define PEN_0()                PORT_PEN->BRR = PIN_PEN
  24. #define PEN_1()                PORT_PEN->BSRR = PIN_PEN

  25. /* 顯存 */
  26. unsigned long WsDat[nWs];
  27. uint32_t WsCol[nWs];

  28. /*
  29. *********************************************************************************************************
  30. *        函 數(shù) 名: WS_Init
  31. *        功能說(shuō)明: 初始化WS2811輸出GPIO
  32. *        形    參:無(wú)
  33. *        返 回 值: 無(wú)
  34. *********************************************************************************************************
  35. */
  36. void WS_Init()
  37. {
  38.         GPIO_InitTypeDef  GPIO_InitStruct;

  39.         //端口時(shí)鐘,使能
  40.         RCC_AHBPeriphClockCmd(RCC_PAout | RCC_PEN, ENABLE);

  41.         // 端口配置
  42.         GPIO_InitStruct.GPIO_Pin = PIN_PAout;                                // PIN
  43.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;                 // 推挽輸出
  44.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;                // IO口速度為50MHz
  45.         GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
  46.         GPIO_Init(PORT_PAout, &GPIO_InitStruct);                                        // 根據(jù)設(shè)定參數(shù)初始化

  47.         GPIO_InitStruct.GPIO_Pin = PIN_PEN;                                // PIN
  48.         GPIO_Init(PORT_PEN, &GPIO_InitStruct);                                        // 根據(jù)設(shè)定參數(shù)初始化

  49.         PEN_1();
  50. }

  51. /*
  52. *********************************************************************************************************
  53. *        函 數(shù) 名: delay2us
  54. *        功能說(shuō)明: 延時(shí)2us
  55. *        形    參:無(wú)
  56. *        返 回 值: 無(wú)
  57. *********************************************************************************************************
  58. */
  59. void delay2us(void)
  60. {
  61.         unsigned char i;
  62.         for(i=0; i<12; i++);
  63. }
  64. /*
  65. *********************************************************************************************************
  66. *        函 數(shù) 名: delay05us
  67. *        功能說(shuō)明: 延時(shí)0.5us
  68. *        形    參:無(wú)
  69. *        返 回 值: 無(wú)
  70. *********************************************************************************************************
  71. */
  72. void delay05us(void)
  73. {
  74.         unsigned char i;
  75.         for(i=0; i<2; i++);
  76. }
  77. /*
  78. *********************************************************************************************************
  79. *        函 數(shù) 名: TX0,TX1
  80. *        功能說(shuō)明: 高速模式(最快)發(fā)送碼值0 ,1
  81. *        形    參:無(wú)
  82. *        返 回 值: 無(wú)
  83. *********************************************************************************************************
  84. */
  85. void TX0() { PAout_1(); delay05us; PAout_0(); delay_us(2); } // 發(fā)送0
  86. void TX1() { PAout_1(); delay_us(2);  PAout_0(); delay05us; } // 發(fā)送1

  87. /*
  88. *********************************************************************************************************
  89. *        函 數(shù) 名: TXL0,TXL1
  90. *        功能說(shuō)明: 速度降一倍發(fā)送碼值0 ,1
  91. *        形    參:無(wú)
  92. *        返 回 值: 無(wú)
  93. *********************************************************************************************************
  94. */
  95. void TXL0(void) { PAout_1();  delay2us;         PAout_0(); delay_us(5); } // 發(fā)送0
  96. void TXL1(void) { PAout_1();  delay_us(5);  PAout_0(); delay2us; } // 發(fā)送1
  97. /*
  98. *********************************************************************************************************
  99. *        函 數(shù) 名: WS_Reset
  100. *        功能說(shuō)明: 發(fā)送碼值 幀單位
  101. *        形    參:無(wú)
  102. *        返 回 值: 無(wú)
  103. *********************************************************************************************************
  104. */void WS_Reset() {PAout_0()        ; delay_us(60);  PAout_1();}//PAout_0();

  105. /*
  106. *********************************************************************************************************
  107. *        函 數(shù) 名: WS_Set1
  108. *        功能說(shuō)明: 高速發(fā)送24Bit數(shù)據(jù)
  109. *        形    參:dat,發(fā)送的數(shù)據(jù)
  110. *        返 回 值: 無(wú)
  111. *********************************************************************************************************
  112. */
  113. void WS_SetH(unsigned long dat)
  114. {
  115.         unsigned char i;

  116.         for(i=0; i<24; i++)
  117.         {
  118.                 if(0x800000 == (dat & 0x800000) )        TX1();
  119.                 else                                                                TX0();
  120.                 dat<<=1;                                                        //左移一位
  121.         }
  122. }

  123. /*
  124. *********************************************************************************************************
  125. *        函 數(shù) 名: WS_SetL
  126. *        功能說(shuō)明: 低速發(fā)送24Bit數(shù)據(jù)
  127. *        形    參:dat,發(fā)送的數(shù)據(jù)
  128. *        返 回 值: 無(wú)
  129. *********************************************************************************************************
  130. */
  131. void WS_SetL(unsigned long dat)
  132. {
  133.         unsigned char i;

  134.         for(i=0; i<24; i++)
  135.         {
  136.                 if(0x800000 == (dat & 0x800000) )        TXL1();
  137.                 else                                                                TXL0();
  138.                 dat<<=1;                                                        //左移一位
  139.         }
  140. }

  141. /*
  142. *********************************************************************************************************
  143. *        函 數(shù) 名: WS_SetAll
  144. *        功能說(shuō)明: 發(fā)送數(shù)組內(nèi)全部數(shù)據(jù)
  145. *        形    參:無(wú)
  146. *        返 回 值: 無(wú)
  147. *********************************************************************************************************
  148. */
  149. void WS_L_SetAll()
  150. {
  151.         unsigned char j;

  152.         for (j=0; j<20; j++)
  153.         {
  154.                 //WsCol[j]  = SpiData.SpiData[j * 3]<<16 | SpiData.SpiData[j * 3 + 1]<<8 | SpiData.SpiData[j * 3 + 2];
  155.                 WsCol[j] = WsDat[j];
  156.                 WS_SetH(WsCol[j]);  // j 級(jí)聯(lián)個(gè)數(shù)/ 0
  157.         }
  158.         WS_Reset();
  159. }
  160. /*
  161. *********************************************************************************************************
  162. *        函 數(shù) 名: WS_SetAll
  163. *        功能說(shuō)明: 發(fā)送數(shù)組內(nèi)全部數(shù)據(jù)
  164. *        形    參:無(wú)
  165. *        返 回 值: 無(wú)
  166. *********************************************************************************************************
  167. */
  168. void WS_H_SetAll()
  169. {
  170.         unsigned char j;

  171.         for (j=0; j<nWs; j++)
  172.         {
  173.                 //WsCol[j]  = SpiData.SpiData[j * 3]<<16 | SpiData.SpiData[j * 3 + 1]<<8 | SpiData.SpiData[j * 3 + 2];
  174.                 WsCol[j] = WsDat[j];
  175.                 WS_SetH(WsCol[j]);  // j 級(jí)聯(lián)個(gè)數(shù)/ 0
  176.         }
  177.         WS_Reset();
  178. }

  179. /*
  180. *********************************************************************************************************
  181. *        函 數(shù) 名: abs0
  182. *        功能說(shuō)明: 求絕對(duì)值
  183. *        形    參:num,比較后的數(shù)據(jù)
  184. *        返 回 值: num,形參的絕對(duì)值
  185. *********************************************************************************************************
  186. */
  187. unsigned char abs0(int num)
  188. {
  189.         if (num>0) return num;

  190.         num = -num;
  191.         return (unsigned char) num;
  192. }

  193. /*
  194. *********************************************************************************************************
  195. *        函 數(shù) 名: ColorToColor
  196. *        功能說(shuō)明: 顏色漸變算法(正向)
  197. *        形    參:color0、color1 從一種顏色變到別一種顏色
  198. *        返 回 值: color        變化后的顏色
  199. *********************************************************************************************************
  200. */
  201. void ColorToColor(unsigned long color0, unsigned long color1)
  202. {
  203.         unsigned char Red0, Green0, Blue0;  // 起始三原色
  204.         unsigned char Red1, Green1, Blue1;  // 結(jié)果三原色
  205.         int                          RedMinus, GreenMinus, BlueMinus;        // 顏色差(color1 - color0)
  206.         unsigned char NStep;                                                         // 需要幾步
  207.         float                  RedStep, GreenStep, BlueStep;                // 各色步進(jìn)值
  208.         unsigned long color;                                                        // 結(jié)果色
  209.         unsigned char i;
  210.         uint8_t Pack = 0;

  211.         // 綠 紅 藍(lán) 三原色分解
  212.         Red0   = color0>>8;
  213.         Green0 = color0>>16;
  214.         Blue0  = color0;

  215.         Red1   = color1>>8;
  216.         Green1 = color1>>16;
  217.         Blue1  = color1;

  218.         // 計(jì)算需要多少步(取差值的最大值)
  219.         RedMinus   = Red1 - Red0;
  220.         GreenMinus = Green1 - Green0;
  221.         BlueMinus  = Blue1 - Blue0;

  222.         NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
  223.         NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);

  224.         // 計(jì)算出各色步進(jìn)值
  225.         RedStep   = (float)RedMinus   / NStep;
  226.         GreenStep = (float)GreenMinus / NStep;
  227.         BlueStep  = (float)BlueMinus  / NStep;

  228.         // 漸變開(kāi)始
  229.         for (i = 0; i < NStep; i++)                        //燈點(diǎn)亮的個(gè)數(shù)可變
  230.         {
  231.                 Red1   = Red0   + (int)(RedStep   * i);
  232.                 Green1 = Green0 + (int)(GreenStep * i);
  233.                 Blue1  = Blue0  + (int)(BlueStep  * i);

  234.                 color  = Green1<<16 | Red1<<8 | Blue1;         // 合成  綠紅藍(lán)
  235.                 WsDat[Pack] = color;                                        //這里只第一個(gè)燈
  236.                 WS_L_SetAll();                                                        // 輸出
  237.                 delay_ms(20);                                                // 漸變速度
  238.                 if (Pack > nWs)
  239.                 {
  240.                         Pack = 0;
  241.                 }
  242.                 else
  243.                 {
  244.                         Pack++;
  245.                 }
  246.         }
  247.         // 漸變結(jié)束
  248. //        return color;
  249. }

  250. /*
  251. *********************************************************************************************************
  252. *        函 數(shù) 名: ColorToColor1
  253. *        功能說(shuō)明: 顏色漸變算法        (反向)
  254. *        形    參:color0、color1 從一種顏色變到別一種顏色
  255. *        返 回 值: color        變化后的顏色
  256. *********************************************************************************************************
  257. */
  258. void ColorToColor1(unsigned long color0, unsigned long color1)
  259. {
  260.         unsigned char Red0, Green0, Blue0;  // 起始三原色
  261.         unsigned char Red1, Green1, Blue1;  // 結(jié)果三原色
  262.         int                          RedMinus, GreenMinus, BlueMinus;        // 顏色差(color1 - color0)
  263.         unsigned char NStep;                                                         // 需要幾步
  264.         float                  RedStep, GreenStep, BlueStep;                // 各色步進(jìn)值
  265.         unsigned long color;                                                        // 結(jié)果色
  266.         unsigned char i;
  267.         int8_t Pack = nWs;

  268.         // 綠 紅 藍(lán) 三原色分解
  269.         Red0   = color0>>8;
  270.         Green0 = color0>>16;
  271.         Blue0  = color0;

  272.         Red1   = color1>>8;
  273.         Green1 = color1>>16;
  274.         Blue1  = color1;

  275.         // 計(jì)算需要多少步(取差值的最大值)
  276.         RedMinus   = Red1 - Red0;
  277.         GreenMinus = Green1 - Green0;
  278.         BlueMinus  = Blue1 - Blue0;

  279.         NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
  280.         NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);

  281.         // 計(jì)算出各色步進(jìn)值
  282.         RedStep   = (float)RedMinus   / NStep;
  283.         GreenStep = (float)GreenMinus / NStep;
  284.         BlueStep  = (float)BlueMinus  / NStep;

  285.         // 漸變開(kāi)始
  286.         for (i = 0; i < NStep; i++)                                //燈點(diǎn)亮的個(gè)數(shù)可變
  287.         {
  288.                 Red1   = Red0   + (int)(RedStep   * i);
  289.                 Green1 = Green0 + (int)(GreenStep * i);
  290.                 Blue1  = Blue0  + (int)(BlueStep  * i);

  291.                 color  = Green1<<16 | Red1<<8 | Blue1;         // 合成  綠紅藍(lán)
  292.                 WsDat[Pack] = color;                                        //這里只第一個(gè)燈
  293.                 WS_H_SetAll();                                                        // 輸出
  294.                 delay_ms(2);                                                // 漸變速度
  295.                 if (Pack > 0)
  296.                 {
  297.                         Pack--;
  298.                 }
  299.                 else
  300.                 {
  301.                         Pack = nWs;
  302.                 }
  303.         }

  304.         // 漸變結(jié)束
  305. //        return color;
  306. }

  307. /*
  308. *********************************************************************************************************
  309. *        函 數(shù) 名: WaterLampToCol1
  310. *        功能說(shuō)明: 從前向后移動(dòng)(單組)
  311. *        形    參:_uColor         點(diǎn)亮顏色
  312. *                          _uTime        移位速度
  313. *        返 回 值: 無(wú)
  314. *********************************************************************************************************
  315. */
  316. void WaterLampToCol1(uint32_t _uColor, uint16_t _uTime)
  317. {
  318.         uint8_t i;


  319. //        for (i = 0; i < 3; i++)
  320. //        {
  321. //                _uColor = g_tSpi.RxBuf[0]<<16 | g_tSpi.RxBuf[1]<<8 | g_tSpi.RxBuf[2];
  322. //
  323. //                //_uColor = _uColor + 0xfffff*i;
  324. //                WsDat[ i] = _uColor;

  325. //        //        delay_ms(_uTime);
  326. [i]//                //memset(WsDat, 0, sizeof(WsDat));[/i]
  327. [i]//[/i]
  328. [i]//        }[/i]
  329. [i]        WS_L_SetAll();[/i]
  330. [i]        //delay_ms(_uTime);[/i]

  331. [i]}[/i]

  332. [i]/*[/i]
  333. [i]*********************************************************************************************************[/i]
  334. [i]*        函 數(shù) 名: WaterLampToCol2[/i]
  335. [i]*        功能說(shuō)明: 單組燈移位顯示[/i]
  336. [i]*        形    參:_uColor         點(diǎn)亮顏色[/i]
  337. [i]*                          _uTime        移位速度[/i]
  338. [i]*        返 回 值: 無(wú)[/i]
  339. [i]*********************************************************************************************************[/i]
  340. [i]*/[/i]
  341. [i]void WaterLampToCol2(uint32_t _uColor, uint16_t _uTime)[/i]
  342. [i]{[/i]
  343. [i]        uint8_t i, j;[/i]
  344. [i]        uint8_t Red2, Green2, Blue2;  // 三原色[/i]

  345. [i]        Red2  = _uColor>>8;[/i]
  346. [i]        Green2 = _uColor>>16;[/i]
  347. [i]        Blue2  = _uColor;[/i]

  348. [i]        for (i = 0; i < nWs; i++)[/i]
  349. [i]        {[/i]
  350. [i]                for (j = 0; j < i; j++)[/i]
  351. [i]                {[/i]
  352. [i]                        Red2 = Red2 + 0x22;[/i]
  353. [i]                        //Green2 = Green2 + 0x22;[/i]
  354. [i]                        //Blue2 = Blue2 + 0x22;[/i]
  355. [i]                        _uColor = Green2<<16 | Red2<<8 | Blue2;[/i]

  356. [i]        //                _uColor = _uColor + 0xfffff*i;[/i]
  357. [i]                        WsDat[j] = _uColor;[/i]
  358. [i]                }[/i]
  359. [i]                WS_L_SetAll();[/i]
  360. [i]                delay_ms(_uTime);[/i]
  361. [i]//                memset(WsDat, 0, sizeof(WsDat));[/i]
  362. [i]        }[/i]

  363. [i]}[/i]

  364. [i]/*[/i]
  365. [i]*********************************************************************************************************[/i]
  366. [i]*        函 數(shù) 名: WaterLampToCol5[/i]
  367. [i]*        功能說(shuō)明: 與模式2反向[/i]
  368. [i]*        形    參:_uColor         點(diǎn)亮顏色[/i]
  369. [i]*                          _uTime        移位速度[/i]
  370. [i]*        返 回 值: 無(wú)[/i]
  371. [i]*********************************************************************************************************[/i]
  372. [i]*/[/i]
  373. [i]void WaterLampToCol5(uint32_t _uColor, uint16_t _uTime)[/i]
  374. [i]{[/i]
  375. [i]        uint8_t i, j;[/i]
  376. [i]        uint8_t Red2, Green2, Blue2;  // 三原色[/i]

  377. [i]        Red2  = _uColor>>8;[/i]
  378. [i]        Green2 = _uColor>>16;[/i]
  379. [i]        Blue2  = _uColor;[/i]

  380. [i]        for (i = nWs; i > 0; i--)[/i]
  381. [i]        {[/i]
  382. [i]                for (j = i; j > 0; j--)[/i]
  383. [i]                {[/i]
  384. [i]                        Red2 = Red2 + 0x22;[/i]
  385. [i]                        //Green2 = Green2 + 0x22;[/i]
  386. [i]                        //Blue2 = Blue2 + 0x22;[/i]
  387. [i]                        _uColor = Green2<<16 | Red2<<8 | Blue2;[/i]

  388. [i]        //                _uColor = _uColor + 0xfffff*i;[/i]
  389. [i]                        WsDat[j] = _uColor;[/i]
  390. [i]                }[/i]
  391. [i]                WS_L_SetAll();[/i]
  392. [i]                delay_ms(_uTime);[/i]
  393. [i]//                memset(WsDat, 0, sizeof(WsDat));[/i]
  394. [i]        }[/i]

  395. [i]}[/i]

  396. [i]/*[/i]
  397. [i]*********************************************************************************************************[/i]
  398. [i]*        函 數(shù) 名: WaterLampToCol3[/i]
  399. [i]*        功能說(shuō)明: 從中點(diǎn)向兩端移動(dòng)[/i]
  400. [i]*        形    參:_uColor         點(diǎn)亮顏色[/i]
  401. [i]*                          _uTime        移位速度[/i]
  402. [i]*        返 回 值: 無(wú)[/i]
  403. [i]*********************************************************************************************************[/i]
  404. [i]*/[/i]
  405. [i]void WaterLampToCol3(uint32_t _uColor, uint16_t _uTime)[/i]
  406. [i]{[/i]
  407. [i]        uint8_t i;[/i]

  408. [i]        for (i = nWs/2; i < nWs; i++)[/i]
  409. [i]        {[/i]
  410. [i]                _uColor = _uColor + 0xfffff*i;[/i]
  411. [i]                WsDat[i] = _uColor;[/i][/i]
  412. [i][i]                WsDat[nWs/2 -(i - nWs/2)] = _uColor;[/i][/i]
  413. [i][i]                WS_L_SetAll();[/i][/i]
  414. [i][i]                delay_ms(_uTime);[/i][/i]
  415. [i][i]                memset(WsDat, 0, sizeof(WsDat));[/i][/i]
  416. [i][i]        }[/i][/i]

  417. [i][i]}[/i][/i]

  418. [i][i]/*[/i][/i]
  419. [i][i]*********************************************************************************************************[/i][/i]
  420. [i][i]*        函 數(shù) 名: WaterLampToCol4[/i][/i]
  421. [i][i]*        功能說(shuō)明: 從后向前移動(dòng)(單組)[/i][/i]
  422. [i][i]*        形    參:_uColor         點(diǎn)亮顏色[/i][/i]
  423. [i][i]*                          _uTime        移位速度[/i][/i]
  424. [i][i]*        返 回 值: 無(wú)[/i][/i]
  425. [i][i]*********************************************************************************************************[/i][/i]
  426. [i][i]*/[/i][/i]
  427. [i][i]void WaterLampToCol4(uint32_t _uColor, uint16_t _uTime)[/i][/i]
  428. [i][i]{[/i][/i]
  429. [i][i]        int8_t i;[/i][/i]

  430. [i][i]        for (i = nWs-1; i >= 0; i--)[/i][/i]
  431. [i][i]        {[/i][/i]
  432. [i][i]                _uColor = _uColor + 0xff0000*i + 0xff00*i + 0xff*i;[/i][/i]
  433. [i][i]                WsDat[i] = _uColor;[/i][/i][/i]
  434.                 WS_L_SetAll();
  435.                 delay_ms(_uTime);
  436.                 memset(WsDat, 0, sizeof(WsDat));
  437.         }

  438. }

  439. /*
  440. *********************************************************************************************************
  441. *        函 數(shù) 名: WaterLampToCol6
  442. *        功能說(shuō)明: 從后向前移動(dòng)(跳一個(gè))
  443. *        形    參:_uColor         點(diǎn)亮顏色
  444. *                          _uTime        移位速度
  445. *        返 回 值: 無(wú)
  446. *********************************************************************************************************
  447. */
  448. void WaterLampToCol6(uint32_t _uColor, uint16_t _uTime)
  449. {
  450.         uint8_t i;

  451.         for (i = 0; i < nWs; i++)
  452.         {
  453.                 i = i + 1;
  454.                 //_uColor = _uColor + 0xfffff*i;
  455.                 WsDat[i] = _uColor;[/i]
  456.         }
  457.         WS_L_SetAll();
  458.         delay_ms(_uTime);
  459.         memset(WsDat, 0, sizeof(WsDat));
  460.         for (i = 0; i < nWs; i++)
  461.         {
  462.                 if(i != 0)
  463.                 {
  464.                         i = i + 1;
  465.                 }
  466.                 //_uColor = Color + 0xfffff*i;
  467.                 WsDat[i] = _uColor;[/i]

  468.         }
  469.         WS_L_SetAll();
  470.         delay_ms(_uTime);
  471.         memset(WsDat, 0, sizeof(WsDat));

  472. }
  473. /*
  474. *********************************************************************************************************
  475. *        函 數(shù) 名: WaterLampToCol7(可使用)
  476. *        功能說(shuō)明: 從后向前移動(dòng)(單組)
  477. *        形    參:_uColor0         顏色1
  478. *                         _uColor1        顏色2
  479. *                          _uTime        移位速度
  480. *        返 回 值: 無(wú)
  481. *********************************************************************************************************
  482. */
  483. void WaterLampToCol7(uint32_t _uColor0, uint32_t _uColor1, uint16_t _uTime)
  484. {
  485.         int8_t i, j, f = 0;
  486.         uint8_t NStep;  // 三原色
  487.         unsigned char Red0, Green0, Blue0;  // 起始三原色
  488.         unsigned char Red1, Green1, Blue1;  // 結(jié)果三原色
  489.         int                          RedMinus, GreenMinus, BlueMinus;        // 顏色差(color1 - color0)                                                        // 需要幾步
  490.         float                  RedStep, GreenStep, BlueStep;                // 各色步進(jìn)值

  491.         Red0   = _uColor0>>8;
  492.         Green0 = _uColor0>>16;
  493.         Blue0  = _uColor0;

  494.         Red1   = _uColor1>>8;
  495.         Green1 = _uColor1>>16;
  496.         Blue1  = _uColor1;

  497.         NStep = 3;
  498.                 // 計(jì)算需要多少步(取差值的最大值)
  499.         RedMinus   = Red1 - Red0;
  500.         GreenMinus = Green1 - Green0;
  501.         BlueMinus  = Blue1 - Blue0;
  502.                 // 計(jì)算出各色步進(jìn)值
  503.         RedStep   = (float)RedMinus   / NStep;
  504.         GreenStep = (float)GreenMinus / NStep;
  505.         BlueStep  = (float)BlueMinus  / NStep;

  506.         for(j = -(NStep);j < nWs; j++)
  507.         {
  508.                 for(i = 0; i < NStep; i++)
  509.                 {
  510.                         Red1   = Red0   + (int)(RedStep   * i);
  511.                         Green1 = Green0 + (int)(GreenStep * i);
  512.                         Blue1  = Blue0  + (int)(BlueStep  * i);
  513.                         WsDat[i + j] = Green1<<16 | Red1<<8 | Blue1;
  514.                 }
  515.                 WS_L_SetAll();
  516.                 delay_ms(_uTime);
  517.                 memset(WsDat, 0, sizeof(WsDat));
  518.         }

  519. }

  520. /*
  521. *********************************************************************************************************
  522. *        函 數(shù) 名: WaterLampToCol8(可用)
  523. *        功能說(shuō)明: 從后向前移動(dòng)(跳一個(gè))
  524. *        形    參:_uColor         點(diǎn)亮顏色
  525. *                          _uTime        移位速度
  526. *        返 回 值: 無(wú)
  527. *********************************************************************************************************
  528. */
  529. void WaterLampToCol8(uint32_t _uColor0, uint16_t _uTime)
  530. {
  531.         uint8_t i;

  532.         for (i = 3; i < nWs/2; i++)
  533.         {
  534.                 WsDat[i] = _uColor0;[/i]
  535.         }
  536.         for (i = nWs/2; i < nWs - 3; i++)
  537.         {
  538.                 WsDat[i] = 0;[/i]
  539.         }
  540.         WS_L_SetAll();
  541.         delay_ms(_uTime);
  542. }
  543. /*
  544. *********************************************************************************************************
  545. *        函 數(shù) 名: WaterLampToCol9(可用)
  546. *        功能說(shuō)明: 從后向前移動(dòng)(跳一個(gè))
  547. *        形    參:_uColor         點(diǎn)亮顏色
  548. *                          _uTime        移位速度
  549. *        返 回 值: 無(wú)
  550. *********************************************************************************************************
  551. */
  552. void WaterLampToCol9(uint32_t _uColor0, uint16_t _uTime)
  553. {
  554.         uint8_t i;

  555.         for (i = 3; i < nWs/2; i++)
  556.         {
  557.                 WsDat[i] = 0;[/i]
  558.         }
  559.         for (i = nWs/2; i < nWs - 3; i++)
  560.         {
  561.                 WsDat[i] = _uColor0;[/i]
  562.         }
  563.         WS_L_SetAll();
  564.         delay_ms(_uTime);
  565. }

  566. /*
  567. *********************************************************************************************************
  568. *        函 數(shù) 名: WaterLampToCol10(可用)
  569. *        功能說(shuō)明: 從后向前移動(dòng)(跳一個(gè))
  570. *        形    參:_uColor         點(diǎn)亮顏色
  571. *                          _uTime        移位速度
  572. *        返 回 值: 無(wú)
  573. *********************************************************************************************************
  574. */
  575. void WaterLampToCol10(uint32_t _uColor0,uint32_t _uColor1, uint16_t _uTime)
  576. {
  577.         int8_t i, j;

  578.         WsDat[1] = _uColor0;
  579.         WsDat[0] = _uColor1;

  580.         for(i = 0;i < nWs; i++)
  581.         {
  582.                 WsDat[i + 2] = WsDat[i + 1];
  583.                 WsDat[i + 1] = WsDat[i];[/i]
  584.                 WsDat[i] = 0;[/i]
  585.                 WS_L_SetAll();
  586.                 delay_ms(_uTime);
  587.         }

  588. }

  589. /*
  590. *********************************************************************************************************
  591. *        函 數(shù) 名: WaterLampToCol11(可用)
  592. *        功能說(shuō)明: 從后向前移動(dòng)(跳一個(gè))
  593. *        形    參:_uColor         點(diǎn)亮顏色
  594. *                          _uTime        移位速度
  595. *        返 回 值: 無(wú)
  596. *********************************************************************************************************
  597. */
  598. void WaterLampToCol11(uint32_t _uColor0,uint32_t _uColor1, uint16_t _uTime)
  599. {
  600.         int8_t i, j;

  601.         WsDat[1] = _uColor0;
  602.         WsDat[0] = _uColor1;
  603.         WsDat[nWs - 1] = _uColor0;
  604.         WsDat[nWs - 2] = _uColor1;
  605.         for(i = 0;i < nWs ; i++)
  606.         {
  607.                 WsDat[i + 2] = WsDat[i + 1];
  608.                 WsDat[i + 1] = WsDat[i];[/i]
  609.                 WsDat[i] = 0;[/i]
  610.                 WsDat[nWs - i - 2] =WsDat[nWs - i - 1];
  611.                 WsDat[nWs - i - 1] = WsDat[nWs - 1];
  612.                 WsDat[nWs - 1] = 0;
  613.                 WS_L_SetAll();
  614.                 delay_ms(_uTime);

  615.         }
  616. }
  617. /*
  618. *********************************************************************************************************
  619. *        函 數(shù) 名: WaterLampToCol12(可用)
  620. *        功能說(shuō)明: 從后向前移動(dòng)(跳一個(gè))
  621. *        形    參:_uColor         點(diǎn)亮顏色
  622. *                          _uTime        移位速度
  623. *        返 回 值: 無(wú)
  624. *********************************************************************************************************
  625. */
  626. void WaterLampToCol12(uint32_t _uColor0,uint32_t _uColor1, uint16_t _uTime)
  627. {
  628.         unsigned char Red0, Green0, Blue0;  // 起始三原色
  629.         unsigned char Red1, Green1, Blue1;  // 結(jié)果三原色
  630.         unsigned char Red2, Green2, Blue2;  // 結(jié)果三原色
  631.         int                          RedMinus, GreenMinus, BlueMinus;        // 顏色差(color1 - color0)
  632.         unsigned char NStep;                                                         // 需要幾步
  633.         float                  RedStep, GreenStep, BlueStep;                // 各色步進(jìn)值
  634.         unsigned long color;                                                        // 結(jié)果色
  635.         unsigned char i, j;
  636.         int8_t Pack = nWs;
  637.         for(j = 0; j < 20 ;j++)
  638.         {
  639.                 // 綠 紅 藍(lán) 三原色分解
  640.                 Red0   = _uColor0>>8;
  641.                 Green0 = _uColor0>>16;
  642.                 Blue0  = _uColor0;

  643.                 Red1   = _uColor1>>8;
  644.                 Green1 = _uColor1>>16;
  645.                 Blue1  = _uColor1;


  646.         // 計(jì)算需要多少步(取差值的最大值)
  647.                 RedMinus   = Red1 - Red0;
  648.                 GreenMinus = Green1 - Green0;
  649.                 BlueMinus  = Blue1 - Blue0;

  650.                 NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
  651.                 NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);

  652.                 // 計(jì)算出各色步進(jìn)值
  653.                 RedStep   = (float)RedMinus   / NStep;
  654.                 GreenStep = (float)GreenMinus / NStep;
  655.                 BlueStep  = (float)BlueMinus  / NStep;

  656.                 WsDat[j-1] = 0 ;
  657.                 for(i = 0; i < NStep; i++)
  658.                 {
  659.                         Red2   = Red0   + (int)(RedStep   * i);
  660.                         Green2 = Green0 + (int)(GreenStep * i);
  661.                         Blue2  = Blue0  + (int)(BlueStep  * i);
  662.                         color  = Green2<<16 | Red2<<8 | Blue2;          // 合成  綠紅藍(lán)
  663.                         WsDat[j+1] = color ;
  664.                         WS_L_SetAll();
  665.                         delay_ms(_uTime);
  666.                 }
  667.                 for(i = 0; i < NStep; i++)
  668.                 {
  669.                         Red2   = Red1   - (int)(RedStep   * i);
  670.                         Green2 = Green1 - (int)(GreenStep * i);
  671.                         Blue2  = Blue1  - (int)(BlueStep  * i);
  672.                         color  = Green2<<16 | Red2<<8 | Blue2;          // 合成  綠紅藍(lán)
  673.                         WsDat[j] = color ;
  674.                         WS_L_SetAll();
  675.                         delay_ms(_uTime);
  676.                 }
  677.         }
  678. }

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

使用道具 舉報(bào)

沙發(fā)
ID:218816 發(fā)表于 2017-7-12 15:31 | 只看該作者
太復(fù)雜了
回復(fù)

使用道具 舉報(bào)

板凳
ID:206676 發(fā)表于 2017-7-13 20:21 | 只看該作者
少了個(gè)頭文件的程序吧!
回復(fù)

使用道具 舉報(bào)

地板
ID:206676 發(fā)表于 2017-7-13 20:26 | 只看該作者
沒(méi)有那個(gè)頭文件,有幾個(gè)數(shù)組調(diào)用不了!無(wú)法編譯。樓主求解。
回復(fù)

使用道具 舉報(bào)

5#
ID:289056 發(fā)表于 2018-3-8 10:36 | 只看該作者
這個(gè)變化的花樣很多啊
回復(fù)

使用道具 舉報(bào)

6#
ID:197314 發(fā)表于 2018-6-26 09:34 | 只看該作者
好復(fù)雜
回復(fù)

使用道具 舉報(bào)

7#
ID:735961 發(fā)表于 2020-4-23 11:42 | 只看該作者
這個(gè)是可以單片機(jī)控制2811是嗎     還有可以控制多少個(gè)2811
回復(fù)

使用道具 舉報(bào)

8#
ID:735961 發(fā)表于 2020-4-29 08:28 | 只看該作者
不去考慮頭文件,,感覺(jué)好厲害
回復(fù)

使用道具 舉報(bào)

9#
ID:735961 發(fā)表于 2020-4-29 08:29 | 只看該作者
也是多級(jí)聯(lián)幾個(gè)2818/IC 就好了,看看是怎么寫的
回復(fù)

使用道具 舉報(bào)

10#
ID:735961 發(fā)表于 2020-4-29 08:31 | 只看該作者
中山-燈帶-曹 發(fā)表于 2020-4-23 11:42
這個(gè)是可以單片機(jī)控制2811是嗎     還有可以控制多少個(gè)2811

我也是想問(wèn)這個(gè)問(wèn)題
回復(fù)

使用道具 舉報(bào)

11#
ID:896917 發(fā)表于 2021-3-26 14:14 | 只看該作者
你好,有完整程序?有帶rf觸摸遙控主程序?可以帶動(dòng)ws2811rgb燈帶和 ws2812 rgbw燈帶的。我想學(xué)習(xí)編程
回復(fù)

使用道具 舉報(bào)

12#
ID:387856 發(fā)表于 2021-5-4 11:35 | 只看該作者
有紅外遙控 控制這個(gè)燈帶的程序嗎?
回復(fù)

使用道具 舉報(bào)

13#
ID:99525 發(fā)表于 2022-1-15 13:16 | 只看該作者

補(bǔ)個(gè)頭文件WS2811.h

#ifndef __WS2811_H
#define __WS2811_H         
#include "sys.h"


#define White       0xFFFFFF  // 白色
#define Black       0x000000  // 黑色
#define Red         0x00ff00  // 紅色
#define Green       0xff0000  // 綠色
#define Blue        0x0000ff  // 藍(lán)色


#define nWs 16                // 有多少顆WS2811級(jí)聯(lián)

extern unsigned long WsDat[];

extern void WS_Init(void);
extern void WS_SetAll(void);
extern u32 ColorToColor(unsigned long color0, unsigned long color1);

                                                     
#endif
回復(fù)

使用道具 舉報(bào)

14#
ID:317998 發(fā)表于 2022-9-5 22:56 | 只看該作者
請(qǐng)問(wèn)各位一下:這是用什么型號(hào)單片機(jī)呀?
回復(fù)

使用道具 舉報(bào)

15#
ID:917430 發(fā)表于 2022-9-11 22:37 | 只看該作者
熊喬中 發(fā)表于 2022-9-5 22:56
請(qǐng)問(wèn)各位一下:這是用什么型號(hào)單片機(jī)呀?

應(yīng)該是stm32
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产午夜高清 | 天天插天天操 | 91社区在线观看 | 毛片免费观看 | 国产在线麻豆精品入口 | 午夜www | 欧美精品一区二区三区在线播放 | 日韩成人精品在线 | 精品国产视频 | 国产成人精品免高潮在线观看 | 久久久久国产一区二区三区 | 先锋资源站 | 亚洲自拍偷拍免费视频 | 亚洲成人黄色 | 午夜极品| 老司机67194精品线观看 | 欧美精品导航 | 色综合中文 | 久久久亚洲一区 | 国产三区在线观看视频 | 一区在线视频 | 久久精品无码一区二区三区 | 亚洲精品一区二区三区中文字幕 | 久久久久国产一区二区三区 | 国产精品成人一区二区三区 | 日本福利在线 | 国产视频福利在线观看 | 天天爽夜夜爽精品视频婷婷 | 久在线视频播放免费视频 | 久草欧美 | 欧美一区二区在线观看 | 天天影视网天天综合色在线播放 | 国产成人精品一区 | 久久久精品一区 | 欧美国产日韩在线 | 尤物在线| 久久精品a| 日本在线播放 | av在线免费不卡 | 国产成人av在线 | 国产日韩一区二区 |