月光如盐 发表于 2024-3-14 10:14:44

STC8单片机ws2812b驱动程序

本帖最后由 STC芯 于 2024-3-14 10:15 编辑

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






单片机源部分程序如下:


[*]#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();
[*]
[*]                              }


代码:


liuzonggong 发表于 2024-8-9 10:23:20

if(bit7==1){CODE_1} else{CODE_0}这是啥意思?
页: [1]
查看完整版本: STC8单片机ws2812b驱动程序