找回密码
 立即注册

QQ登录

只需一步,快速开始

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

WS2812灯珠驱动程序

[复制链接]
跳转到指定楼层
楼主
ID:474201 发表于 2019-12-3 10:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本启动方案MCU采用的是STC8 24M晶振 驱动的 需要挪用需要修改延时函数
#ifndef WS2812_Drive    //如果其他文件已经做了这个记号,那么不执行#define.
#define WS2812_Drive    //如果其他文件没有这个标记,那么就需要新做一个记号(唯一的)。

#define Pixel_Data_Num 36 //定义缓存空间一颗灯珠3个缓存一共12颗灯珠
sbit WS2812_Data=P3^2;
extern void WS2812_Init();
extern u8 xdata WS2812_Write_Buffer[Pixel_Data_Num];
extern void WS2812B_Display_Drive();
#endif


文件中的u8 和u16 u32分别如下:
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;

  1. #include "all.h"
  2. u8 xdata WS2812_Write_Buffer[Pixel_Data_Num];//调用数组
  3. void WS2812_Init()
  4. {
  5.         WS2812_Data=1;
  6. }
  7. void WS2812B_Write_Data(u8 *chr,u8 len)//驱动程序
  8. {
  9.         u8 idata i,j,k,value;
  10.         for(i=0;i<len;i++)
  11.         {
  12.                 value=*chr;
  13.                 for(j=0;j<3;j++)
  14.                 {
  15.                         switch(j)
  16.                         {
  17.                                 case 0:value=*(chr+1);break;
  18.                                 case 1:value=*(chr+0);break;
  19.                                 case 2:value=*(chr+2);break;
  20.                         }
  21.                         for(k=0;k<8;k++)
  22.                         {
  23.                                 if((value&0x80)==0x80)
  24.                                 {
  25.                                         WS2812_Data=1;
  26.                                         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  27.                                         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  28.                                         _nop_();_nop_();_nop_();_nop_();_nop_();
  29.                                         value<<=1;
  30.                                         WS2812_Data=0;
  31.                                         _nop_();
  32.                                 }
  33.                                 else
  34.                                 {
  35.                                         WS2812_Data=1;
  36.                                          _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  37.                                         WS2812_Data=0;
  38.                                         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  39.                                         value<<=1;
  40.                                 }
  41.                         }
  42.                 }
  43.                 chr+=3;
  44.         }
  45.         
  46. }
  47. void WS2812B_Display_Drive()//显示程序
  48. {
  49.         static xdata u8 count=0;
  50.         switch(count)
  51.         {
  52.                 case 0 :WS2812_Data=0;break;
  53.                 case 100 :
  54.                         EA=0;
  55.                         WS2812B_Write_Data(WS2812_Write_Buffer+1,12);
  56.                         EA=1;break;
  57.                 case 101 :WS2812_Data=1;break;
  58.         }
  59.         count++;
  60. }
复制代码

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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