找回密码
 立即注册

QQ登录

只需一步,快速开始

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

WS2811彩灯单片机驱动 谁有显示花样程序,这里是我写的一些,大家有的话也分享给我

  [复制链接]
跳转到指定楼层
楼主
急求!这是本人写的一些代码!


源程序下载:
ws2811.rar (3.52 KB, 下载次数: 278)

程序预览:
  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.         
  16. #define RCC_PAout                 RCC_AHBPeriph_GPIOB
  17. #define PORT_PAout                GPIOB
  18. #define PIN_PAout                GPIO_Pin_15

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

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

  24. #define PEN_0()                PORT_PEN->BRR = PIN_PEN
  25. #define PEN_1()                PORT_PEN->BSRR = PIN_PEN
  26.         
  27. /* 显存 */
  28. unsigned long WsDat[nWs];
  29. uint32_t WsCol[nWs];

  30. /*
  31. *********************************************************************************************************
  32. *        函 数 名: WS_Init
  33. *        功能说明: 初始化WS2811输出GPIO
  34. *        形    参:无
  35. *        返 回 值: 无
  36. *********************************************************************************************************
  37. */
  38. void WS_Init()
  39. {
  40.         GPIO_InitTypeDef  GPIO_InitStruct;        
  41.         
  42.         //端口时钟,使能
  43.         RCC_AHBPeriphClockCmd(RCC_PAout | RCC_PEN, ENABLE);

  44.         // 端口配置
  45.         GPIO_InitStruct.GPIO_Pin = PIN_PAout;                                // PIN
  46.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;                 // 推挽输出
  47.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;                // IO口速度为50MHz
  48.         GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
  49.         GPIO_Init(PORT_PAout, &GPIO_InitStruct);                                        // 根据设定参数初始化

  50.         GPIO_InitStruct.GPIO_Pin = PIN_PEN;                                // PIN
  51.         GPIO_Init(PORT_PEN, &GPIO_InitStruct);                                        // 根据设定参数初始化        
  52.                
  53.         PEN_1();
  54. }

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

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

  109. /*
  110. *********************************************************************************************************
  111. *        函 数 名: WS_Set1
  112. *        功能说明: 高速发送24Bit数据
  113. *        形    参:dat,发送的数据
  114. *        返 回 值: 无
  115. *********************************************************************************************************
  116. */
  117. void WS_SetH(unsigned long dat)
  118. {
  119.         unsigned char i;
  120.         
  121.         for(i=0; i<24; i++)
  122.         {
  123.                 if(0x800000 == (dat & 0x800000) )        TX1();
  124.                 else                                                                TX0();
  125.                 dat<<=1;                                                        //左移一位
  126.         }
  127. }

  128. /*
  129. *********************************************************************************************************
  130. *        函 数 名: WS_SetL
  131. *        功能说明: 低速发送24Bit数据
  132. *        形    参:dat,发送的数据
  133. *        返 回 值: 无
  134. *********************************************************************************************************
  135. */
  136. void WS_SetL(unsigned long dat)
  137. {
  138.         unsigned char i;
  139.         
  140.         for(i=0; i<24; i++)
  141.         {
  142.                 if(0x800000 == (dat & 0x800000) )        TXL1();
  143.                 else                                                                TXL0();
  144.                 dat<<=1;                                                        //左移一位
  145.         }
  146. }

  147. /*
  148. *********************************************************************************************************
  149. *        函 数 名: WS_SetAll
  150. *        功能说明: 发送数组内全部数据
  151. *        形    参:无
  152. *        返 回 值: 无
  153. *********************************************************************************************************
  154. */
  155. void WS_L_SetAll()
  156. {
  157.         unsigned char j;
  158.         
  159.         for (j=0; j<20; j++)
  160.         {
  161.                 //WsCol[j]  = SpiData.SpiData[j * 3]<<16 | SpiData.SpiData[j * 3 + 1]<<8 | SpiData.SpiData[j * 3 + 2];
  162.                 WsCol[j] = WsDat[j];
  163.                 WS_SetH(WsCol[j]);  // j 级联个数/ 0
  164.         }
  165.         WS_Reset();
  166. }
  167. /*
  168. *********************************************************************************************************
  169. *        函 数 名: WS_SetAll
  170. *        功能说明: 发送数组内全部数据
  171. *        形    参:无
  172. *        返 回 值: 无
  173. *********************************************************************************************************
  174. */
  175. void WS_H_SetAll()
  176. {
  177.         unsigned char j;
  178.         
  179.         for (j=0; j<nWs; j++)
  180.         {
  181.                 //WsCol[j]  = SpiData.SpiData[j * 3]<<16 | SpiData.SpiData[j * 3 + 1]<<8 | SpiData.SpiData[j * 3 + 2];
  182.                 WsCol[j] = WsDat[j];
  183.                 WS_SetH(WsCol[j]);  // j 级联个数/ 0
  184.         }
  185.         WS_Reset();
  186. }

  187. /*
  188. *********************************************************************************************************
  189. *        函 数 名: abs0
  190. *        功能说明: 求绝对值
  191. *        形    参:num,比较后的数据
  192. *        返 回 值: num,形参的绝对值
  193. *********************************************************************************************************
  194. */
  195. unsigned char abs0(int num)
  196. {
  197.         if (num>0) return num;
  198.         
  199.         num = -num;
  200.         return (unsigned char) num;
  201. }

  202. /*
  203. *********************************************************************************************************
  204. *        函 数 名: ColorToColor
  205. *        功能说明: 颜色渐变算法(正向)
  206. *        形    参:color0、color1 从一种颜色变到别一种颜色
  207. *        返 回 值: color        变化后的颜色
  208. *********************************************************************************************************
  209. */
  210. void ColorToColor(unsigned long color0, unsigned long color1)
  211. {
  212.         unsigned char Red0, Green0, Blue0;  // 起始三原色
  213.         unsigned char Red1, Green1, Blue1;  // 结果三原色
  214.         int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)
  215.         unsigned char NStep;                                                         // 需要几步
  216.         float                  RedStep, GreenStep, BlueStep;                // 各色步进值
  217.         unsigned long color;                                                        // 结果色
  218.         unsigned char i;
  219.         uint8_t Pack = 0;
  220.         
  221.         // 绿 红 蓝 三原色分解
  222.         Red0   = color0>>8;
  223.         Green0 = color0>>16;
  224.         Blue0  = color0;
  225.         
  226.         Red1   = color1>>8;
  227.         Green1 = color1>>16;
  228.         Blue1  = color1;
  229.         
  230.         // 计算需要多少步(取差值的最大值)
  231.         RedMinus   = Red1 - Red0;
  232.         GreenMinus = Green1 - Green0;
  233.         BlueMinus  = Blue1 - Blue0;
  234.         
  235.         NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
  236.         NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);
  237.         
  238.         // 计算出各色步进值
  239.         RedStep   = (float)RedMinus   / NStep;
  240.         GreenStep = (float)GreenMinus / NStep;
  241.         BlueStep  = (float)BlueMinus  / NStep;
  242.         
  243.         // 渐变开始
  244.         for (i = 0; i < NStep; i++)                        //灯点亮的个数可变
  245.         {
  246.                 Red1   = Red0   + (int)(RedStep   * i);
  247.                 Green1 = Green0 + (int)(GreenStep * i);
  248.                 Blue1  = Blue0  + (int)(BlueStep  * i);
  249.                
  250.                 color  = Green1<<16 | Red1<<8 | Blue1;         // 合成  绿红蓝
  251.                 WsDat[Pack] = color;                                        //这里只第一个灯
  252.                 WS_L_SetAll();                                                        // 输出
  253.                 delay_ms(20);                                                // 渐变速度
  254.                 if (Pack > nWs)
  255.                 {
  256.                         Pack = 0;
  257.                 }
  258.                 else
  259.                 {
  260.                         Pack++;
  261.                 }
  262.         }
  263.         // 渐变结束
  264. //        return color;
  265. }

  266. /*
  267. *********************************************************************************************************
  268. *        函 数 名: ColorToColor1
  269. *        功能说明: 颜色渐变算法        (反向)
  270. *        形    参:color0、color1 从一种颜色变到别一种颜色
  271. *        返 回 值: color        变化后的颜色
  272. *********************************************************************************************************
  273. */
  274. void ColorToColor1(unsigned long color0, unsigned long color1)
  275. {
  276.         unsigned char Red0, Green0, Blue0;  // 起始三原色
  277.         unsigned char Red1, Green1, Blue1;  // 结果三原色
  278.         int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)
  279.         unsigned char NStep;                                                         // 需要几步
  280.         float                  RedStep, GreenStep, BlueStep;                // 各色步进值
  281.         unsigned long color;                                                        // 结果色
  282.         unsigned char i;
  283.         int8_t Pack = nWs;
  284.         
  285.         // 绿 红 蓝 三原色分解
  286.         Red0   = color0>>8;
  287.         Green0 = color0>>16;
  288.         Blue0  = color0;
  289.         
  290.         Red1   = color1>>8;
  291.         Green1 = color1>>16;
  292.         Blue1  = color1;
  293.         
  294.         // 计算需要多少步(取差值的最大值)
  295.         RedMinus   = Red1 - Red0;
  296.         GreenMinus = Green1 - Green0;
  297.         BlueMinus  = Blue1 - Blue0;
  298.         
  299.         NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
  300.         NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);
  301.         
  302.         // 计算出各色步进值
  303.         RedStep   = (float)RedMinus   / NStep;
  304.         GreenStep = (float)GreenMinus / NStep;
  305.         BlueStep  = (float)BlueMinus  / NStep;
  306.         
  307.         // 渐变开始
  308.         for (i = 0; i < NStep; i++)                                //灯点亮的个数可变
  309.         {
  310.                 Red1   = Red0   + (int)(RedStep   * i);
  311.                 Green1 = Green0 + (int)(GreenStep * i);
  312.                 Blue1  = Blue0  + (int)(BlueStep  * i);
  313.                
  314.                 color  = Green1<<16 | Red1<<8 | Blue1;         // 合成  绿红蓝
  315.                 WsDat[Pack] = color;                                        //这里只第一个灯
  316.                 WS_H_SetAll();                                                        // 输出
  317.                 delay_ms(2);                                                // 渐变速度
  318.                 if (Pack > 0)
  319.                 {        
  320.                         Pack--;
  321.                 }
  322.                 else
  323.                 {
  324.                         Pack = nWs;
  325.                 }
  326.         }
  327.         
  328.         // 渐变结束
  329. //        return color;
  330. }

  331. /*
  332. *********************************************************************************************************
  333. *        函 数 名: WaterLampToCol1
  334. *        功能说明: 从前向后移动(单组)
  335. *        形    参:_uColor         点亮颜色
  336. *                          _uTime        移位速度
  337. *        返 回 值: 无
  338. *********************************************************************************************************
  339. */
  340. void WaterLampToCol1(uint32_t _uColor, uint16_t _uTime)
  341. {
  342.         uint8_t i;

  343.         
  344. //        for (i = 0; i < 3; i++)
  345. //        {
  346. //                _uColor = g_tSpi.RxBuf[0]<<16 | g_tSpi.RxBuf[1]<<8 | g_tSpi.RxBuf[2];
  347. //               
  348. //                //_uColor = _uColor + 0xfffff*i;
  349. //                WsDat[i] = _uColor;

  350. //        //        delay_ms(_uTime);
  351. //                //memset(WsDat, 0, sizeof(WsDat));
  352. //               
  353. //        }
  354.         WS_L_SetAll();
  355.         //delay_ms(_uTime);

  356. }

  357. /*
  358. *********************************************************************************************************
  359. *        函 数 名: WaterLampToCol2
  360. *        功能说明: 单组灯移位显示
  361. *        形    参:_uColor         点亮颜色
  362. *                          _uTime        移位速度
  363. *        返 回 值: 无
  364. *********************************************************************************************************
  365. */
  366. void WaterLampToCol2(uint32_t _uColor, uint16_t _uTime)
  367. {
  368.         uint8_t i, j;
  369.         uint8_t Red2, Green2, Blue2;  // 三原色
  370.         
  371.         Red2  = _uColor>>8;
  372.         Green2 = _uColor>>16;
  373.         Blue2  = _uColor;
  374.         
  375.         for (i = 0; i < nWs; i++)
  376.         {
  377.                 for (j = 0; j < i; j++)
  378.                 {
  379.                         Red2 = Red2 + 0x22;
  380.                         //Green2 = Green2 + 0x22;
  381.                         //Blue2 = Blue2 + 0x22;
  382.                         _uColor = Green2<<16 | Red2<<8 | Blue2;
  383.                         
  384.         //                _uColor = _uColor + 0xfffff*i;
  385.                         WsDat[j] = _uColor;
  386.                 }
  387.                 WS_L_SetAll();
  388.                 delay_ms(_uTime);
  389. //                memset(WsDat, 0, sizeof(WsDat));
  390.         }

  391. }

  392. /*
  393. *********************************************************************************************************
  394. *        函 数 名: WaterLampToCol5
  395. *        功能说明: 与模式2反向
  396. *        形    参:_uColor         点亮颜色
  397. *                          _uTime        移位速度
  398. *        返 回 值: 无
  399. *********************************************************************************************************
  400. */
  401. void WaterLampToCol5(uint32_t _uColor, uint16_t _uTime)
  402. {
  403.         uint8_t i, j;
  404.         uint8_t Red2, Green2, Blue2;  // 三原色
  405.         
  406.         Red2  = _uColor>>8;
  407.         Green2 = _uColor>>16;
  408.         Blue2  = _uColor;
  409.         
  410.         for (i = nWs; i > 0; i--)
  411.         {
  412.                 for (j = i; j > 0; j--)
  413.                 {
  414.                         Red2 = Red2 + 0x22;
  415.                         //Green2 = Green2 + 0x22;
  416.                         //Blue2 = Blue2 + 0x22;
  417.                         _uColor = Green2<<16 | Red2<<8 | Blue2;
  418.                         
  419.         //                _uColor = _uColor + 0xfffff*i;
  420.                         WsDat[j] = _uColor;
  421.                 }
  422.                 WS_L_SetAll();
  423.                 delay_ms(_uTime);
  424. //                memset(WsDat, 0, sizeof(WsDat));
  425.         }

  426. }

  427. /*
  428. *********************************************************************************************************
  429. *        函 数 名: WaterLampToCol3
  430. *        功能说明: 从中点向两端移动
  431. *        形    参:_uColor         点亮颜色
  432. *                          _uTime        移位速度
  433. *        返 回 值: 无
  434. *********************************************************************************************************
  435. */
  436. void WaterLampToCol3(uint32_t _uColor, uint16_t _uTime)
  437. {
  438.         uint8_t i;
  439.         
  440.         for (i = nWs/2; i < nWs; i++)
  441.         {
  442.                 _uColor = _uColor + 0xfffff*i;
  443.                 WsDat[i] = _uColor;
  444.                 WsDat[nWs/2 -(i - nWs/2)] = _uColor;
  445.                 WS_L_SetAll();
  446.                 delay_ms(_uTime);
  447.                 memset(WsDat, 0, sizeof(WsDat));
  448.         }

  449. }

  450. /*
  451. *********************************************************************************************************
  452. *        函 数 名: WaterLampToCol4
  453. *        功能说明: 从后向前移动(单组)
  454. *        形    参:_uColor         点亮颜色
  455. *                          _uTime        移位速度
  456. *        返 回 值: 无
  457. *********************************************************************************************************
  458. */
  459. void WaterLampToCol4(uint32_t _uColor, uint16_t _uTime)
  460. {
  461.         int8_t i;
  462.         
  463.         for (i = nWs-1; i >= 0; i--)
  464.         {
  465.                 _uColor = _uColor + 0xff0000*i + 0xff00*i + 0xff*i;
  466.                 WsDat[i] = _uColor;
  467.                 WS_L_SetAll();
  468.                 delay_ms(_uTime);
  469.                 memset(WsDat, 0, sizeof(WsDat));
  470.         }

  471. }

  472. /*
  473. *********************************************************************************************************
  474. *        函 数 名: WaterLampToCol6
  475. *        功能说明: 从后向前移动(跳一个)
  476. *        形    参:_uColor         点亮颜色
  477. *                          _uTime        移位速度
  478. *        返 回 值: 无
  479. *********************************************************************************************************
  480. */
  481. void WaterLampToCol6(uint32_t _uColor, uint16_t _uTime)
  482. {
  483.         uint8_t i;
  484.                
  485.         for (i = 0; i < nWs; i++)
  486.         {
  487.                 i = i + 1;
  488.                 //_uColor = _uColor + 0xfffff*i;
  489.                 WsDat[i] = _uColor;
  490.         }
  491.         WS_L_SetAll();
  492.         delay_ms(_uTime);
  493.         memset(WsDat, 0, sizeof(WsDat));
  494.         for (i = 0; i < nWs; i++)
  495.         {
  496.                 if(i != 0)
  497.                 {
  498.                         i = i + 1;
  499.                 }
  500.                 //_uColor = Color + 0xfffff*i;
  501.                 WsDat[i] = _uColor;

  502.         }
  503.         WS_L_SetAll();
  504.         delay_ms(_uTime);
  505.         memset(WsDat, 0, sizeof(WsDat));

  506. }
  507. /*
  508. *********************************************************************************************************
  509. *        函 数 名: WaterLampToCol7(可使用)
  510. *        功能说明: 从后向前移动(单组)
  511. *        形    参:_uColor0         颜色1
  512. *                         _uColor1        颜色2
  513. *                          _uTime        移位速度
  514. *        返 回 值: 无
  515. *********************************************************************************************************
  516. */
  517. void WaterLampToCol7(uint32_t _uColor0, uint32_t _uColor1, uint16_t _uTime)
  518. {
  519.         int8_t i, j, f = 0;
  520.         uint8_t NStep;  // 三原色
  521.         unsigned char Red0, Green0, Blue0;  // 起始三原色
  522.         unsigned char Red1, Green1, Blue1;  // 结果三原色
  523.         int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)                                                        // 需要几步
  524.         float                  RedStep, GreenStep, BlueStep;                // 各色步进值
  525.         
  526.         Red0   = _uColor0>>8;
  527.         Green0 = _uColor0>>16;
  528.         Blue0  = _uColor0;
  529.         
  530.         Red1   = _uColor1>>8;
  531.         Green1 = _uColor1>>16;
  532.         Blue1  = _uColor1;
  533.         
  534.         NStep = 3;
  535.                 // 计算需要多少步(取差值的最大值)
  536.         RedMinus   = Red1 - Red0;
  537.         GreenMinus = Green1 - Green0;
  538.         BlueMinus  = Blue1 - Blue0;
  539.                 // 计算出各色步进值
  540.         RedStep   = (float)RedMinus   / NStep;
  541.         GreenStep = (float)GreenMinus / NStep;
  542.         BlueStep  = (float)BlueMinus  / NStep;
  543.         
  544.         for(j = -(NStep);j < nWs; j++)
  545.         {
  546.                 for(i = 0; i < NStep; i++)
  547.                 {
  548.                         Red1   = Red0   + (int)(RedStep   * i);
  549.                         Green1 = Green0 + (int)(GreenStep * i);
  550.                         Blue1  = Blue0  + (int)(BlueStep  * i);
  551.                         WsDat[i + j] = Green1<<16 | Red1<<8 | Blue1;
  552.                 }
  553.                 WS_L_SetAll();
  554.                 delay_ms(_uTime);
  555.                 memset(WsDat, 0, sizeof(WsDat));
  556.         }

  557. }

  558. /*
  559. *********************************************************************************************************
  560. *        函 数 名: WaterLampToCol8(可用)
  561. *        功能说明: 从后向前移动(跳一个)
  562. *        形    参:_uColor         点亮颜色
  563. *                          _uTime        移位速度
  564. *        返 回 值: 无
  565. *********************************************************************************************************
  566. */
  567. void WaterLampToCol8(uint32_t _uColor0, uint16_t _uTime)
  568. {
  569.         uint8_t i;
  570.                
  571.         for (i = 3; i < nWs/2; i++)
  572.         {
  573.                 WsDat[i] = _uColor0;
  574.         }
  575.         for (i = nWs/2; i < nWs - 3; i++)
  576.         {
  577.                 WsDat[i] = 0;
  578.         }
  579.         WS_L_SetAll();
  580.         delay_ms(_uTime);
  581. }
  582. /*
  583. *********************************************************************************************************
  584. *        函 数 名: WaterLampToCol9(可用)
  585. *        功能说明: 从后向前移动(跳一个)
  586. *        形    参:_uColor         点亮颜色
  587. *                          _uTime        移位速度
  588. *        返 回 值: 无
  589. *********************************************************************************************************
  590. */
  591. void WaterLampToCol9(uint32_t _uColor0, uint16_t _uTime)
  592. {
  593.         uint8_t i;
  594.                
  595.         for (i = 3; i < nWs/2; i++)
  596.         {
  597.                 WsDat[i] = 0;
  598.         }
  599.         for (i = nWs/2; i < nWs - 3; i++)
  600.         {
  601.                 WsDat[i] = _uColor0;
  602.         }
  603.         WS_L_SetAll();
  604.         delay_ms(_uTime);
  605. }

  606. /*
  607. *********************************************************************************************************
  608. *        函 数 名: WaterLampToCol10(可用)
  609. *        功能说明: 从后向前移动(跳一个)
  610. *        形    参:_uColor         点亮颜色
  611. *                          _uTime        移位速度
  612. *        返 回 值: 无
  613. *********************************************************************************************************
  614. */
  615. void WaterLampToCol10(uint32_t _uColor0,uint32_t _uColor1, uint16_t _uTime)
  616. {
  617.         int8_t i, j;
  618.                
  619.         WsDat[1] = _uColor0;
  620.         WsDat[0] = _uColor1;
  621.         
  622.         for(i = 0;i < nWs; i++)
  623.         {
  624.                 WsDat[i + 2] = WsDat[i + 1];
  625.                 WsDat[i + 1] = WsDat[i];
  626.                 WsDat[i] = 0;
  627.                 WS_L_SetAll();
  628.                 delay_ms(_uTime);
  629.         }

  630. }

  631. /*
  632. *********************************************************************************************************
  633. *        函 数 名: WaterLampToCol11(可用)
  634. *        功能说明: 从后向前移动(跳一个)
  635. *        形    参:_uColor         点亮颜色
  636. *                          _uTime        移位速度
  637. *        返 回 值: 无
  638. *********************************************************************************************************
  639. */
  640. void WaterLampToCol11(uint32_t _uColor0,uint32_t _uColor1, uint16_t _uTime)
  641. {
  642.         int8_t i, j;
  643.                
  644.         WsDat[1] = _uColor0;
  645.         WsDat[0] = _uColor1;
  646.         WsDat[nWs - 1] = _uColor0;
  647.         WsDat[nWs - 2] = _uColor1;
  648.         for(i = 0;i < nWs ; i++)
  649.         {
  650.                 WsDat[i + 2] = WsDat[i + 1];
  651.                 WsDat[i + 1] = WsDat[i];
  652.                 WsDat[i] = 0;
  653.                 WsDat[nWs - i - 2] =WsDat[nWs - i - 1];
  654.                 WsDat[nWs - i - 1] = WsDat[nWs - 1];
  655.                 WsDat[nWs - 1] = 0;
  656.                 WS_L_SetAll();
  657.                 delay_ms(_uTime);

  658.         }
  659. }
  660. /*
  661. *********************************************************************************************************
  662. *        函 数 名: WaterLampToCol12(可用)
  663. *        功能说明: 从后向前移动(跳一个)
  664. *        形    参:_uColor         点亮颜色
  665. *                          _uTime        移位速度
  666. *        返 回 值: 无
  667. *********************************************************************************************************
  668. */
  669. void WaterLampToCol12(uint32_t _uColor0,uint32_t _uColor1, uint16_t _uTime)
  670. {
  671.         unsigned char Red0, Green0, Blue0;  // 起始三原色
  672.         unsigned char Red1, Green1, Blue1;  // 结果三原色
  673.         unsigned char Red2, Green2, Blue2;  // 结果三原色
  674.         int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)
  675.         unsigned char NStep;                                                         // 需要几步
  676.         float                  RedStep, GreenStep, BlueStep;                // 各色步进值
  677.         unsigned long color;                                                        // 结果色
  678.         unsigned char i, j;
  679.         int8_t Pack = nWs;
  680.         for(j = 0; j < 20 ;j++)
  681.         {        
  682.                 // 绿 红 蓝 三原色分解
  683.                 Red0   = _uColor0>>8;
  684.                 Green0 = _uColor0>>16;
  685.                 Blue0  = _uColor0;

  686.                 Red1   = _uColor1>>8;
  687.                 Green1 = _uColor1>>16;
  688.                 Blue1  = _uColor1;
  689.         

  690.         // 计算需要多少步(取差值的最大值)
  691.                 RedMinus   = Red1 - Red0;
  692.                 GreenMinus = Green1 - Green0;
  693.                 BlueMinus  = Blue1 - Blue0;

  694.                 NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
  695.                 NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);

  696.                 // 计算出各色步进值
  697.                 RedStep   = (float)RedMinus   / NStep;
  698.                 GreenStep = (float)GreenMinus / NStep;
  699.                 BlueStep  = (float)BlueMinus  / NStep;

  700.                 WsDat[j-1] = 0 ;
  701.                 for(i = 0; i < NStep; i++)
  702.                 {
  703.                         Red2   = Red0   + (int)(RedStep   * i);
  704.                         Green2 = Green0 + (int)(GreenStep * i);
  705.                         Blue2  = Blue0  + (int)(BlueStep  * i);
  706.                         color  = Green2<<16 | Red2<<8 | Blue2;          // 合成  绿红蓝
  707.                         WsDat[j+1] = color ;
  708.                         WS_L_SetAll();
  709.                         delay_ms(_uTime);
  710.                 }
  711.                 for(i = 0; i < NStep; i++)
  712.                 {
  713.                         Red2   = Red1   - (int)(RedStep   * i);
  714.                         Green2 = Green1 - (int)(GreenStep * i);
  715.                         Blue2  = Blue1  - (int)(BlueStep  * i);
  716.                         color  = Green2<<16 | Red2<<8 | Blue2;          // 合成  绿红蓝
  717.                         WsDat[j] = color ;
  718.                         WS_L_SetAll();
  719.                         delay_ms(_uTime);
  720.                 }
  721.         }
  722. }
复制代码


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

使用道具 举报

沙发
ID:167258 发表于 2017-2-28 21:28 | 只看该作者
楼主好厉害!我正在用STC的单品驱动一个新买的2811灯串,,发现网上WS2811资料参数不一致,,高速和低速的时序时间不知道哪个是正确的,,请教楼主低速0码T0H=1uS,T0L=4uS和1码T0H=4uS,T0L=1uS是否正确?谢谢!
回复

使用道具 举报

板凳
ID:154092 发表于 2017-3-29 12:36 | 只看该作者
太好了 感謝分享
回复

使用道具 举报

地板
ID:189130 发表于 2017-4-13 11:46 | 只看该作者
感謝分享,受益良多
回复

使用道具 举报

5#
ID:190215 发表于 2017-4-16 21:51 来自手机 | 只看该作者
我想问下   楼主用的高速低速模式  晶振的频率多少? 望指教。
回复

使用道具 举报

6#
ID:190215 发表于 2017-4-16 22:03 来自手机 | 只看该作者
顺流而下 发表于 2017-2-28 21:28
楼主好厉害!我正在用STC的单品驱动一个新买的2811灯串,,发现网上WS2811资料参数不一致,,高速和低速的 ...

高速 0.25 1   低速0.5 2,51单片机 24M晶振也只能工作在低速模式,ws2811低速模式时,set针脚与Vdd相连
回复

使用道具 举报

7#
ID:193340 发表于 2017-4-25 11:23 来自手机 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

8#
ID:218816 发表于 2017-7-11 15:02 | 只看该作者
谢谢分享,太复杂啦
回复

使用道具 举报

9#
ID:58240 发表于 2017-11-25 20:46 | 只看该作者
谢谢                  
回复

使用道具 举报

10#
ID:289056 发表于 2018-3-8 10:19 | 只看该作者
正在学习中,谢谢楼主分享
回复

使用道具 举报

11#
ID:318462 发表于 2018-4-28 15:33 | 只看该作者
很赞!有需要,请您加我46196428
回复

使用道具 举报

12#
ID:336232 发表于 2018-7-12 17:56 | 只看该作者
+0x22是什么意思啊
回复

使用道具 举报

13#
ID:466800 发表于 2019-1-12 06:09 | 只看该作者
不错,刚好学习了
回复

使用道具 举报

14#
ID:240034 发表于 2019-1-12 17:30 | 只看该作者
300多种怎样得来?
回复

使用道具 举报

15#
ID:69115 发表于 2019-4-6 15:27 | 只看该作者
谢谢楼主,51能用的吗?
回复

使用道具 举报

16#
ID:516904 发表于 2019-4-23 16:21 | 只看该作者
楼主,你写的驱动代码适合51单片机使用么,谢谢!
回复

使用道具 举报

17#
ID:354288 发表于 2019-11-16 15:01 | 只看该作者
不错,
回复

使用道具 举报

18#
ID:785551 发表于 2020-8-28 14:34 | 只看该作者
要支持一下,新手
回复

使用道具 举报

19#
ID:474670 发表于 2020-8-28 16:23 | 只看该作者
在坛子里好好好找找,前些天刚有人分享过程序
回复

使用道具 举报

20#
ID:97023 发表于 2022-7-23 18:09 | 只看该作者
缺:includes.h
回复

使用道具 举报

21#
ID:63317 发表于 2022-7-24 06:45 | 只看该作者
用STC15W204S-8能实现吗
回复

使用道具 举报

22#
ID:99525 发表于 2022-7-27 11:47 | 只看该作者
坛子里2811、2812代码非常多,用的库和函数都不同,需要自己修改!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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