STC15单片机驱动WS2812

来源:互联网 发布:家装erp软件 编辑:程序博客网 时间:2024/06/06 00:28

今夜无眠,写此博客吐舌头

我们先来看时序图!



#include <STC15F2K60S2.H>#include "intrins.h"sbit WS2812 = P1^7;#define numLEDs 8   //灯的个数unsigned char buf_R[numLEDs] = {0};//颜色缓存unsigned char buf_G[numLEDs] = {0};unsigned char buf_B[numLEDs] = {0};void RGB_Set_Up();  //送0码void RGB_Set_Down(); //送1码void HAL_Delay(unsigned int t){unsigned int x,y;  for(x=114;x>0;x--)  for(y=t;y>0;y--);} //复位延时void Delay50us()//@22.1184MHz{unsigned char i, j;_nop_();_nop_();i = 2;j = 15;do{while (--j);} while (--i);}//1码,高电平850ns 低电平400ns 误差正负150nsvoid RGB_Set_Up(){WS2812 = 1;  //经过逻辑分析仪调试的的延时_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); WS2812 = 0;}//1码,高电平400ns 低电平850ns 误差正负150nsvoid RGB_Set_Down(){WS2812 = 1;  //经过逻辑分析仪调试的的延时_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();  WS2812 = 0;}//发送24位数据void Send_2811_24bits(unsigned char G8,unsigned char R8,unsigned char B8){    unsigned int n = 0;  //发送G8位for(n=0;n<8;n++){G8<<=n;if(G8&0x80 == 0x80){RGB_Set_Up();}else  {  RGB_Set_Down();}}//发送R8位for(n=0;n<8;n++){R8<<=n;if(R8&0x80 == 0x80){RGB_Set_Up();}else  {RGB_Set_Down();}}//发送B8位  for(n=0;n<8;n++){B8<<=n;if(B8&0x80 == 0x80){RGB_Set_Up();}else  {  RGB_Set_Down();}}}//复位码void RGB_Rst(){WS2812 = 0;Delay50us();}//把24位数据GRB码转RGBvoid Set_Colour(unsigned char r,unsigned char g,unsigned char b){  unsigned char i;for(i=0;i<numLEDs;i++)  {buf_R[i] = r; //缓冲  buf_G[i] = g;  buf_B[i] = b;}for(i=0;i<numLEDs;i++){Send_2811_24bits(buf_G[i],buf_R[i],buf_B[i]);//发送显示}}//某一个点显示的颜色void SetPointColour(unsigned int num,unsigned char r,unsigned char g,unsigned char b){  unsigned char i;for(i=0;i<numLEDs;i++)  {buf_R[num] = r;//缓冲  buf_G[num] = g;  buf_B[num] = b;}for(i=0;i<numLEDs;i++){Send_2811_24bits(buf_G[i],buf_R[i],buf_B[i]);//发送显示}}//颜色交换24位不拆分发void SetPixelColor(unsigned char num,unsigned long c){  unsigned char i;for(i=0;i<numLEDs;i++)  {buf_R[num] = (unsigned char)(c>>16);  buf_G[num] = (unsigned char)(c>>8);  buf_B[num] = (unsigned char)(c);}for(i=0;i<numLEDs;i++){Send_2811_24bits(buf_G[i],buf_R[i],buf_B[i]);}}//复位void PixelUpdate(){RGB_Rst();}//颜色unsigned long Color(unsigned char r, unsigned char g, unsigned char b){  return ((unsigned long)r << 16) | ((unsigned long)g <<  8) | b;}//颜色算法unsigned long Wheel(unsigned char WheelPos){  WheelPos = 255 - WheelPos;  if(WheelPos < 85) {    return Color(255 - WheelPos * 3, 0, WheelPos * 3);  }  if(WheelPos < 170) {    WheelPos -= 85;    return Color(0, WheelPos * 3, 255 - WheelPos * 3);  }  WheelPos -= 170;  return Color(WheelPos * 3, 255 - WheelPos * 3, 0);}//彩虹void rainbow(unsigned int wait){  unsigned int i, j;  for(j=0; j<256; j++) {    for(i=0; i<numLEDs; i++){      SetPixelColor(i, Wheel((i+j) & 255));    }PixelUpdate();    HAL_Delay(wait);  }}//稍微不同的是,这使得彩虹均匀分布void rainbowCycle(unsigned int wait) {  unsigned int i, j;  for(j=0;j<256*5;j++) { // 5 cycles of all colors on wheel  车轮上所有颜色的5个循环    for(i=0;i<numLEDs;i++)  {     SetPixelColor(i, Wheel(((i * 256 / numLEDs) + j) & 255));    }  PixelUpdate();    HAL_Delay (wait);  }}//Theatre-style crawling lights.呼吸灯void theaterChase(unsigned long c, unsigned int wait) {int j,q;unsigned int i;  for (j=0; j<10; j++) {  //do 10 cycles of chasing  做10个循环    for (q=0; q < 3; q++) {      for (i=0; i<numLEDs; i=i+3){        SetPixelColor(i+q, c);    //turn every third pixel on  把每一个第三个像素      }PixelUpdate();      HAL_Delay(wait);      for (i=0; i<numLEDs; i=i+3) {       SetPixelColor(i+q, 0);        //turn every third pixel off   把每一个第三个像素关掉      }PixelUpdate();    }  }}//Theatre-style crawling lights with rainbow effect//带有彩虹效果的戏剧式爬行灯void theaterChaseRainbow(unsigned int wait) {int j,q;unsigned int i;  for (j=0; j < 256; j++) {     // cycle all 256 colors in the wheel 在轮子上循环所有256色    for (q=0; q < 3; q++){      for (i=0; i < numLEDs; i=i+3) {        SetPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel off 把每一个第三个像素      }      PixelUpdate();      HAL_Delay(wait);      for (i=0; i < numLEDs; i=i+3){        SetPixelColor(i+q, 0);        //turn every third pixel off  把每一个第三个像素关掉      }    }  }}// Fill the dots one after the other with a color//用一种颜色填充这些圆点void colorWipe(unsigned long c, unsigned int wait) {unsigned int i=0;  for( i=0; i<numLEDs; i++) {    SetPixelColor(i, c);    PixelUpdate();    HAL_Delay(wait);  }}void main(){  while(1){  rainbow(45);        rainbowCycle(40);        theaterChase(Color(0,0,255),80); // Blue  theaterChase(Color(0,255,0),80); // Blue  theaterChase(Color(255,0,0),80); // Blue    theaterChaseRainbow(40);colorWipe(255,255);}}
以上是全部代码



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一晚上卫生巾都是满的怎么办 宝宝头上痱子痒怎么办 短裤里的宽松紧带拧了怎么办 肉色内衣被染黑色了怎么办 安全裤总往上缩怎么办 夏天穿裙子膝盖怕凉怎么办 夏天穿裙子膝盖冷怎么办 天凉嗓子痒咳嗽怎么办 棉服里面跑毛怎么办 棉衣里面的棉一块一块的怎么办 穿姨妈巾悟出痱子怎么办 穿裙子上衣太长了怎么办 微信封号了零钱怎么办 快递加盟商欠我工资怎么办 加盟费交了以后怎么办 加盟总部违约加盟商该怎么办 自行车锁钥匙丢了怎么办 假体隆胸肿胀痛怎么办 恶露60天不干净怎么办 剖腹产俩月恶露不干净怎么办 剖腹产恶露一个多月还没干净怎么办 小月子全身流虚汗怎么办 生完孩子严重便秘怎么办啊 产后第5天恶露少怎么办 有恶露排不出来怎么办 刚生完小孩便秘怎么办 产后15天有鲜血怎么办 恶露未净同房了怎么办 药流2月恶露不尽怎么办 生完孩子小腹痛怎么办 月子里恶露有异味怎么办 恶露干净了有异味怎么办 顺产后恶露白色异味怎么办 产妇排出的恶露有异味怎么办 恶露有股腥臭味怎么办 生完孩子下面有异味怎么办 销售货物开票税率错了怎么办 8h床垫有橡胶味怎么办 买回来的鞋子臭怎么办 耐克保修卡没了怎么办 雅萌保修卡没了怎么办