原文件
#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();
}
}