找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9744|回复: 14
打印 上一主题 下一主题
收起左侧

WS2811幻彩灯程序

  [复制链接]
跳转到指定楼层
楼主
ID:208382 发表于 2017-6-6 14:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  1. /****************************************************************************************
  2. * WS2811 彩灯驱动函数
  3. *
  4. * 调用方法:
  5. *        修改宏定义: #define nWs 1        // 有多少颗WS2811级联
  6. *        WS_Init();        // IO初始化
  7. *        WsDat[0] = 0x808080;//显存赋值
  8. *        WS_SetAll();  // 发送数据
  9. *        ColorToColor(unsigned long color0, unsigned long color1);// 颜色渐变算法
  10. *
  11. * 作者:星希望(已校验)
  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. *        函 数 名: WS_Init
  31. *        功能说明: 初始化WS2811输出GPIO
  32. *        形    参:无
  33. *        返 回 值: 无
  34. *********************************************************************************************************
  35. */
  36. void WS_Init()
  37. {
  38.         GPIO_InitTypeDef  GPIO_InitStruct;

  39.         //端口时钟,使能
  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);                                        // 根据设定参数初始化

  47.         GPIO_InitStruct.GPIO_Pin = PIN_PEN;                                // PIN
  48.         GPIO_Init(PORT_PEN, &GPIO_InitStruct);                                        // 根据设定参数初始化

  49.         PEN_1();
  50. }

  51. /*
  52. *********************************************************************************************************
  53. *        函 数 名: delay2us
  54. *        功能说明: 延时2us
  55. *        形    参:无
  56. *        返 回 值: 无
  57. *********************************************************************************************************
  58. */
  59. void delay2us(void)
  60. {
  61.         unsigned char i;
  62.         for(i=0; i<12; i++);
  63. }
  64. /*
  65. *********************************************************************************************************
  66. *        函 数 名: delay05us
  67. *        功能说明: 延时0.5us
  68. *        形    参:无
  69. *        返 回 值: 无
  70. *********************************************************************************************************
  71. */
  72. void delay05us(void)
  73. {
  74.         unsigned char i;
  75.         for(i=0; i<2; i++);
  76. }
  77. /*
  78. *********************************************************************************************************
  79. *        函 数 名: TX0,TX1
  80. *        功能说明: 高速模式(最快)发送码值0 ,1
  81. *        形    参:无
  82. *        返 回 值: 无
  83. *********************************************************************************************************
  84. */
  85. void TX0() { PAout_1(); delay05us; PAout_0(); delay_us(2); } // 发送0
  86. void TX1() { PAout_1(); delay_us(2);  PAout_0(); delay05us; } // 发送1

  87. /*
  88. *********************************************************************************************************
  89. *        函 数 名: TXL0,TXL1
  90. *        功能说明: 速度降一倍发送码值0 ,1
  91. *        形    参:无
  92. *        返 回 值: 无
  93. *********************************************************************************************************
  94. */
  95. void TXL0(void) { PAout_1();  delay2us;         PAout_0(); delay_us(5); } // 发送0
  96. void TXL1(void) { PAout_1();  delay_us(5);  PAout_0(); delay2us; } // 发送1
  97. /*
  98. *********************************************************************************************************
  99. *        函 数 名: WS_Reset
  100. *        功能说明: 发送码值 帧单位
  101. *        形    参:无
  102. *        返 回 值: 无
  103. *********************************************************************************************************
  104. */void WS_Reset() {PAout_0()        ; delay_us(60);  PAout_1();}//PAout_0();

  105. /*
  106. *********************************************************************************************************
  107. *        函 数 名: WS_Set1
  108. *        功能说明: 高速发送24Bit数据
  109. *        形    参:dat,发送的数据
  110. *        返 回 值: 无
  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. *        函 数 名: WS_SetL
  126. *        功能说明: 低速发送24Bit数据
  127. *        形    参:dat,发送的数据
  128. *        返 回 值: 无
  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. *        函 数 名: WS_SetAll
  144. *        功能说明: 发送数组内全部数据
  145. *        形    参:无
  146. *        返 回 值: 无
  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 级联个数/ 0
  157.         }
  158.         WS_Reset();
  159. }
  160. /*
  161. *********************************************************************************************************
  162. *        函 数 名: WS_SetAll
  163. *        功能说明: 发送数组内全部数据
  164. *        形    参:无
  165. *        返 回 值: 无
  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 级联个数/ 0
  176.         }
  177.         WS_Reset();
  178. }

  179. /*
  180. *********************************************************************************************************
  181. *        函 数 名: abs0
  182. *        功能说明: 求绝对值
  183. *        形    参:num,比较后的数据
  184. *        返 回 值: num,形参的绝对值
  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. *        函 数 名: ColorToColor
  196. *        功能说明: 颜色渐变算法(正向)
  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;  // 结果三原色
  205.         int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)
  206.         unsigned char NStep;                                                         // 需要几步
  207.         float                  RedStep, GreenStep, BlueStep;                // 各色步进值
  208.         unsigned long color;                                                        // 结果色
  209.         unsigned char i;
  210.         uint8_t Pack = 0;

  211.         // 绿 红 蓝 三原色分解
  212.         Red0   = color0>>8;
  213.         Green0 = color0>>16;
  214.         Blue0  = color0;

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

  218.         // 计算需要多少步(取差值的最大值)
  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.         // 计算出各色步进值
  225.         RedStep   = (float)RedMinus   / NStep;
  226.         GreenStep = (float)GreenMinus / NStep;
  227.         BlueStep  = (float)BlueMinus  / NStep;

  228.         // 渐变开始
  229.         for (i = 0; i < NStep; i++)                        //灯点亮的个数可变
  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;         // 合成  绿红蓝
  235.                 WsDat[Pack] = color;                                        //这里只第一个灯
  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.         // 渐变结束
  248. //        return color;
  249. }

  250. /*
  251. *********************************************************************************************************
  252. *        函 数 名: ColorToColor1
  253. *        功能说明: 颜色渐变算法        (反向)
  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;  // 结果三原色
  262.         int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)
  263.         unsigned char NStep;                                                         // 需要几步
  264.         float                  RedStep, GreenStep, BlueStep;                // 各色步进值
  265.         unsigned long color;                                                        // 结果色
  266.         unsigned char i;
  267.         int8_t Pack = nWs;

  268.         // 绿 红 蓝 三原色分解
  269.         Red0   = color0>>8;
  270.         Green0 = color0>>16;
  271.         Blue0  = color0;

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

  275.         // 计算需要多少步(取差值的最大值)
  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.         // 计算出各色步进值
  282.         RedStep   = (float)RedMinus   / NStep;
  283.         GreenStep = (float)GreenMinus / NStep;
  284.         BlueStep  = (float)BlueMinus  / NStep;

  285.         // 渐变开始
  286.         for (i = 0; i < NStep; i++)                                //灯点亮的个数可变
  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;         // 合成  绿红蓝
  292.                 WsDat[Pack] = color;                                        //这里只第一个灯
  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.         // 渐变结束
  305. //        return color;
  306. }

  307. /*
  308. *********************************************************************************************************
  309. *        函 数 名: WaterLampToCol1
  310. *        功能说明: 从前向后移动(单组)
  311. *        形    参:_uColor         点亮颜色
  312. *                          _uTime        移位速度
  313. *        返 回 值: 无
  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]*        函 数 名: WaterLampToCol2[/i]
  335. [i]*        功能说明: 单组灯移位显示[/i]
  336. [i]*        形    参:_uColor         点亮颜色[/i]
  337. [i]*                          _uTime        移位速度[/i]
  338. [i]*        返 回 值: 无[/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]*        函 数 名: WaterLampToCol5[/i]
  367. [i]*        功能说明: 与模式2反向[/i]
  368. [i]*        形    参:_uColor         点亮颜色[/i]
  369. [i]*                          _uTime        移位速度[/i]
  370. [i]*        返 回 值: 无[/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]*        函 数 名: WaterLampToCol3[/i]
  399. [i]*        功能说明: 从中点向两端移动[/i]
  400. [i]*        形    参:_uColor         点亮颜色[/i]
  401. [i]*                          _uTime        移位速度[/i]
  402. [i]*        返 回 值: 无[/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]*        函 数 名: WaterLampToCol4[/i][/i]
  421. [i][i]*        功能说明: 从后向前移动(单组)[/i][/i]
  422. [i][i]*        形    参:_uColor         点亮颜色[/i][/i]
  423. [i][i]*                          _uTime        移位速度[/i][/i]
  424. [i][i]*        返 回 值: 无[/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. *        函 数 名: WaterLampToCol6
  442. *        功能说明: 从后向前移动(跳一个)
  443. *        形    参:_uColor         点亮颜色
  444. *                          _uTime        移位速度
  445. *        返 回 值: 无
  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. *        函 数 名: WaterLampToCol7(可使用)
  476. *        功能说明: 从后向前移动(单组)
  477. *        形    参:_uColor0         颜色1
  478. *                         _uColor1        颜色2
  479. *                          _uTime        移位速度
  480. *        返 回 值: 无
  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;  // 结果三原色
  489.         int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)                                                        // 需要几步
  490.         float                  RedStep, GreenStep, BlueStep;                // 各色步进值

  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.                 // 计算需要多少步(取差值的最大值)
  499.         RedMinus   = Red1 - Red0;
  500.         GreenMinus = Green1 - Green0;
  501.         BlueMinus  = Blue1 - Blue0;
  502.                 // 计算出各色步进值
  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. *        函 数 名: WaterLampToCol8(可用)
  523. *        功能说明: 从后向前移动(跳一个)
  524. *        形    参:_uColor         点亮颜色
  525. *                          _uTime        移位速度
  526. *        返 回 值: 无
  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. *        函 数 名: WaterLampToCol9(可用)
  546. *        功能说明: 从后向前移动(跳一个)
  547. *        形    参:_uColor         点亮颜色
  548. *                          _uTime        移位速度
  549. *        返 回 值: 无
  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. *        函 数 名: WaterLampToCol10(可用)
  569. *        功能说明: 从后向前移动(跳一个)
  570. *        形    参:_uColor         点亮颜色
  571. *                          _uTime        移位速度
  572. *        返 回 值: 无
  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. *        函 数 名: WaterLampToCol11(可用)
  592. *        功能说明: 从后向前移动(跳一个)
  593. *        形    参:_uColor         点亮颜色
  594. *                          _uTime        移位速度
  595. *        返 回 值: 无
  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. *        函 数 名: WaterLampToCol12(可用)
  620. *        功能说明: 从后向前移动(跳一个)
  621. *        形    参:_uColor         点亮颜色
  622. *                          _uTime        移位速度
  623. *        返 回 值: 无
  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;  // 结果三原色
  630.         unsigned char Red2, Green2, Blue2;  // 结果三原色
  631.         int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)
  632.         unsigned char NStep;                                                         // 需要几步
  633.         float                  RedStep, GreenStep, BlueStep;                // 各色步进值
  634.         unsigned long color;                                                        // 结果色
  635.         unsigned char i, j;
  636.         int8_t Pack = nWs;
  637.         for(j = 0; j < 20 ;j++)
  638.         {
  639.                 // 绿 红 蓝 三原色分解
  640.                 Red0   = _uColor0>>8;
  641.                 Green0 = _uColor0>>16;
  642.                 Blue0  = _uColor0;

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


  646.         // 计算需要多少步(取差值的最大值)
  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.                 // 计算出各色步进值
  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;          // 合成  绿红蓝
  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;          // 合成  绿红蓝
  673.                         WsDat[j] = color ;
  674.                         WS_L_SetAll();
  675.                         delay_ms(_uTime);
  676.                 }
  677.         }
  678. }

复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:218816 发表于 2017-7-12 15:31 | 只看该作者
太复杂了
回复

使用道具 举报

板凳
ID:206676 发表于 2017-7-13 20:21 | 只看该作者
少了个头文件的程序吧!
回复

使用道具 举报

地板
ID:206676 发表于 2017-7-13 20:26 | 只看该作者
没有那个头文件,有几个数组调用不了!无法编译。楼主求解。
回复

使用道具 举报

5#
ID:289056 发表于 2018-3-8 10:36 | 只看该作者
这个变化的花样很多啊
回复

使用道具 举报

6#
ID:197314 发表于 2018-6-26 09:34 | 只看该作者
好复杂
回复

使用道具 举报

7#
ID:735961 发表于 2020-4-23 11:42 | 只看该作者
这个是可以单片机控制2811是吗     还有可以控制多少个2811
回复

使用道具 举报

8#
ID:735961 发表于 2020-4-29 08:28 | 只看该作者
不去考虑头文件,,感觉好厉害
回复

使用道具 举报

9#
ID:735961 发表于 2020-4-29 08:29 | 只看该作者
也是多级联几个2818/IC 就好了,看看是怎么写的
回复

使用道具 举报

10#
ID:735961 发表于 2020-4-29 08:31 | 只看该作者
中山-灯带-曹 发表于 2020-4-23 11:42
这个是可以单片机控制2811是吗     还有可以控制多少个2811

我也是想问这个问题
回复

使用道具 举报

11#
ID:896917 发表于 2021-3-26 14:14 | 只看该作者
你好,有完整程序?有带rf触摸遥控主程序?可以带动ws2811rgb灯带和 ws2812 rgbw灯带的。我想学习编程
回复

使用道具 举报

12#
ID:387856 发表于 2021-5-4 11:35 | 只看该作者
有红外遥控 控制这个灯带的程序吗?
回复

使用道具 举报

13#
ID:99525 发表于 2022-1-15 13:16 | 只看该作者

补个头文件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  // 蓝色


#define nWs 16                // 有多少颗WS2811级联

extern unsigned long WsDat[];

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

                                                     
#endif
回复

使用道具 举报

14#
ID:317998 发表于 2022-9-5 22:56 | 只看该作者
请问各位一下:这是用什么型号单片机呀?
回复

使用道具 举报

15#
ID:917430 发表于 2022-9-11 22:37 | 只看该作者
熊乔中 发表于 2022-9-5 22:56
请问各位一下:这是用什么型号单片机呀?

应该是stm32
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表