1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > STC8G1K08A 驱动WS2812 (RGB 内置IC)亲测可行

STC8G1K08A 驱动WS2812 (RGB 内置IC)亲测可行

时间:2023-03-01 03:52:29

相关推荐

STC8G1K08A 驱动WS2812 (RGB 内置IC)亲测可行

原文件

#include <STC15W401AS.h>

#include <stdio.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define channle_num 4

#define cycle 200 //周期

#define LVD_VECTOR 6

#define SNUM 36

#define HALF 18

#define MOVENUM 8

#define GREEN 0

#define RED 1

#define BLUE 2

sbit S1=P5^5;

sbit S2=P3^3;

#define RGB_H S1=1

#define RGB_L S1=0

//9种颜色数据

code unsigned char colorArr1[9][3]={{0,255,0},{97,255,0},{255,255,0},{255,0,0}

,{0,0,255},{46,8,84},{32,160,240},{255,255,255},{0,255,255}};

9种颜色数据

code unsigned char colorArr[9][3]={{0,0,0},{120,255,0},{120,255,0},{42,238,27}

,{234,251,38},{35,218,3},{64,24,114},{250,18,20},{120,255,0}};

定义一个二维,每个括号内的三个数据对应一个像素点

16像素点的数组,每个像素点的颜色由3个字节绝对{绿,红,蓝}

unsigned char s[36][3]={{50,5,5},{5,50,5},{5,5,50},{50,5,5},{5,50,5},{5,5,50},{50,5,5},{5,50,5},{50,5,5},{50,5,5},

{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},

{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},

{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5}};

//unsigned char s[8][3]={{50,5,5},{5,50,5},{5,5,50},{50,5,5},{5,50,5},{5,5,50},

// {50,5,5},{5,50,5}}; //定义一个二维,每个括号内的三个数据对应一个像素点{G,R,B}

//定义两个消减比

code unsigned char cut[8]={6,2,1,0,0,1,2,6};

code unsigned char cut2[8]={0,0,0,0,0,0,0,0};

//定义一个拖尾数组

unsigned char tail[8][3]={{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5},{50,5,5}};

unsigned char k;

char i;

unsigned char j=0;

unsigned char color=0; //控制显示颜色

uint cnt=0;

uint PWM_cnt1 = 0;

uchar buf[3];

unsigned char PWM_cnt,hight;

float HSV[3] = {0,0,0};

//extern uchar Read_IAP_Byte(uint addr);

//extern void Write_IAP_Byte(uint addr, uchar writeVal);

//extern void Erase_IAP_Sector(uint addr);

typedef struct flag

{

uchar F1:1 ; //key_timer_cnt1 标志位

uchar F2:1 ; //key_timer_cnt2 标志位

uchar F3:1 ; //PWM 计数器 标志位

uchar F4:1 ;

uchar F5:1 ;

uchar F6:1 ;

uchar F7:1 ;

uchar F8:1 ;

}Flag;

Flag num;

void Delay1ms() //@24.000MHz

{

unsigned char i, j;

_nop_();i = 32;j = 40;do{while (--j);} while (--i);

}

void Delay1msN(unsigned char i)

{

while(i–)

{

Delay1ms();

}

}

void Delay10ms() //@24.000MHz

{

unsigned char i, j, k;

i = 2;j = 56;k = 172;do{do{while (--k);} while (--j);} while (--i);

}

void Delay15ms() //@24.000MHz

{

unsigned char i, j, k;

i = 2;j = 212;k = 132;do{do{while (--k);} while (--j);} while (--i);

}

void Delay20ms() //@24.000MHz

{

unsigned char i, j, k;

_nop_();i = 3;j = 112;k = 91;do{do{while (--k);} while (--j);} while (--i);

}

void Delay30ms() //@24.000MHz

{

unsigned char i, j, k;

_nop_();_nop_();i = 4;j = 168;k = 10;do{do{while (--k);} while (--j);} while (--i);

}

void Delay50ms() //@24.000MHz

{

unsigned char i, j, k;

_nop_();i = 7;j = 23;k = 105;do{do{while (--k);} while (--j);} while (--i);

}

void Delay60ms() //@24.000MHz

{

unsigned char i, j, k;

_nop_();_nop_();i = 8;j = 79;k = 24;do{do{while (--k);} while (--j);} while (--i);

}

void Delay100ms() //@24.000MHz

{

unsigned char i, j, k;

_nop_();_nop_();i = 13;j = 45;k = 214;do{do{while (--k);} while (--j);} while (--i);

}

void test()

{

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

}

void Delay200ms() //@24.000MHz

{

unsigned char i, j, k;

_nop_();_nop_();i = 25;j = 90;k = 176;do{do{while (--k);} while (--j);} while (--i);

}

//-------------------------------------------------------------------------------

//子程序名称:ResetDateFlow(void)

//功能:复位,为下一次发送做准备,

//说明:将DI置位为0后,延时约65us

//-------------------------------------------------------------------------------

void ResetDataFlow(void)

{

unsigned char i, j;

_nop_();i = 2;j = 140;do{while (--j);} while (--i);

}

//-------------------------------------------------------------------------------

//子程序名称:SendOnePix(unsigned char *ptr)

//功能:发送一个像素点的24bit数据

//参数:接收的参数是一个指针,此函数会将此指针指向的地址的连续的三个Byte的数据发送

//说明:在主函数中直接调用此函数时,在整个帧发送开始前需要先执行 ResetDataFlow()

// 数据是按归零码的方式发送,速率为800KBPS

//-------------------------------------------------------------------------------

void SendOnePix(unsigned char *ptr)

{

unsigned char i,j;

unsigned char temp;

for(j=0;j<3;j++){temp=ptr[j];for(i=0;i<8;i++){if(temp&0x80) //从高位开始发送{RGB_H; //发送“1”码_nop_(); //不可省略的nop(),延时指定时间作用,晶振频率24MHz_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

//nop();

//nop();

//nop();

//nop();

//nop();

//nop();

//nop();

//nop();

//nop();

//nop();

RGB_L;}else//发送“0”码{RGB_H;_nop_();_nop_();_nop_();_nop_();_nop_();

//nop();

RGB_L;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

//nop();

//nop();

//nop();

//nop();

//nop();

//nop();

//nop();

//nop();

//nop();

//nop();

}

temp=(temp<<1); //左移位

}

}

}

//-------------------------------------------------------------------------------

//子程序名称:SendOneFrame(unsigned char *ptr)

//功能:发送一帧数据(即发送整个数组的数据)

//参数:接收的参数是一个指针,此函数会将此指针指向的地址的整个数组的数据发送

//-------------------------------------------------------------------------------

void SendOneFrame(unsigned char *ptr)

{

unsigned char k;

ResetDataFlow(); //发送帧复位信号for(k=0;k<SNUM;k++) //发送一帧数据,SNUM是板子LED的个数{SendOnePix(&ptr[(3*k)]);}ResetDataFlow(); //发送帧复位信号

}

//-------------------------------------------------------------------------------

//子程序名称:SendSameColor(unsigned char *ptr,unsigned char cnt)

//功能:相同颜色的点发送cnt次

//参数:接收的参数是一个指针,指向像素点颜色数组,cnt传递发送个数

//-------------------------------------------------------------------------------

void SendSameColor(unsigned char *ptr,unsigned char cnt)

{

unsigned char k;

ResetDataFlow(); //发送帧复位信号for(k=0;k<cnt;k++) //发送一帧数据,SNUM是板子LED的个数{SendOnePix(&ptr[0]);}ResetDataFlow(); //发送帧复位信号

}

//-------------------------------------------------------------------------------

//子程序名称:SendOneFrameFrom(unsigned char i,unsigned char *ptr)

//功能:从指定的像素点开始发送一帧数据(即发送整个数组的数据)

//参数:接收的参数是一个指针,此函数会将此指针指向的地址的整帧数据发送

// i:把数组的第0个像素数据发送到第i个像素点(第0个像素是板上标号为01的像素)

//说明:即原本对应第一个像素的数据会发送到第i个像素点(LED)上

//-------------------------------------------------------------------------------

void SendOneFrameFrom(unsigned char i,unsigned char *ptr)

{

unsigned char k;

ResetDataFlow(); //发送帧复位信号for(k=(SNUM-i);k<SNUM;k++) //发送一帧数据{SendOnePix(&ptr[(3*k)]);}for(k=0;k<(SNUM-i);k++){SendOnePix(&ptr[(3*k)]);}ResetDataFlow(); //发送帧复位信号

}

//-------------------------------------------------------------------------------

//子程序名称:SendOneFrameSince(unsigned char i,unsigned char *ptr)

//功能:从第i个像素点的数据开始发送一帧数据(即发送整个数组的数据)

//参数:接收的参数是一个指针,此函数会将此指针指向的地址的整帧数据发送

// i:把数组的第i个像素数据发送到第1个像素点

//说明:即原本对应第i像素的数据会发送到第1个像素点(LED)上,第i+1个像素点的数据

// 发送到第2个像素上

//-------------------------------------------------------------------------------

void SendOneFrameSince(unsigned char i,unsigned char *ptr)

{

unsigned char k;

ResetDataFlow(); //发送帧复位信号for(k=i;k<SNUM;k++) //发送一帧数据{SendOnePix(&ptr[(3*k)]);}for(k=0;k<i;k++){SendOnePix(&ptr[(3*k)]);}ResetDataFlow(); //发送帧复位信号

}

/THE END/

void Timer0Init(void) //10U秒@24.000MHz

{

AUXR |= 0x80; //定时器时钟1T模式

TMOD &= 0xF0; //设置定时器模式

TL0 = 0xFE; //设置定时初值

TH0 = 0xFF; //设置定时初值

TF0 = 0; //清除TF0标志

TR0 = 1; //定时器0开始计时

ET0 = 1; //使能定时器0中断

EA = 1;

}

void init()

{

P3M1 = 0xFF;//0x11110011;

P3M0 = 0x00;//0x00001100;

P5M1 = 0x80;

P5M0 = 0x80;

//CLK_DIV |= 0x00;

cnt = 0;

F1 = 0;

S1=0;

S2=0;

P5 = 0xFF;

}

/左到右流水***/

void left_rightrun()

{

//先让所有LED灭for(i=0;i<SNUM;i++){s[i][0]=0; s[i][1]=0;s[i][2]=0;}SendOneFrame(s);Delay100ms();//循环修改数组数据,然后显示for(i=0;i<SNUM;i++){s[i][0]=colorArr[1][0];s[i][1]=colorArr[1][1];s[i][2]=colorArr[1][2];SendOneFrame(s);Delay30ms();}

}

/右到左流水***/

void right_leftrun()

{

//先让所有LED亮

// for(i=0;i<SNUM;i++)

// {

// s[i][0]=255;

// s[i][1]=255;

// s[i][2]=255;

// }

// SendOneFrame(s);

// Delay100ms();

//循环修改数组数据,然后显示

for(i=35;i>0;i–)

{

s[i][0]=0;

s[i][1]=0;

s[i][2]=0;

SendOneFrame(s);Delay30ms();}

}

/两边到中间点亮***/

void l_r_md()

{

for(i=0;i<HALF;i++)

{

s[i][0]=colorArr[1][0];

s[i][1]=colorArr[1][1];

s[i][2]=colorArr[1][2];

s[35-i][0]=colorArr[1][0];

s[35-i][1]=colorArr[1][1];

s[35-i][2]=colorArr[1][2];

SendOneFrame(s);

Delay30ms();

}

}

/中间到两边变暗***/

void md_l_r()

{

for(i=HALF-1;i>-1;i–)

{

s[i][0]=0;

s[i][1]=0;

s[i][2]=0;

s[35-i][0]=0;

s[35-i][1]=0;

s[35-i][2]=0;

SendOneFrame(s);

Delay30ms();

}

}

/呼吸***/

void breathing()

{

unsigned char time = 125;for(i=0;i<SNUM;i++){s[i][0]=8; s[i][1]=17;s[i][2]=0;}SendOneFrame(s);

for(k=0;k<2;k++)

{

for(j=0;j<14;j++)

{

for(i=0;i<SNUM;i++)

{

s[i][0]+=8;

s[i][1]+=17;

// s[i][2]+=2;

}SendOneFrame(s);Delay1msN(time);time-=3;}

for(j=0;j<14;j++)

{

for(i=0;i<SNUM;i++)

{

s[i][0]-=8;

s[i][1]-=17;

// s[i][2]-=2;

}SendOneFrame(s);Delay1msN(time);time+=3;}

}

/满功率8-9W****1.4W182+8************/

//for(j=0;j<4;j++)

// {

// for(i=0;i<SNUM;i++)

// {

// s[i][0]+=8;

// s[i][1]+=17;

s[i][2]+=2;

//

//

// }

// SendOneFrame(s);

// Delay1msN(120);

// }

}

void breathing1()

{

//循环修改数组数据,然后显示

for(i=0;i<SNUM;i++)

{

s[i][0]=0;

s[i][1]=0;

s[i][2]=0;

SendOneFrame(s);}

for(k=0;k<3;k++)

{

for(i=17;i>-1;i–)

{

s[i][0]=colorArr[1][0];

s[i][1]=colorArr[1][1];

s[i][2]=colorArr[1][2];

s[35-i][0]=colorArr[1][0];

s[35-i][1]=colorArr[1][1];

s[35-i][2]=colorArr[1][2];

SendOneFrame(s);

Delay1msN(50);

}

for(i=0;i<18;i++){s[i][0]=0;s[i][1]=0;s[i][2]=0;s[35-i][0]=0;s[35-i][1]=0;s[35-i][2]=0;SendOneFrame(s);Delay1msN(50);}

}

}

void Normally()

{

for(i=0;i<SNUM;i++)

{

s[i][0]=colorArr[1][0];

s[i][1]=colorArr[1][1];

s[i][2]=colorArr[1][2];

}

SendOneFrame(s);

Delay100ms();

}

/堆积***/

void accumulation()

{

//先让所有LED灭

for(i=0;i<SNUM;i++)

{

s[i][0]=0;

s[i][1]=0;

s[i][2]=0;

}

SendOneFrame(s);

Delay100ms();

//循环修改数组数据,然后显示for(j=0;j<12;j++){for(i=0;i<12-j;i++){s[3*i][0]=colorArr[1][0];s[3*i][1]=colorArr[1][1];s[3*i][2]=colorArr[1][2];s[i*3+1][0]=colorArr[1][0];s[i*3+1][1]=colorArr[1][1];s[i*3+1][2]=colorArr[1][2];s[i*3+2][0]=colorArr[1][0];s[i*3+2][1]=colorArr[1][1];s[i*3+2][2]=colorArr[1][2];SendOneFrame(s);Delay50ms();if(i == 12-j-1)continue;s[3*i][0]=0;s[3*i][1]=0;s[3*i][2]=0;s[i*3+1][0]=0;s[i*3+1][1]=0;s[i*3+1][2]=0;s[i*3+2][0]=0;s[i*3+2][1]=0;s[i*3+2][2]=0;SendOneFrame(s);Delay10ms();}}

}

void Seven_color()

{

//进入循环显示前让所有LED灭掉

for(i=0;i<SNUM;i++)

{

s[i][0]=0;

s[i][1]=0;

s[i][2]=0;

}

SendOneFrame(s);

Delay1msN(50);

//9中颜色循环显示for(j=0;j<9;j++){//先让所有LED灭for(i=0;i<SNUM;i++){s[i][0]=0; s[i][1]=0;s[i][2]=0;}SendOneFrame(s);Delay1msN(30);//循环修改数组数据,然后显示for(i=0;i<SNUM;i++){s[i][0]=colorArr1[j][0];s[i][1]=colorArr1[j][1];s[i][2]=colorArr1[j][2];SendOneFrame(s);Delay1msN(30);//每显示一次,检查是否模式mode已改变,如果改变了则退出}}

}

void Monkey_trailing()

{

for(j=0;j<MOVENUM;j++)

{

tail[j][0]=colorArr[8-color][0]>>cut[j];

tail[j][1]=colorArr[8-color][1]>>cut[j];

tail[j][2]=colorArr[8-color][2]>>cut[j];

}

for(j=0;j<SNUM+MOVENUM;j++){//上底色for(i=0;i<SNUM;i++){s[i][0]=colorArr[color][0];s[i][1]=colorArr[color][1];s[i][2]=colorArr[color][2];}//修改数值for(i=j,k=0;i>0&&k<MOVENUM;i--,k++){if(i<=SNUM){s[i-1][0]=(colorArr[color][0]>>cut2[k])+tail[k][0];s[i-1][1]=(colorArr[color][1]>>cut2[k])+tail[k][1];s[i-1][2]=(colorArr[color][2]>>cut2[k])+tail[k][2];}}SendOneFrame(s); Delay1msN(50);//每显示一次,检查是否模式mode已改变,如果改变了则退出}for(j=SNUM+MOVENUM-1;j>0;j--){//上底色for(i=SNUM-1;i>0;i--){s[i][0]=colorArr[color][0];s[i][1]=colorArr[color][1];s[i][2]=colorArr[color][2];}//修改数值for(i=j,k=0;i>0&&k<MOVENUM;i--,k++){if(i<=SNUM){s[i-1][0]=(colorArr[color][0]>>cut2[k])+tail[k][0];s[i-1][1]=(colorArr[color][1]>>cut2[k])+tail[k][1];s[i-1][2]=(colorArr[color][2]>>cut2[k])+tail[k][2];}}SendOneFrame(s); Delay1msN(50);//每显示一次,检查是否模式mode已改变,如果改变了则退出}

}

main()

{

init();

Delay20ms();

//先让所有LED灭

// for(i=0;i<SNUM;i++)

// {

// s[i][0]=0;

// s[i][1]=0;

// s[i][2]=0;

// }

// SendOneFrame(s);

// accumulation();

// left_rightrun();

// right_leftrun();

// l_r_md();

// md_l_r();

// breathing();

//

// S1 = 0;

while(1)

{

// accumulation();

// left_rightrun();

// right_leftrun();

// l_r_md();

// md_l_r();

//breathing();

//breathing1();

// Monkey_trailing();

// Seven_color();

//Normally();

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。