找回密码
 立即注册
查看: 782|回复: 1

STC8单片机ws2812b驱动程序

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2023-12-18 15:13:58

4

主题

216

回帖

886

积分

高级会员

积分
886
发表于 2024-3-14 10:14:44 | 显示全部楼层 |阅读模式
本帖最后由 STC芯 于 2024-3-14 10:15 编辑

看见X宝 卖的ws2812灯带觉得挺好玩,闲来无事买了一条1米60灯的。自己写了个驱动 :
功能 1 .灯全亮(可调7色),2.流水灯(可调7色),3 .灯全亮闪烁(可调7色)
制作出来的实物图如下:
183253l0ib0jtazd7qdbmb.jpg

183243gf5h9nuffzfdulfb.jpg

183227uuzlmjqsm3tqulq3.jpg

单片机源部分程序如下:

  • #include <ws2812b.h>
  • bit BUS_1MS ;
  • u8 RR=0XFE;
  • u8 GG=0XFE;
  • u8 BB=0XFE;
  • u8 mode;
  • u8 Loop_Speed=120; //流水灯延时变量
  • unsigned char bdata LED_DAT; //可位操作的数据发送缓存变量
  • sbit bit0=LED_DAT^0; //被发送数据的各位定义
  • sbit bit1=LED_DAT^1;
  • sbit bit2=LED_DAT^2;
  • sbit bit3=LED_DAT^3;
  • sbit bit4=LED_DAT^4;
  • sbit bit5=LED_DAT^5;
  • sbit bit6=LED_DAT^6;
  • sbit bit7=LED_DAT^7;
  • /******************IO口初始化*************************/
  • /* 功能 : 设置P1 P2 P3 口为双向IO口*/
  • void IO_init(void)
  • {
  •     P1M1 = 0;   P1M0 = 0;   //设置为准双向口
  •     P3M1 = 0;   P3M0 = 0;   //设置为准双向口
  •     P5M1 = 0;   P5M0 = 0;   //设置为准双向口
  • }
  • /*****************************************************/
  • void Timer0Init(void)                //1毫秒@24.000MHz
  • {
  •         AUXR |= 0x80;                //定时器时钟1T模式
  •         TMOD &= 0xF0;                //设置定时器模式
  •         TL0 = 0x40;                //设置定时初始值
  •         TH0 = 0xA2;                //设置定时初始值
  •         TF0 = 0;                //清除TF0标志
  •         TR0 = 1;                //定时器0开始计时
  •         ET0 = 1;    //打开定时器0
  •         EA =1 ;     //打开总中断
  • }
  • void timer0() interrupt 1 //1毫秒@24.000MHz
  • {
  •         BUS_1MS = 1;
  • }
  • //*******************发送数据**********************//
  • //数据格式G7-G0;R7-R0;B7-B0;//
  • void SendData(u8 dat)
  • {
  •         LED_DAT = dat;
  •         if(bit7==1){CODE_1} else{CODE_0}
  •         if(bit6==1){CODE_1} else{CODE_0}
  •         if(bit5==1){CODE_1} else{CODE_0}
  •         if(bit4==1){CODE_1} else{CODE_0}
  •         if(bit3==1){CODE_1} else{CODE_0}
  •         if(bit3==1){CODE_1} else{CODE_0}
  •         if(bit1==1){CODE_1} else{CODE_0}
  •         if(bit0==1){CODE_1} else{CODE_0}
  • }
  • /******************流水灯函数******************************/
  • /* 功能 : 流水灯函数 */
  • void loop_LED()
  • {
  • unsigned char i,j,k;
  •         if(++k>=Loop_Speed)
  •         {
  •                 k=0;
  •                 if(++j<=60)
  •                 {
  •                         for(i=j;i>0;i--)  //关闭所有灯
  •                         {
  •                                 SendData(0x00);
  •                                 SendData(0x00);
  •                                 SendData(0x00);
  •                         }
  •                                 SendData(RR);
  •                                 SendData(GG);
  •                                 SendData(BB);
  •                 }
  •                 if(j==60) j=0;
  •         }
  • }
  • /******************七彩全亮闪烁模式函数******************************/
  • /* 功能 :全部LED 间隔50毫秒闪烁 */
  • void twinkle_LED()
  • {
  • unsigned char j,k;
  •         k++;
  •         if(k>100) k=0;
  •         if(k==0)//Loop_Speed)
  •         {
  •                 for(j=0;j<60;j++)
  •                 {
  •                         SendData(RR);
  •                         SendData(GG);
  •                         SendData(BB);
  •                 }
  •         }
  •         if(k==50)//Loop_Speed)
  •         {
  •                 for(j=0;j<60;j++)
  •                 {
  •                         SendData(0x00);
  •                         SendData(0x00);
  •                         SendData(0x00);
  •                 }
  •         }
  • }
  • /******************七彩全亮模式函数******************************/
  • /* 功能 : 点亮60颗LED */
  • void ON_LED()
  • {
  • unsigned char j,k;
  • if(++k>=100)
  • {
  •          k=0;
  •                 for(j=0;j<60;j++)
  •                 {
  •                         SendData(RR);
  •                         SendData(GG);
  •                         SendData(BB);
  •                 }
  •         }
  • }
  • /******************七彩全灭模式函数******************************/
  • /* 功能 :关闭全部LED  */
  • void OFF_LED()
  • {
  • unsigned char j,k;
  • if(++k>=250)
  • {
  •          k=0;
  •                 for(j=0;j<250;j++)
  •                 {
  •                         SendData(0x00);
  •                         SendData(0x00);
  •                         SendData(0x00);
  •                 }
  •         }
  • }
  • /******************按键扫描******************************/
  • /* 功能 : 设置S6按键长短按识别小于20MS短按 长于3S长按 */
  • void keyScan()
  •         {
  •                 static unsigned char i;
  •     static unsigned int key_press_time = 0;  // ……请记得标为静态变量
  •                 static unsigned int key_press_time2 = 0;  // ……请记得标为静态变量
  •     if(s6==0)
  •                         {
  •         if(++key_press_time <=0 ) --key_press_time;//计量按键时间,并避免数据溢出
  •         if(key_press_time==3000)
  •                                 {
  •             //在此写下按键长按3s时要做的事情
  •                                         LED2_REV();
  •                                 Loop_Speed=        Loop_Speed-15;
  •                                 }
  •                         }
  •                         else
  •                         {
  •         if(10<=key_press_time && key_press_time < 3000)
  •                                 {
  •             //大于20ms小于3s,视为短按,在此写下写短按的处理代码
  •                                         LED1_REV();
  •                                         i++;
  •                                         switch(i)  //s6按键LED7色控制
  •                                         {
  •                                                 case 0 : {RR=0X00;GG=0X00;BB=0XFE; break;}
  •                                                 case 1 : {RR=0X00;GG=0XFE;BB=0X00; break;}
  •                                                 case 2 : {RR=0XFE;GG=0X00;BB=0X00; break;}
  •                                                 case 3 : {RR=0XFE;GG=0XFE;BB=0X00; break;}
  •                                                 case 4 : {RR=0X00;GG=0XFE;BB=0XFE; break;}
  •                                                 case 5 : {RR=0XFE;GG=0X00;BB=0XFE; break;}
  •                                                 case 6 : {RR=0XFE;GG=0XFE;BB=0XFE; break;}
  •                                                 case 7 : {i=0;                                                                                 break;}
  •                                         }
  •         }
  •         key_press_time=0;
  •                         }
  •                         if(s2==0)
  •                         {
  •         if(++key_press_time2 <=0 ) --key_press_time2;//计量按键时间,并避免数据溢出
  •         if(key_press_time2==3000)
  •                                 {
  •             //在此写下按键长按3s时要做的事情
  •                                         LED2_REV();
  •                                 }


代码: ws2812b驱动.7z (24.66 KB, 下载次数: 90)


回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:176
  • 最近打卡:2025-02-19 17:24:49

15

主题

265

回帖

1387

积分

金牌会员

积分
1387
发表于 2024-8-9 10:23:20 | 显示全部楼层
if(bit7==1){CODE_1} else{CODE_0}这是啥意思?
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 00:08 , Processed in 0.120536 second(s), 56 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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