首页->【我的奇思妙想,DIY小设计!】

17 0

项目原理图:

blob.png

下面是源代码:

#include <intrins.h> //

#include"STC12C5A60S2.H" //芯片头文件

#include"FFT.H" //FFT(快速傅里叶变换)功能头文件

#include"key.h" //按键扫描头文件

#include"zimo.h" //

#include"hc573.h" //hc573驱动

#include"flash.h" //




//定义ULN2803数据端口

#define anum P3


//指示用LED(未使用)

sbit  LED =P1^3;


//变量区分定时器0功能(0:用于音乐频谱,1:用于动画)

uchar flag1;



//uchar COUNT=15;

//uchar COUNT1=0;

uchar ADC_Count=0,LINE=15,G=0,T;


//uchar code tablew[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

//uchar code tablew[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

//uchar code tablew[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01};


uchar code tablew[]={0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE}; 


uchar G;

uchar buffer[8];


//功能初始化

void Init()

{  

//IO口默认状态

P0 = 0x00; //74HC573数据口

P2 = 0x00; //74HC573位选端

P3 = 0x00; //ULN2803数据口


//IO口模式初始化

P3M0 = 0xff; //ULN2803输出口设置为推挽输出

P3M1 = 0x00;

P0M0 = 0xff; //P0、P2用于控制74HC573,推挽输出

P0M1 = 0x00;

P2M0 = 0xff;

P2M1 = 0x00;

P4M0 = 0x00; //P4端口接有按键,设置为输入

P4M1 = 0xff;


//573初始化

initial573();

//----- ADC初始化 ------------------------------------------------------------------------------

P1ASF  = 0x02;          //0000,0010, 将 P1.1 置成模拟口

AUXR1 &=0xFB;           //1111,1011, 令 ADRJ=0

EADC   =1; //AD中断打开

ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ADC_START | channel; //1110 1001   1打开 A/D (ADC_POWER)转换电源;11速度为90周期一次;

                                                  //0中断标志清零;1启动adc(ADC_START);001AD通道打开(这里为P1.1);

//----- 定时器初始化 ------------------------------------------------------------------------------ 

//TMOD=0X12;   

//TH0=0xf0;                                  

//TL0=0xf0;

//TH1=0xfe;   

//TL1=0Xd4; 


ET0 = 1;  //定时器0中断 启用

TR0 = 0;  //定时器0     关闭

ET1 = 1;  //定时器1中断 启用

TR1 = 0;              //定时器1     关闭

PT1 = 0;  //定时器1 低优先级

PT0 = 1;  //定时器0 高优先级

IPH = PADCH;

IP  = PADC;  //中断优先级

EA  = 1;  //总中断打开 

clear(0);  //清空显示缓冲区


//按键设置

P4SW = 0x70; //将NA、ALE、EX_LVD设置为准IO口(P4.4、P4.5、P4.6) 

}

 


/******** 主函数 ***************************************************************************************/

void main()

{

uchar i = 0; //for循环变量


//设备初始化

Init();


//正常工作循环

while(1)

{

clear(0); //清空刷新显示缓冲区 

key_scan(); //扫描按键


//关闭显示

if(key1flag==1)

{

key1flag = 0;


xiansi1(); //关闭所有573输出

anum = 0xff; //关闭ULN2083输出

TR1  = 0; //定时器1 关闭

TR0  = 0; //定时器0 关闭

}


//FFT

if(key2flag==1)

{

TMOD = 0x12; //T0: 8位自动重装      T1: 16位模式

//TH0  = 0xb0; //ADC采样周期(80us或6.66us)  采样率 12.5 KHz                                

//TL0  = 0xb0; //

TH0  = 0x60; //ADC采样周期(80us或6.66us)  采样率 12.5 KHz                                

TL0  = 0x60; //

//TH1  = 0xfe; //刷新显示周期(300us或25us) 刷新率   

//TL1  = 0Xd4; //

TH1  = 0xfd; //刷新显示周期(300us或25us) 刷新率   

TL1  = 0Xa8; //

while(1)

{

flag1 = 0;

TR1   = 1; //刷新显示

TR0   = 1; //控制采样速率

//P0    = 0xaa; //P0 未知作用1010 1010

ADC_Count=0;

TR1  = 1;     //开启定时器中断1

TR0  = 1;     //开启定时器中断0

EADC = 1;  //开启ADC 

while(ADC_Count<128); //转换128次

for(i=0;i<128;i++)  //FFT参数虚部赋值

{

Fft_Image[i]=0;  //原始数据 虚部赋值为0

}

FFT();                //FFT运算并转换为各频段幅值


//其他按钮,跳出

key_scan();

if(key2flag == 0) break;

}

}


//顺序循环

if(key3flag==1)

{

TMOD=0x11;

while(1)

{

clear(0);

flag1=1;  //定时器0功能控制

TR1=0;  //关闭定时器1

TR0=1;  //开启定时器0

//TH0=0xf0;

//TL0=0xff;


flash_6();

clear(0); key_scan(); if(key3flag == 0) break;

flash_5();

clear(0); key_scan(); if(key3flag == 0) break;

flash_1();

clear(0); key_scan(); if(key3flag == 0) break;

flash_2();

clear(0); key_scan(); if(key3flag == 0) break;

flash_4();

clear(0); key_scan(); if(key3flag == 0) break;

flash_3();

clear(0); key_scan(); if(key3flag == 0) break;

flash_8();

clear(0); key_scan(); if(key3flag == 0) break;

flash_7();

clear(0); key_scan(); if(key3flag == 0) break;

flash_11();

clear(0); key_scan(); if(key3flag == 0) break;

flash_9();

clear(0); key_scan(); if(key3flag == 0) break;

flash_10();

clear(0); key_scan(); if(key3flag == 0) break;

flash_11();

clear(0); key_scan(); if(key3flag == 0) break;

flash_6();

clear(0); key_scan(); if(key3flag == 0) break;

flash_5();

clear(0); key_scan(); if(key3flag == 0) break;

flash_4();

clear(0); key_scan(); if(key3flag == 0) break;

flash_7();

clear(0); key_scan(); if(key3flag == 0) break;

flash_9();

clear(0); key_scan(); if(key3flag == 0) break;

flash_8();

clear(0); key_scan(); if(key3flag == 0) break;

flash_4();

clear(0); key_scan(); if(key3flag == 0) break;

flash_2();

clear(0); key_scan(); if(key3flag == 0) break;


}

}

}

}



//定时器1中断 用于刷新显示(只在频谱显示时使用)

void LED_Display() interrupt 3 //中断一次显示一列

{  

//TH1=0xfe;

//TL1=0xD4;

TH1  = 0xfd; //刷新显示周期(300us或25us) 刷新率   

TL1  = 0Xa8; //

G++;  

if(G>=17) G=1;

switch(G)     //往点阵屏填充一列的数据

{

case 1: anum=tablew[(LED_TAB[1] )%8];hang1();break; //(LED_TAB[1] )%8取八的余数

case 2: anum=tablew[(LED_TAB[2] )%8];hang1();break;

case 3: anum=tablew[(LED_TAB[3] )%8];hang2();break;

case 4: anum=tablew[(LED_TAB[4] )%8];hang2();break;

case 5: anum=tablew[(LED_TAB[5] )%8];hang3();break;

case 6: anum=tablew[(LED_TAB[6] )%8];hang3();break;

case 7: anum=tablew[(LED_TAB[7] )%8];hang4();break;

case 8: anum=tablew[(LED_TAB[8] )%8];hang4();break;

case 9: anum=tablew[(LED_TAB[9] )%8];hang5();break;

case 10:anum=tablew[(LED_TAB[10])%8];hang5();break;

case 11:anum=tablew[(LED_TAB[11])%8];hang6();break;

case 12:anum=tablew[(LED_TAB[12])%8];hang6();break;

case 13:anum=tablew[(LED_TAB[13])%8];hang7();break;

case 14:anum=tablew[(LED_TAB[14])%8];hang7();break;

case 15:anum=tablew[(LED_TAB[15])%8];hang8();break;

case 16:anum=tablew[(LED_TAB[15])%8];hang8();break;

}

LED=0;  

}



//ADC转换完成中断

void ADC_Finish() interrupt 5

{   

ADC_CONTR &= !ADC_FLAG; 

Fft_Real[LIST_TAB[ADC_Count]] = (int)((ADC_RES)<<1)+(ADC_RESL>>1)*2;     //按LIST_TAB表里的顺序,进行存储采样值


if(ADC_Count<=127){ ADC_Count++;  }

else              { EADC=0;TR0=0; }    

}


//定时器0中断  ?? 和 控制采样速率 

void Ad_Control() interrupt 1  

{

uchar i;

static uchar layer=0;

if(flag1==1)

anum = 0;

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

{

buffer[i]=display[layer][i];

}

xiansi();

anum = 0x01<<layer;

//   anum = 0x80>>layer;

if(layer<7) layer++;

else layer=0; 

delay(5);


//TH0=0xfa;

//TL0=0xf0;  

TH0=0xf5;

TL0=0xe0;  

}

//控制采样速率

else

{

ADC_CONTR = ADC_POWER | ADC_SPEEDHH| ADC_START | channel; //开始AD采集

}

key.h

//定义按键管脚

sbit key1 = P4^6;

sbit key2 = P4^5;

sbit key3 = P4^4;


//全局变量

unsigned char key1flag = 0,key2flag = 0,key3flag = 0;


//按键扫描函数

void key_scan()

{

//key1flag=0;

//key2flag=0;

//key3flag=0;

if(key1==0) { key1flag = 1; key2flag = 0; key3flag = 0; } //

if(key2==0) { key1flag = 0; key2flag = 1; key3flag = 0; }

if(key3==0) { key1flag = 0; key2flag = 0; key3flag = 1; }

}

573.h

/*定义管脚*/

unsigned char buffer[8]="        "; //赋初值 


//端口定义

sbit cs1 = P2^7;   //低电平时,数据锁存

sbit cs2 = P2^6;

sbit cs3 = P2^5;

sbit cs4 = P2^4;

sbit cs5 = P2^3;

sbit cs6 = P2^2;

sbit cs7 = P2^1;

sbit cs8 = P2^0;


#define DATA_573 P0 //573的数据端口




/*显示缓存,上层需要使用*/


/*---------------   初始化   --------------*/

void initial573()

{

//SH_CP = 0;

//ST_CP = 0;

//DS = 0; 


//关闭所有灯

cs1 = cs2 = cs3 = cs4 = cs5 = cs6 = cs7 = cs8 = 1; //输出锁存

DATA_573 = 0x00;

cs1 = cs2 = cs3 = cs4 = cs5 = cs6 = cs7 = cs8 = 0; //输出锁存

}

/*---------------   发送数据   ---------------*/

/*void send_data(unsigned char d)

{

unsigned char i;

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

{

DS = d&0x80; //发送最低位

SH_CP = 1;

SH_CP = 0; //移位寄存器移位

d = d<<1; //数据移位

}  

} */


/*---------------   扫描数码管,供上层调用   ---------------*/



void xiansi()

{

/*send_data(buffer[0]);   //发送段选数据

send_data(buffer[1]);   //发送位选数据

send_data(buffer[2]);

send_data(buffer[3]);

send_data(buffer[4]);   //发送段选数据

send_data(buffer[5]);   //发送位选数据

send_data(buffer[6]);

send_data(buffer[7]);


ST_CP=1;

ST_CP=0;   //更新锁存数据  */


cs1 = 1; DATA_573 = buffer[7]; cs1 = 0; //

cs2 = 1; DATA_573 = buffer[6]; cs2 = 0; //

cs3 = 1; DATA_573 = buffer[5]; cs3 = 0; //

cs4 = 1; DATA_573 = buffer[4]; cs4 = 0; //

cs5 = 1; DATA_573 = buffer[3]; cs5 = 0; //

cs6 = 1; DATA_573 = buffer[2]; cs6 = 0; //

cs7 = 1; DATA_573 = buffer[1]; cs7 = 0; //

cs8 = 1; DATA_573 = buffer[0]; cs8 = 0; //

}



void xiansi1()

{

/* send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);

send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);

send_data(0x00);

ST_CP=1;

ST_CP=0;   //更新锁存数据 */


cs1 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs1 = 0; //

cs2 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs2 = 0; //

cs3 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs3 = 0; //

cs4 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs4 = 0; //

cs5 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs5 = 0; //

cs6 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs6 = 0; //

cs7 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs7 = 0; //

cs8 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs8 = 0; //

}



/* void xiansi2()

/* {


/* send_data(0xff);   //发送段选数据

/* send_data(0xff);   //发送位选数据

/* send_data(0xff);

/* send_data(0xff);

/* send_data(0xff);   //发送段选数据

/* send_data(0xff);   //发送位选数据

/* send_data(0xff);

/* send_data(0xff);

/* send_data(0xff);

/* ST_CP=1;

/* ST_CP=0;   //更新锁存数据

/* }*/



void hang1()

{

/* send_data(0xff);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);

send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);


ST_CP=1;

ST_CP=0;*/   //更新锁存数据


cs1 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs1 = 0; //

cs2 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs2 = 0; //

cs3 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs3 = 0; //

cs4 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs4 = 0; //

cs5 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs5 = 0; //

cs6 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs6 = 0; //

cs7 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs7 = 0; //

cs8 = 1; _nop_(); DATA_573 = 0xff; _nop_(); cs8 = 0; //

}


void hang2()

{

/* send_data(0x00);   //发送段选数据

send_data(0xff);   //发送位选数据

send_data(0x00);

send_data(0x00);

send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);


ST_CP=1;

ST_CP=0;*/   //更新锁存数据


cs1 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs1 = 0; //

cs2 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs2 = 0; //

cs3 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs3 = 0; //

cs4 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs4 = 0; //

cs5 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs5 = 0; //

cs6 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs6 = 0; //

cs7 = 1; _nop_(); DATA_573 = 0xff; _nop_(); cs7 = 0; //

cs8 = 1; _nop_(); DATA_573 = 0x00; _nop_(); cs8 = 0; //

}


void hang3()

{

/* send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0xff);

send_data(0x00);

send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);


ST_CP=1;

ST_CP=0;*/   //更新锁存数据


cs1 = 1; DATA_573 = 0x00; cs1 = 0; //

cs2 = 1; DATA_573 = 0x00; cs2 = 0; //

cs3 = 1; DATA_573 = 0x00; cs3 = 0; //

cs4 = 1; DATA_573 = 0x00; cs4 = 0; //

cs5 = 1; DATA_573 = 0x00; cs5 = 0; //

cs6 = 1; DATA_573 = 0xff; cs6 = 0; //

cs7 = 1; DATA_573 = 0x00; cs7 = 0; //

cs8 = 1; DATA_573 = 0x00; cs8 = 0; //

}


void hang4()

{

/* send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0xff);

send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);


ST_CP=1;

ST_CP=0;   //更新锁存数据  */


cs1 = 1; DATA_573 = 0x00; cs1 = 0; //

cs2 = 1; DATA_573 = 0x00; cs2 = 0; //

cs3 = 1; DATA_573 = 0x00; cs3 = 0; //

cs4 = 1; DATA_573 = 0x00; cs4 = 0; //

cs5 = 1; DATA_573 = 0xff; cs5 = 0; //

cs6 = 1; DATA_573 = 0x00; cs6 = 0; //

cs7 = 1; DATA_573 = 0x00; cs7 = 0; //

cs8 = 1; DATA_573 = 0x00; cs8 = 0; //

}


void hang5()

{

/* send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);

send_data(0xff);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);


ST_CP=1;

ST_CP=0;*/   //更新锁存数据


cs1 = 1; DATA_573 = 0x00; cs1 = 0; //

cs2 = 1; DATA_573 = 0x00; cs2 = 0; //

cs3 = 1; DATA_573 = 0x00; cs3 = 0; //

cs4 = 1; DATA_573 = 0xff; cs4 = 0; //

cs5 = 1; DATA_573 = 0x00; cs5 = 0; //

cs6 = 1; DATA_573 = 0x00; cs6 = 0; //

cs7 = 1; DATA_573 = 0x00; cs7 = 0; //

cs8 = 1; DATA_573 = 0x00; cs8 = 0; //

}


void hang6()

{

/* send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);

send_data(0x00);   //发送段选数据

send_data(0xff);   //发送位选数据

send_data(0x00);

send_data(0x00);


ST_CP=1;

ST_CP=0;*/   //更新锁存数据


cs1 = 1; DATA_573 = 0x00; cs1 = 0; //

cs2 = 1; DATA_573 = 0x00; cs2 = 0; //

cs3 = 1; DATA_573 = 0xff; cs3 = 0; //

cs4 = 1; DATA_573 = 0x00; cs4 = 0; //

cs5 = 1; DATA_573 = 0x00; cs5 = 0; //

cs6 = 1; DATA_573 = 0x00; cs6 = 0; //

cs7 = 1; DATA_573 = 0x00; cs7 = 0; //

cs8 = 1; DATA_573 = 0x00; cs8 = 0; //

}


void hang7()

{

/* send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);

send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0xff);

send_data(0x00);


ST_CP=1;

ST_CP=0;*/   //更新锁存数据


cs1 = 1; DATA_573 = 0x00; cs1 = 0; //

cs2 = 1; DATA_573 = 0xff; cs2 = 0; //

cs3 = 1; DATA_573 = 0x00; cs3 = 0; //

cs4 = 1; DATA_573 = 0x00; cs4 = 0; //

cs5 = 1; DATA_573 = 0x00; cs5 = 0; //

cs6 = 1; DATA_573 = 0x00; cs6 = 0; //

cs7 = 1; DATA_573 = 0x00; cs7 = 0; //

cs8 = 1; DATA_573 = 0x00; cs8 = 0; //

}


void hang8()

{

/* send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);

send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0xff);


ST_CP=1;

ST_CP=0;*/   //更新锁存数据


cs1 = 1; DATA_573 = 0xff; cs1 = 0; //

cs2 = 1; DATA_573 = 0x00; cs2 = 0; //

cs3 = 1; DATA_573 = 0x00; cs3 = 0; //

cs4 = 1; DATA_573 = 0x00; cs4 = 0; //

cs5 = 1; DATA_573 = 0x00; cs5 = 0; //

cs6 = 1; DATA_573 = 0x00; cs6 = 0; //

cs7 = 1; DATA_573 = 0x00; cs7 = 0; //

cs8 = 1; DATA_573 = 0x00; cs8 = 0; //

}

/*

void hang9()

{


send_data(0x0f);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);

send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);


ST_CP=1;

ST_CP=0;   //更新锁存数据

}

void hang10()

{


send_data(0x00);   //发送段选数据

send_data(0x0f);   //发送位选数据

send_data(0x00);

send_data(0x00);

send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);


ST_CP=1;

ST_CP=0;   //更新锁存数据

}

void hang11()

{


send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x0f);

send_data(0x00);

send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x0f);


ST_CP=1;

ST_CP=0;   //更新锁存数据

}

void hang12()

{


send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x0f);

send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);


ST_CP=1;

ST_CP=0;   //更新锁存数据

}

void hang13()

{


send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);

send_data(0x0f);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);


ST_CP=1;

ST_CP=0;   //更新锁存数据

}



void hang14()

{


send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);

send_data(0x00);   //发送段选数据

send_data(0x0f);   //发送位选数据

send_data(0x00);

send_data(0x00);


ST_CP=1;

ST_CP=0;   //更新锁存数据

}

void hang15()

{


send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);

send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x0f);

send_data(0x00);


ST_CP=1;

ST_CP=0;   //更新锁存数据

}

void hang16()

{


send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x00);

send_data(0x00);   //发送段选数据

send_data(0x00);   //发送位选数据

send_data(0x00);

send_data(0x0f);


ST_CP=1;

ST_CP=0;   //更新锁存数据

}*/

falsh.h



uchar display[8][8];

void delay(uint i)

{

uchar b;

while (i--)

{

b=2;

while(b--);

}

;

}

/*判断一个数值的第n位,是1还是0,并返回相应数值*/

uchar judgebit(uchar num,uchar b)

{

char n;

num=num&(1<<b);

if (num)

n=1;

else

n=0;

return n;

}

/*To figure out the round number*/

uchar abs(uchar a)

{

uchar b;

b=a/10;

a=a-b*10;

if (a>=5)

b++;

return b;

}

/*To figure out the absolute value*/

uchar abss(char a)

{

if (a<0)

a=-a;

return a;

}

/*The function can comparat the character.

And remove the big one to the back.*/

void max(uchar *a,uchar *b)

{

   uchar t;

   if ((*a)>(*b))

   {

t=(*a);

(*a)=(*b);

(*b)=t;   

   }

}

/*The function is to figure out the max number and return it.*/

uchar maxt(uchar a,uchar b,uchar c)

{

if (a<b)

a=b;

if (a<c)

a=c;

return a;

}


void clear(char le)

{

uchar i,j;

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

{

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

display[j][i]=le;

}

}

void trailler(uint speed)

{

char i,j;

for (i=6;i>=-3;i--)

{

if (i>=0)

{

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

display[j][i]=display[j][i+1];

}

if (i<4)

{

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

display[j][i+4]=0;

}

delay(speed);

}

}

void point(uchar x,uchar y,uchar z,uchar le)

{

uchar ch1,ch0;

ch1=1<<x;

ch0=~ch1;

if (le) 

display[z][y]=display[z][y]|ch1;

else 

display[z][y]=display[z][y]&ch0;


}


void type(uchar cha,uchar y)

{

uchar xx;

for (xx=0;xx<8;xx++)

{

display[xx][y]=table_cha[cha][xx];

}

}

/*The first variable is the distance from the midpoint.

The second is the layer.

the third is the flash speed of the time between each two point.

The forth is the enable io,it controls weather draw or claen.*/

void cirp(char cpp,uchar dir,uchar le)

{

uchar a,b,c,cp;

if ((cpp<128)&(cpp>=0))

{

if (dir)

cp=127-cpp;

else 

cp=cpp; 

a=(dat[cp]>>5)&0x07;

b=(dat[cp]>>2)&0x07;

c=dat[cp]&0x03;

if (cpp>63)

c=7-c;

point (a,b,c,le);

}

}

void line(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,uchar le)

{

char t,a,b,c,a1,b1,c1,i;

a1=x2-x1;

b1=y2-y1;

c1=z2-z1;

t=maxt(abss(a1),abss(b1),abss(c1));

a=x1*10;

b=y1*10;

c=z1*10;

a1=a1*10/t;

b1=b1*10/t;

c1=c1*10/t;

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

{

point(abs(a),abs(b),abs(c),le);

a+=a1;

b+=b1;

c+=c1;

}

point(x2,y2,z2,le);

}


void box(unsigned char x1,unsigned char z1,unsigned char y1,unsigned char x2,unsigned char z2,unsigned char y2,unsigned char fill,unsigned char le)

{

uchar i,j,t=0;

max(&x1,&x2);

max(&y1,&y2);

max(&z1,&z2);

for (i=x1;i<=x2;i++)

t|=1<<i;

if (!le)

t=~t;

if (fill)

{

if (le)

{

for (i=z1;i<=z2;i++)

{

for (j=y1;j<=y2;j++)

display[j][i]|=t;

}

}

else

{

for (i=z1;i<=z2;i++)

{

for (j=y1;j<=y2;j++)

display[j][i]&=t;

}

}

}

else

{

if (le)

{

display[y1][z1]|=t;

display[y2][z1]|=t;

display[y1][z2]|=t;

display[y2][z2]|=t;

}

else

{

display[y1][z1]&=t;

display[y2][z1]&=t;

display[y1][z2]&=t;

display[y2][z2]&=t;

}

t=(0x01<<x1)|(0x01<<x2);

if (!le)

t=~t;

if (le)

{

for (j=z1;j<=z2;j+=(z2-z1))

{

for (i=y1;i<=y2;i++)

display[i][j]|=t;

}

for (j=y1;j<=y2;j+=(y2-y1))

{

for (i=z1;i<=z2;i++)

display[j][i]|=t;

}

}

else

{

for (j=z1;j<=z2;j+=(z2-z1))

{

for (i=y1;i<=y2;i++)

{

display[i][j]&=t;

}

}

for (j=y1;j<=y2;j+=(y2-y1))

{

for (i=z1;i<=z2;i++)

{

display[j][i]&=t;

}

}

}

}

}

void box_apeak_xy(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,uchar fill,uchar le)

{

uchar i;

max(&z1,&z2);

if (fill)

{

for (i=z1;i<=z2;i++)

{

line (x1,y1,i,x2,y2,i,le);

else

{

line (x1,y1,z1,x2,y2,z1,le);

line (x1,y1,z2,x2,y2,z2,le);

line (x2,y2,z1,x2,y2,z2,le);

line (x1,y1,z1,x1,y1,z2,le);

}

}

/*void box_parallel_xy(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,uchar le)

{

uchar i;

max(&y1,&y2);

for (i=y1;i<=y2;i++)

{

line (x1,i,z1,x2,i,z2,le);

}*/

void poke(uchar n,uchar x,uchar y)

{

uchar i;

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

{

point(x,y,i,judgebit(n,i));

}

}

void boxtola(char i,uchar n)

{

if ((i>=0)&(i<8))

{

poke(n,0,7-i);

}

if ((i>=8)&(i<16))

{

poke(n,i-8,0);

}

if ((i>=16)&(i<24))

{

poke(n,7,i-16);

}


}

void rolldisplay(uint speed)

{

uchar j;

char i,a;

for (i=23;i>-40;i--)

{

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

{

a=i+j;

if ((a>=0)&(a<24))

boxtola(a,table_id[j]);

}

delay(speed);

}

}

void roll_apeak_yz(uchar n,uint speed)

{

uchar i;

switch(n)

{

case 1:

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

{

display[i][7]=0;

display[7][6-i]=255;

delay(speed);

};

break;

case 2:

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

{

display[7][7-i]=0;

display[6-i][0]=255;

delay(speed);

};

break;

case 3:

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

{

display[7-i][0]=0;

display[0][i+1]=255;

delay(speed);

};

break;

case 0:

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

{

display[0][i]=0;

display[i+1][7]=255;

delay(speed);

};

}

}

void roll_apeak_xy(uchar n,uint speed)

{

uchar i;

switch(n)

{

case 1:

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

{

line(0,i,0,0,i,7,0);

line(i+1,7,0,i+1,7,7,1);

delay(speed);

};

break;

case 2:

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

{

line(i,7,0,i,7,7,0);

line(7,6-i,0,7,6-i,7,1);

delay(speed);

};

break;

case 3:

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

{

line(7,7-i,0,7,7-i,7,0);

line(6-i,0,0,6-i,0,7,1);

delay(speed);

};

break;

case 0:

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

{

line(7-i,0,0,7-i,0,7,0);

line(0,i+1,0,0,i+1,7,1);

delay(speed);

};

}

}

void roll_3_xy(uchar n,uint speed)

{

uchar i;

switch(n)

{

case 1:

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

{

box_apeak_xy (0,i,0,7,7-i,7,1,1);

delay(speed);

if (i<7)

box_apeak_xy (3,3,0,0,i,7,1,0);

};

break;

case 2:

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

{

box_apeak_xy (7-i,0,0,i,7,7,1,1);

delay(speed);

if (i<7)

box_apeak_xy (3,4,0,i,7,7,1,0);

};

break;

case 3:

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

{

box_apeak_xy (0,i,0,7,7-i,7,1,1);

delay(speed);

if (i<7)

box_apeak_xy (4,4,0,7,7-i,7,1,0);

};

break;

case 0:

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

{

box_apeak_xy (7-i,0,0,i,7,7,1,1);

delay(speed);

if (i<7)

box_apeak_xy (4,3,0,7-i,0,7,1,0);

};

}

}

void trans(uchar z,uint speed)

{

uchar i,j;

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

{

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

{

display[z][i]>>=1;

}

delay(speed);

}

}

void tranoutchar(uchar c,uint speed)

{

uchar i,j,k,a,i2=0;

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

{

if (i<7)

box_apeak_xy (i+1,0,0,i+1,7,7,1,1);

box_apeak_xy (i2,0,0,i2,7,7,1,0);

a=0;

i2=i+1;

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

{

a=a|(1<<j);

}

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

{

display[k][3]|=table_cha[c][k]&a;

display[k][4]|=table_cha[c][k]&a;

}

delay(speed);

}

}

void transss()

{

uchar i,j;

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

{

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

display[i][j]<<=1;

}

}


/*From now on,the function below is to display the flash.*/

void flash_1()

{

clear(0);

type(1,2);

delay(60000);

//delay(60000);

type(2,2);

delay(60000);

//delay(60000);

type(3,2);

// delay(60000);

delay(60000);

type(4,2);

// delay(60000);

delay(60000);

clear(0);

rolldisplay(20000);

type(0,7);

delay(1000);

trailler(8000);

// delay(60000);

}

void flash_2()

{

uchar i;

for (i=129;i>0;i--)

{

cirp(i-2,0,1);

delay(8000);

cirp(i-1,0,0);

}

delay(8000);

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

{

cirp(i,1,1);

delay(8000);

cirp(i-8,1,0);

}

delay(8000);

for (i=129;i>0;i--)

{

cirp(i-2,0,1);

delay(8000);

}

delay(8000);

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

{

cirp(i-8,1,0);

delay(8000);

}

delay(60000);

delay(60000);

}

void flash_3()

{

char i;

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

{

box_apeak_xy(0,i,0,7,i,7,1,1);

delay(20000);

if (i<7)

box_apeak_xy(0,i,0,7,i,7,1,0);

}

for (i=7;i>=0;i--)

{

box_apeak_xy(0,i,0,7,i,7,1,1);

delay(20000);

if (i>0)

box_apeak_xy(0,i,0,7,i,7,1,0);

}

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

{

box_apeak_xy(0,i,0,7,i,7,1,1);

delay(20000);

if (i<7)

box_apeak_xy(0,i,0,7,i,7,1,0);

}

}

void flash_4()

{

char i,j,an[8];

for (j=7;j<15;j++)

an[j-7]=j;

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

{

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

{

if ((an[j]<8)&(an[j]>=0))

line(0,an[j],j,7,an[j],j,1);

}

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

{

if (((an[j]+1)<8)&(an[j]>=0))

line(0,an[j]+1,j,7,an[j]+1,j,0);

}

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

{

if (an[j]>0)

an[j]--;

}

delay(15000);

}

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

an[j]=1-j;

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

{

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

{

if ((an[j]<8)&(an[j]>=0))

line(0,an[j],j,7,an[j],j,1);

}

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

{

if (((an[j]-1)<7)&(an[j]>0))

line(0,an[j]-1,j,7,an[j]-1,j,0);

}

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

{

if (an[j]<7)

an[j]++;

}

delay(15000);

}

}


void flash_5()


{


      uchar i,j,t,x,y;


      uchar code daa[13]={0,1,2,0x23,5,6,7,6,5,0x23,2,1,0};


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


      {


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


               {


                         if (daa[i]>>4)


                         {


                                  t=daa[i]&0x0f;


                                  line (0,0,t+1,0,7,t+1,1);


                         }


                         else 


                                  t=daa[i];


                         line (0,0,t,0,7,t,1);


                         transss();


                         delay(10000);


               }


      }


      for (j=1;j<8;j++)


      {


               if (j>3)


                         t=4;


               else


                         t=j;


               for (i=0;i<24;i+=j)


               {


                         x=dat3[i]>>4;


                         y=dat3[i]&0x0f;


                         box_apeak_xy(0,x,y,0,x+1,y+1,1,1);


                         transss();


                         delay(10000);


               }


      }


      for (j=1;j<8;j++)


      {


               if (j>3)


                         t=4;


               else


                         t=j;


               for (i=0;i<24;i+=j)


               {


                         x=dat3[i]>>4;


                         y=dat3[i]&0x0f;


                         point (0,x,y,1);


                         transss();


                         delay(10000);


               }


      }


}


void flash_6()//rain


{


      uchar i,j,k,z;


      roll_apeak_yz(1,10000);


      roll_apeak_yz(2,10000);


      roll_apeak_yz(3,10000);


      roll_apeak_yz(0,10000);


      roll_apeak_yz(1,10000);


      roll_apeak_yz(2,10000);


      roll_apeak_yz(3,10000);


      for (i=0;i<3;i++)//下雨点字


               {


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


                         {


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


                                  {


                                           if ((table_3p[i][j]>>k)&1)


                                           {


                                                     for (z=1;z<8;z++)


                                                              {


                                                                       point (j,7-k,z,1);


                                                                       if (z-1)


                                                                       point (j,7-k,z-1,0);


                                                                       delay(5000);

 

// delay(5000);//下雨速度。。。

// delay(5000);


                                                              }

//delay(5000);

delay(5000);


                                           }


                                  }


                         }

delay(5000);

                         trans(7,15000);


               }


}


void flash_7()


{


      uchar i;


      uint a=3000;


      roll_apeak_yz(0,10000);


      roll_apeak_yz(1,10000);


      roll_apeak_yz(2,10000);


      roll_apeak_yz(3,10000);


      roll_apeak_yz(0,10000);


      roll_apeak_yz(1,10000);


      roll_apeak_yz(2,10000);


      roll_apeak_yz(3,10000);


      roll_apeak_yz(0,10000);


      roll_apeak_yz(1,10000);


      roll_apeak_yz(2,10000);


      roll_apeak_xy(0,10000);


      roll_apeak_xy(1,10000);


      roll_apeak_xy(2,10000);


      roll_apeak_xy(3,10000);


      roll_apeak_xy(0,10000);


      roll_apeak_xy(1,10000);


      roll_apeak_xy(2,10000);


      roll_apeak_xy(3,10000);


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


      {


               box_apeak_xy (0,i,0,7-i,i,7,1,1);


               delay(a);


      }


      delay(30000);


      roll_3_xy(0,a);


      delay(30000);


      roll_3_xy(1,a);


      delay(30000);


      roll_3_xy(2,a);


      delay(30000);


      roll_3_xy(3,a);


      delay(30000);


      roll_3_xy(0,a);


      delay(30000);


      roll_3_xy(1,a);


      delay(30000);


      roll_3_xy(2,a);


      delay(30000);


      roll_3_xy(3,a);


      for (i=7;i>0;i--)


      {


               box_apeak_xy(i,0,0,i,7,7,1,0);


               delay(a);


      }


}


void flash_8()


{


      uchar i;


      for (i=5;i<8;i++)


      {


               tranoutchar(i,20000);


               delay(600000);


               delay(600000);

    delay(600000);

    delay(600000);


      }


}


void flash_9()


{


      char i;


      uchar j,an[8],x,y,t,x1,y1;


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


      {


               box_apeak_xy (i,0,0,i,7,7,1,1);


               if (i)


               box_apeak_xy (i-1,0,0,i-1,7,7,1,0);


               delay(10000);


      }


      roll_apeak_xy(3,10000);


      roll_apeak_xy(0,10000);


      roll_apeak_xy(1,10000);


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


      {


               line(6-i,6-i,0,6-i,6-i,7,1);


               line(i,7,0,i,7,7,0);


               delay(10000);


      }


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


               an[i]=14;


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


      {


               clear(0);


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


               {


                         t=an[j]%28;


                         x=dat2[t]>>5;


                         y=(dat2[t]>>2)&0x07;


                         t=(an[j]-14)%28;


                         x1=dat2[t]>>5;


                         y1=(dat2[t]>>2)&0x07;


                         line(x,y,j,x1,y1,j,1);


               }


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


               {


               if ((i>j)&(j>i-71))


               an[j]++;


               } 


               delay(5000);


      }


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


      {


               clear(0);


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


               {


                         t=an[j]%28;


                         x=dat2[t]>>5;


                         y=(dat2[t]>>2)&0x07;


                         t=(an[j]-14)%28;


                         x1=dat2[t]>>5;


                         y1=(dat2[t]>>2)&0x07;


                         line(x,y,j,x1,y1,j,1);


               }


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


               {


               if ((i>j)&(j>i-71))


               an[j]--;


               } 


               delay(5000);


      }


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


      {


               clear(0);




               t=an[0]%28;


               x=dat2[t]>>5;


               y=(dat2[t]>>2)&0x07;


               t=(an[0]-14)%28;


               x1=dat2[t]>>5;


               y1=(dat2[t]>>2)&0x07;


               box_apeak_xy(x,y,0,x1,y1,7,0,1);


               box_apeak_xy(x,y,1,x1,y1,6,0,1);


               an[0]++; 


               delay(5000);


      }


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


      {


               clear(0);




               t=an[0]%28;


               x=dat2[t]>>5;


               y=(dat2[t]>>2)&0x07;


               t=(an[0]-14)%28;


               x1=dat2[t]>>5;


               y1=(dat2[t]>>2)&0x07;


               box_apeak_xy(x,y,0,x1,y1,7,1,1);


               an[0]--; 


               delay(5000);


      }


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


      {


               line(i,i,0,0,0,i,0);


               delay(5000);


      }


      for (i=1;i<7;i++)


      {


               line(i,i,7,7,7,i,0);


               delay(5000);


      }


      for (i=1;i<8;i++)


      {


               clear(0);


               box(7,7,7,7-i,7-i,7-i,0,1);


               delay(10000);


      }


      for (i=1;i<7;i++)


      {


               clear(0);


               box(0,0,0,7-i,7-i,7-i,0,1);


               delay(10000);


      }


      for (i=1;i<8;i++)


      {


               clear(0);


               box(0,0,0,i,i,i,0,1);


               delay(10000);


      }


      for (i=1;i<7;i++)


      {


               clear(0);


               box(7,0,0,i,7-i,7-i,0,1);


               delay(10000);


      }


      for (i=1;i<8;i++)


      {


               box(7,0,0,7-i,i,i,1,1);


               delay(10000);


      }


      for (i=1;i<7;i++)


      {


               clear(0);


               box(0,7,7,7-i,i,i,1,1);

               delay(10000);


      }


}


void flash_10()


{


      uchar i,j,an[4],x,y,t;


      for (i=1;i<7;i++)


      {


               


               clear(0);


               box(0,6,6,1,7,7,1,1);


               box(i,6,6-i,i+1,7,7-i,1,1);


               box(i,6,6,i+1,7,7,1,1);


               box(0,6,6-i,1,7,7-i,1,1);


               box(0,6-i,6,1,7-i,7,1,1);


               box(i,6-i,6-i,i+1,7-i,7-i,1,1);


               box(i,6-i,6,i+1,7-i,7,1,1);


               box(0,6-i,6-i,1,7-i,7-i,1,1);


               delay(30000);


      }


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


      {


               an[i]=6*i;


      }


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


      {


               clear(0);


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


               {


                         t=an[j]%24;


                         x=dat3[t]>>4;


                         y=dat3[t]&0x0f;


                         box(x,y,0,x+1,y+1,1,1,1);


                         box(x,y,6,x+1,y+1,7,1,1);


               }


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


               an[j]++; 


               delay(10000);


      }


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


      {


               clear(0);


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


               {


                         t=an[j]%24;


                         x=dat3[t]>>4;


                         y=dat3[t]&0x0f;


                         box(x,y,0,x+1,y+1,1,1,1);


                         box(x,y,6,x+1,y+1,7,1,1);


               }


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


               an[j]--; 


               delay(10000);


      }


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


      {


               clear(0);


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


               {


                         t=an[j]%24;


                         x=dat3[t]>>4;


                         y=dat3[t]&0x0f;


                         box(x,0,y,x+1,1,y+1,1,1);


                         box(x,6,y,x+1,7,y+1,1,1);


               }


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


               an[j]++; 


               delay(10000);


      }


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


      {


               clear(0);


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


               {


                         t=an[j]%24;


                         x=dat3[t]>>4;


                         y=dat3[t]&0x0f;


                         box(x,0,y,x+1,1,y+1,1,1);


                         box(x,6,y,x+1,7,y+1,1,1);


               }


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


               an[j]--; 


               delay(10000);


      }


      for (i=6;i>0;i--)


      {


               


               clear(0);


               box(0,6,6,1,7,7,1,1);


               box(i,6,6-i,i+1,7,7-i,1,1);


               box(i,6,6,i+1,7,7,1,1);


               box(0,6,6-i,1,7,7-i,1,1);


               box(0,6-i,6,1,7-i,7,1,1);


               box(i,6-i,6-i,i+1,7-i,7-i,1,1);


               box(i,6-i,6,i+1,7-i,7,1,1);


               box(0,6-i,6-i,1,7-i,7-i,1,1);


               delay(30000);


      }


}


void flash_11()


{



      uchar i,j,t,x,y;


      uchar code daa[13]={0,1,2,0x23,5,6,7,6,5,0x23,2,1,0};


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


      {


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


               {


                         if (daa[i]>>4)


                         {


                                  t=daa[i]&0x0f;


                                  line (0,0,t+1,0,7,t+1,1);


                         }


                         else 


                                  t=daa[i];


                         line (0,0,t,0,7,t,1);


                         transss();


                         delay(10000);


               }


      }


      for (j=1;j<8;j++)


      {


               if (j>3)


                         t=4;


               else


                         t=j;


               for (i=0;i<24;i+=j)


               {


                         x=dat3[i]>>4;


                         y=dat3[i]&0x0f;


                         box_apeak_xy(0,x,y,0,x+1,y+1,1,1);


                         transss();


                         delay(10000);


               }


      }


      for (j=1;j<8;j++)


      {


               if (j>3)


                         t=4;


               else


                         t=j;


               for (i=0;i<24;i+=j)


               {


                         x=dat3[i]>>4;


                         y=dat3[i]&0x0f;


                         point (0,x,y,1);


                         transss();


                         delay(10000);


               }


      }


}




/*flash_a()//box伸缩

{

char i;


////////////////////////1//////////////////////////////////////////

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


      {


               line(i,i,0,0,0,i,0);


               delay(5000);

delay(5000);


      }


      for (i=1;i<7;i++)


      {


               line(i,i,7,7,7,i,0);


               delay(5000);

delay(5000);


      }

///////////////////////////2//////////////////////////////////////////


      for (i=1;i<8;i++)


      {


               clear(0);


               box(7,7,7,7-i,7-i,7-i,0,1);


               delay(10000);

delay(5000);


      }


      for (i=1;i<7;i++)


      {


               clear(0);


               box(0,0,0,7-i,7-i,7-i,0,1);


               delay(10000);

delay(5000);


      }

///////////////////////////3/////////////////////////////////////////////


      for (i=1;i<8;i++)


      {


               clear(0);


               box(0,0,0,i,i,i,0,1);


               delay(10000);

delay(5000);


      }


      for (i=1;i<7;i++)


      {


               clear(0);


               box(7,0,0,i,7-i,7-i,0,1);


               delay(10000);

delay(5000);


      }

/////////////////////////////4////////////////////////////////////////////////////

      for (i=1;i<8;i++)


      {


               box(7,0,0,7-i,i,i,0,1);


               delay(10000);

delay(5000);


      }


      for (i=1;i<7;i++)


      {


               clear(0);


               box(0,7,7,7-i,i,i,0,1);

               delay(10000);

delay(5000);


      }


}




rolldisplayoff(uint speed)

{

uchar j;

char i,a;

for (i=23;i>-40;i--)

{

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

{

a=i+j;

if ((a>=0)&(a<24))

boxtola(a,table_off[j]);

}

delay(speed);

}

}

*/

fft.h

typedef unsigned char uchar;

typedef unsigned int  uint; 



#define channel      0x01  //设置AD通道为 P1.0

#define ADC_POWER   (1<<7) 

#define ADC_SPEEDHH (0x03<<5) 

#define ADC_START   (1<<3) 

#define PADCH       (1<<5) 

#define ADC_FLAG    (1<<4)



code char SIN_TAB[128]={0,6,12,18,24,30,36,42,48,54,59,65,70,75,80,85,89,94,98,102, 

                        105,108,112,114,117,119,121,123,124,125,126,126,126,126,126,

125,124,123,121,119,117,114,112,108,105,102,98,94,89,85,80,75,

70,65,59,54,48,42,36,30,24,18,12,6,0,-6,-12,-18,-24,-30,-36,-42,

-48,-54,-59,-65,-70,-75,-80,-85,-89,-94,-98,-102,-105,-108,-112,

-114,-117,-119,-121,-123,-124,-125,-126,-126,-126,-126,-126,-125,

-124,-123,-121,-119,-117,-114,-112,-108,-105,-102,-98,-94,-89,-85,

-80,-75,-70,-65,-59,-54,-48,-42,-36,-30,-24,-18,-12,-6};


//放大128倍后的cos整数表(128)

code char COS_TAB[128]={127,126,126,125,124,123,121,119,117,114,112,108,105,102,98,94, 

                        89,85,80,75,70,65,59,54,48,42,36,30,24,18,12,6,0,-6,-12,-18,-24,

-30,-36,-42,-48,-54,-59,-65,-70,-75,-80,-85,-89,-94,-98,-102,

-105,-108,-112,-114,-117,-119,-121,-123,-124,-125,-126,-126,-126,

-126,-126,-125,-124,-123,-121,-119,-117,-114,-112,-108,-105,-102,

-98,-94,-89,-85,-80,-75,-70,-65,-59,-54,-48,-42,-36,-30,-24,-18,

-12,-6,0,6,12,18,24,30,36,42,48,54,59,65,70,75,80,85,89,94,98,102,

105,108,112,114,117,119,121,123,124,125,126,126};


//采样存储序列表

code char LIST_TAB[128] = {0,64,32,96,16,80,48,112,8,72,40,104,24,88,56,120,4,68,36,100,20,84,52,116,

                           12,76,44,108,28,92,60,124,2,66,34,98,18,82,50,114,10,74,42,106,26,90,58,

  122,6,70,38,102,22,86,54,118,14,78,46,110,30,94,62,126,1,65,33,97,17,81,49,

  113,9,73,41,105,25,89,57,121,5,69,37,101,21,85,53,117,13,77,45,109,29,93,61,

  125,3,67,35,99,19,83,51,115,11,75,43,107,27,91,59,123,7,71,39,103,23,87,55,

  119,15,79,47,111,31,95,63,127};


/*uint8 LED[32]={0x80,0xC0,0xE0,0xF0,

               0xF8,0xFC,0xFE,0xFF,

               };*/

 

 

 

 


uchar i = 0,j = 0,k = 0;    //

uchar b = 0,p = 0;//anum; //  


int   Temp_Real = 0,Temp_Imag = 0,temp = 0;         //中间临时变量  

uint  TEMP1 = 0,maxa = 0; //中间临时变量

int   xdata Fft_Real[128]; //FFT的实部

int   xdata Fft_Image[128];             //FFT的虚部 

//uchar xdata LED_TAB2[16]; //记录 漂浮物 是否需要 停顿一下

uchar xdata LED_TAB[16]; //记录红色柱状 

//uchar xdata LED_TAB1[16]; //记录 漂浮点




void FFT() //基2fft

{                 

for(i=1; i<=7; i++)                             /* for(1) */

b=1;

b <<=(i-1);                                 //碟式运算,用于计算隔多少行计算例如 第一极 1和2行计算

for(j=0; j<=b-1; j++)                      /* for (2) */

p=1;

p <<= (7-i);            

p = p*j;

for(k=j; k<128; k=k+2*b)               /* for (3)  */

Temp_Real=Fft_Real[k];

Temp_Imag=Fft_Image[k];

temp=Fft_Real[k+b];

Fft_Real[k]=Fft_Real[k]+((Fft_Real[k+b]*COS_TAB[p])>>7)+((Fft_Image[k+b]*SIN_TAB[p])>>7);

Fft_Image[k]=Fft_Image[k]-((Fft_Real[k+b]*SIN_TAB[p])>>7)+((Fft_Image[k+b]*COS_TAB[p])>>7);

Fft_Real[k+b]=Temp_Real-((Fft_Real[k+b]*COS_TAB[p])>>7)-((Fft_Image[k+b]*SIN_TAB[p])>>7);

Fft_Image[k+b]=Temp_Imag+((temp*SIN_TAB[p])>>7)-((Fft_Image[k+b]*COS_TAB[p])>>7);          // 移位.防止溢出. 结果已经是本值的 1/64               

Fft_Real[k] >>= 1;             

Fft_Image[k] >>= 1; 

Fft_Real[k+b] >>= 1;                 

Fft_Image[k+b] >>= 1;  

}     


for(j=0;j<16;j++) //16分频  

{  

TEMP1=((((Fft_Real[j+1]* Fft_Real[j+1]))+((Fft_Image[j+1]*Fft_Image[j+1])))>>1);//求各频段幅值


if(TEMP1<1) TEMP1=0; 

LED_TAB[j]  = TEMP1;


if(LED_TAB[j]>maxa) maxa = LED_TAB[j];   //maxa是本次转换的最大值

}

if(maxa>16) //分级量化

{

maxa /= 16;

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

LED_TAB[j] /= maxa;

//LED_TAB[j] = 0;

}       

}





void delay2us(void)   //2us延时

{

    unsigned char a=0,b=0;

    for(b=112;b>0;b--)

        for(a=113;a>0;a--);

}


/* void delayms(void)   //2us延时

/* {

/*     unsigned char a,b;

/*     for(b=222;b>0;b--)

/*         for(a=223;a>0;a--);

/* }*/

zimo.h

#ifndef __zimo_H_

#define __zimo_H_

#define uchar unsigned char 

#define uint unsigned  int

uchar code ceng[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

/*rank:A,1,2,3,4,I,心,U*/

uchar code table_cha[8][8]={0x66,0xff,0xff,0xff,0x7e,0x3c,0x18,0x18,


0x18,0x1c,0x18,0x18,0x18,0x18,0x18,0x3c,

0x3c,0x66,0x66,0x30,0x18,0xc,0x6,0xf6,

0x3c,0x66,0x60,0x38,0x60,0x60,0x66,0x3c,

0x30,0x38,0x3c,0x3e,0x36,0x7e,0x30,0x30,

0x3c,0x3c,0x18,0x18,0x18,0x18,0x3c,0x3c,

0x66,0xff,0xff,0xff,0x7e,0x3c,0x18,0x18,

0x66,0x66,0x66,0x66,0x66,0x66,0x7e,0x3c};


uchar code table_id[40]   ={/*





//0x7E,0x10,0x10,0x7E,/*"H",0*/


//0x00,0x00,0x00,0x00,/*" ",1*/


//0x46,0x38,0x3C,0x42,/*"X",2*/


//0x00,0x00,0x00,0x00,/*" ",3*/


//0x06,0x38,0x0C,0x02,/*"Y",4*/



0x80,0x84,0xFC,0x04,/*"J",0*/


0x68,0x58,0x78,0x40,/*"a",1*/


0x78,0x48,0x7C,0x00,/*"d",2*/


0x00,0x70,0x58,0x58,/*"e",3*/


0x00,0x00,0x00,0x00,/*" ",4*/


0x00,0x44,0x7C,0x44,/*"I",0*/




0x00,0x7C,0x40,0x40,/*"L",6*/


0x04,0x4C,0x70,0x4C,/*"Y",7*/





};


uchar code table_off[40]={ 


0x3C,0x42,0x44,0x38,/*"O",0*/


0x00,0x00,0x00,0x00,/*" ",1*/


0x7E,0x12,0x02,0x02,/*"F",2*/


0x00,0x00,0x00,0x00,/*" ",3*/


0x7E,0x12,0x02,0x02,/*"F",4*/


};

/*railway*/

uchar code dat[128]={0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,0xdc,0xbc,0x9c,0x7c,0x5c,0x3c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4,0x25,0x45,0x65,0x85,0xa5,0xc5,0xc9,0xcd,0xd1,0xd5,0xd9,0xb9,0x99,0x79,0x59,0x39,0x35,0x31,0x2d,0x29,0x4a,0x6a,0x8a,0xaa,0xae,0xb2,0xb6,0x96,0x76,0x56,0x52,0x4e,0x6f,0x8f,0x93,0x73,0x6f,0x8f,0x93,0x73,0x4a,0x6a,0x8a,0xaa,0xae,0xb2,0xb6,0x96,0x76,0x56,0x52,0x4e,0x25,0x45,0x65,0x85,0xa5,0xc5,0xc9,0xcd,0xd1,0xd5,0xd9,0xb9,0x99,0x79,0x59,0x39,0x35,0x31,0x2d,0x29,0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,0xdc,0xbc,0x9c,0x7c,0x5c,0x3c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4};

/*railway 2*/

uchar code dat2[28]={0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,0xdc,0xbc,0x9c,0x7c,0x5c,0x3c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4};

/*railway 3*/

uchar code dat3[24]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x16,0x26,0x36,0x46,0x56,0x66,0x65,0x64,0x63,0x62,0x61,0x60,0x50,0x40,0x30,0x20,0x10};

/*3p char*/

uchar code table_3p[3][8]={0xff,0x89,0xf5,0x93,0x93,0xf5,0x89,0xff,

0x0e,0x1f,0x3f,0x7e,0x7e,0x3f,0x1f,0x0e,

0x18,0x3c,0x7e,0xff,0x18,0x18,0x18,0x18};

#endif


楼主可见