|
- //单片机型号:STC15F104E等STC-Y3系列 晶振频率:33Mhz
- #include "reg51.h"
- #include "intrins.h"
- #include "stdlib.h"
- #include "stdio.h"
- #define u8 unsigned char
- #define u32 unsigned long
- #define RED 0
- #define GREEN 1
- #define BLUE 2
- #define ws2812B_num 8 //ws2812B 级联数量
- sbit ws2812B = P3^4; //ws2812B 数据端口
- u8 ws2812B_VRAM[ws2812B_num][3]; //ws2812B 颜色值显存 (RGB值缓存) 占用字节数:级联数量*3
- void delay1s(){
- u8 a,b,c;
- for(c=223;c>0;c--)
- for(b=212;b>0;b--)
- for(a=173;a>0;a--);
- _nop_();
- _nop_();
- }
- void ws2812B_delay850ns(){
- u8 a;
- for(a=4;a>0;a--);
- }
- void ws2812B_delay400ns(){
- _nop_();
- }
- void ws2812B_delay50us(){
- u8 a,b;
- for(b=117;b>0;b--)
- for(a=2;a>0;a--);
- }
- void ws2812B_Reset(){ //发送帧复位信号
- ws2812B = 0;
- ws2812B_delay50us();
- }
- u32 rgb(u8 red,u8 green,u8 blue){ //易语言的 取颜色值()
- return red|green<<8|(u32)blue<<16;
- }
- void ws2812B_SendColor(u32 rgb){ //发送颜色数据 参数1:颜色值(范围:0~16777215)
- u8 i,j,k;
- for(j=0;j<3;j++){
- k=rgb>>(j<<3);
- for(i=0;i<8;i++){
- if(k&0x80){ //从高位开始发送 发送1码
- ws2812B=1; //T1H 1码高电平时间 850ns±150ns
- ws2812B_delay850ns();
- ws2812B=0; //T1L 1码低电平时间 400ns±150ns
- ws2812B_delay400ns();
- } else { //发送0码
- ws2812B=1; //T0H 0码高电平时间 400ns±150ns
- ws2812B_delay400ns();
- ws2812B=0; //T0L 0码低电平时间 850ns±150ns
- ws2812B_delay850ns();
- }
- k<<=1; //左移1位
- }
- }
- }
- void ws2812B_SendVRAM(){ //发送显存(刷新显示)
- u8 i;
- for(i=0;i<ws2812B_num;i++){
- ws2812B_SendColor(rgb(ws2812B_VRAM[i][RED],ws2812B_VRAM[i][GREEN],ws2812B_VRAM[i][BLUE]));
- }
- ws2812B_Reset();
- }
- void ws2812B_VRAM_Fill_Rand(){ //显存填充随机
- u8 i;
- for(i=0;i<ws2812B_num;i++){
- ws2812B_VRAM[i][RED] = rand();
- ws2812B_VRAM[i][GREEN] = rand();
- ws2812B_VRAM[i][BLUE] = rand();
- }
- }
- void main(){
- while(1){
- ws2812B_VRAM_Fill_Rand();
- ws2812B_SendVRAM();
- delay1s();
- }
- }
复制代码 |
|