首页 WS2812B灯带STC驱动(1)

WS2812B灯带STC驱动(1)

举报
开通vip

WS2812B灯带STC驱动(1)关于WS2812B我就不多说了,规格说明书讲的很详细。目前网上分享的2812驱动比较少,而且说明不详,使用起来不是很方便,本着共同进步的精神在这里和大家分享一下我的调试经验。MCU:STC12C5A08S2晶振:24M//经验:2812时序要求还是比较严,对传统51来说实现真的有难度,之前网上共享的STC89C52的驱动,即使真的点亮了灯带,估计也达不到我们的控制要求。因为1T的51加上24M的晶振,我在调试时也有点勉强,一次IO的翻转就要300ns。下面是灯带的驱动程序,可直接用:sbitDin =P3^2;ui...

WS2812B灯带STC驱动(1)
关于WS2812B我就不多说了,规格说明书讲的很详细。目前网上分享的2812驱动比较少,而且说明不详,使用起来不是很方便,本着共同进步的精神在这里和大家分享一下我的调试经验。MCU:STC12C5A08S2晶振:24M//经验:2812时序要求还是比较严,对传统51来说实现真的有难度,之前网上共享的STC89C52的驱动,即使真的点亮了灯带,估计也达不到我们的控制要求。因为1T的51加上24M的晶振,我在调试时也有点勉强,一次IO的翻转就要300ns。下面是灯带的驱动程序,可直接用:sbitDin =P3^2;uint8bdataLED_DAT;//可位操作的数据发送暂存变量声明sbitbit0=LED_DAT^0;//被发送的数据各位定义sbitbit1=LED_DAT^1;sbitbit2=LED_DAT^2;sbitbit3=LED_DAT^3;sbitbit4=LED_DAT^4;sbitbit5=LED_DAT^5;sbitbit6=LED_DAT^6;sbitbit7=LED_DAT^7;//复位码:低电平>50usvoidReset(){uint8i;Din=0;for(i=0;i<50;i);}  //================================================================//发送RGB数据,一个nop为40ns,刷新一次32*24*1.25us=960us//================================================================//1码高电平850ns,低电平400ns  实测863,424#defineCODE1  {Din=1;_nop_();_nop_();_nop_();_nop_();_nop_();\_nop_();_nop_();_nop_();_nop_();_nop_();\_nop_();_nop_();_nop_();_nop_();_nop_();\_nop_();_nop_();            \Din=0;_nop_();_nop_();\                }//0码高电平400ns,低电平850ns  实测343,704#defineCODE0  {Din=1;_nop_();_nop_();_nop_();_nop_();    \    Din=0;_nop_();_nop_();_nop_();_nop_();_nop_();\_nop_();_nop_();_nop_();_nop_();    \    }voidSendData(uint8*dat) //数据格式G7-G0-R7-R0-B7-B0{LED_DAT=*dat;if(bit7==1){CODE1}else{CODE0}if(bit6==1){CODE1}else{CODE0}if(bit5==1){CODE1}else{CODE0}if(bit4==1){CODE1}else{CODE0}if(bit3==1){CODE1}else{CODE0}if(bit2==1){CODE1}else{CODE0}if(bit1==1){CODE1}else{CODE0}if(bit0==1){CODE1}else{CODE0}LED_DAT=*dat;if(bit7==1){CODE1}else{CODE0}if(bit6==1){CODE1}else{CODE0}if(bit5==1){CODE1}else{CODE0}if(bit4==1){CODE1}else{CODE0}if(bit3==1){CODE1}else{CODE0}if(bit2==1){CODE1}else{CODE0}if(bit1==1){CODE1}else{CODE0}if(bit0==1){CODE1}else{CODE0}LED_DAT=*dat;if(bit7==1){CODE1}else{CODE0}if(bit6==1){CODE1}else{CODE0}if(bit5==1){CODE1}else{CODE0}if(bit4==1){CODE1}else{CODE0}if(bit3==1){CODE1}else{CODE0}if(bit2==1){CODE1}else{CODE0}if(bit1==1){CODE1}else{CODE0}if(bit0==1){CODE1}else{CODE0}}//经验:SendData的传入参数,我用的是数组uint8GRBData[32][3];分别对应32颗灯的GRB数据。这里有两点需要注意:1、别用结构体。虽然结构体看起来用起来很直观方便,但是结构体的寻址方式时间比数组长很多,哪怕你传入后用指针也不行。typedefstruct{uint8G;uint8R;uint8B;}COLOUR;2、编译方式MemoryModel只能选择Small。此时局部变量是放在0x00-0x7f的128个RAM里面执行的,速度也是最快的;选其他模式,则会放到xdata里,这样读取速度慢了,我们的时序也会变。下面是STM32的驱动(声明:这是网友给我的,用不起别找我)#include"led_register.h"#include"stm32f0xx.h"#defineLED_ON (GPIOA->BSRR=0x00000040)#defineLED_OFF (GPIOA->BSRR=0x00400000)voidLED_GPIO_Init(){RCC->AHBENR|=0x00020000;  //enabletheclockofPORTA GPIOA->MODER|=0x00001000;  //PA6outGPIOA->OTYPER&=0x00000000;  //pulloutGPIOA->OSPEEDR|=0x00003000; //highspeed 50MHZGPIOA->PUPDR |=0x00002000;  //PUPD=DOWNGPIOA->BSRR |=0x00400000;  //resetPA5}voidSend_8bits(uint8_tdat){uint8_ta;for(a=0;a<8;a){LED_ON;if(dat&0x80){asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");dat=dat<<1;LED_OFF;asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");}else{asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");dat=dat<<1;LED_OFF;asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");}}}voidSend_2811_24bits(uint8_tdat1,uint8_tdat2,uint8_tdat3){Send_8bits(dat1);Send_8bits(dat2);Send_8bits(dat3);}voidrst(){uint16_ti;LED_OFF;for(i=0;i<100;i);}
本文档为【WS2812B灯带STC驱动(1)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_833902
暂无简介~
格式:doc
大小:24KB
软件:Word
页数:11
分类:
上传时间:2022-08-29
浏览量:78