fft.c
来自「用单片机做的音频功率谱分析」· C语言 代码 · 共 816 行 · 第 1/2 页
C
816 行
temp7 = (aa) % 10;
LCD_WData(temp1+48);
LCD_WData(temp2+48);
LCD_WData(temp3+48);
LCD_WData(temp4+48);
LCD_WData(temp5+48);
LCD_WData(temp6+48);
LCD_WData(temp7+48);
}
void LCD_DisFreNo(int a)
{
uchar temp1 = 0;
uchar temp2 = 0;
uchar temp3 = 0;
int aa = a;
temp1 = (aa)/100;
temp2 = (aa - temp1*100)/10;
temp3 = (aa) % 10;
// if(temp1 == 0)
LCD_WData(temp1+48);
// if(temp2 != 0)
LCD_WData(temp2+48);
LCD_WData(temp3+48);
}
void LCD_DisFloat(float a)
{
uchar temp1 = 0;
uchar temp2 = 0;
uchar temp3 = 0;
uchar temp4 = 0;
uchar temp5 = 0;
uchar temp6 = 0;
uchar temp7 = 0;
uchar temp8 = 0;
float bb = a;
unsigned long aa = (long)(a);
temp1 = (aa)/100;
temp2 = (aa - temp1*100)/10;
//temp3 = (aa - temp1*1000 - temp2*100)/10;
temp4 = (aa) % 10;
temp5 = (long)(bb*10)%10;
temp6 = (long)(bb*100)%10;
temp7 = (long)(bb*1000)%10;
temp8 = (long)(bb*10000)%10;
// if(temp1 != 0)
LCD_WData(temp1+48);
// if(temp2 != 0)
LCD_WData(temp2+48);
LCD_WData(temp4+48);
// LCD_WData(temp4+48);
LCD_WString(".");
LCD_WData(temp5+48);
LCD_WData(temp6+48);
LCD_WData(temp7+48);
LCD_WData(temp8+48);
}
void time1_sample() interrupt 1
{
if(Sample_cnt < 256)
{
DataHigh = AD574_8;
Ad8[Sample_cnt] = DataHigh;
DataLow = AD574_4;
Ad4[Sample_cnt] = DataLow;
AD574_START = 0x00;
Sample_cnt ++;
}
else
{
//EA = 0;
ET0 = 0;
Sample_cnt = 0;
UnFinish = 0;
}
}
void key_int1_pause() interrupt 0
{
/* uchar pause = 0;
if(!P32)
for(pause = 0; pause < 255; pause++){;}
if(P32 == 0)
{
}
*/
// if(key_pause == 0)
key_pause = 1;
// else if(key_pause == 1)
// key_pause = 0;
//LCD_WPos(1,1);
//LCD_WString("中断了");
//while(1);
}
void key_process()
{
uint i = 0;
int j = 0;
LCD_ClearLCD();
LCD_WPos(1,2);
LCD_WString("请按上、下键");
LCD_WPos(2,1);
LCD_WString("浏览各频率功率值");
LCD_WPos(4,1);
LCD_WString("失真度:");
LCD_DisFloat(err);
while(key_pause == 1)
{
//--------上键----------
while(k_up == 0)
{
for(i = 0; i < 30000; i++){;}//延时、消抖
if(k_up == 0 ) //&& k_down == 1
{
LCD_ClearLCD();
LCD_WPos(1,1);
LCD_WString("n 频率 功率/mW");
//第二行
key_dis_i++;
if(key_dis_i >= 98)
{
key_dis_i = 0;
}
LCD_WPos(2,1);
LCD_DisFreNo(key_dis_i+1);
LCD_WString(")");
LCD_DisFreNo(data_nm[key_dis_i]);
LCD_WString(":");
LCD_DisFloat(re[key_dis_i]);
//第三行
//key_dis_i++;
LCD_WPos(3,1);
LCD_DisFreNo(key_dis_i+2);
LCD_WString(")");
LCD_DisFreNo(data_nm[key_dis_i+1]);
LCD_WString(":");
LCD_DisFloat(re[key_dis_i+1]);
//第四行
//key_dis_i++;
LCD_WPos(4,1);
LCD_DisFreNo(key_dis_i+3);
LCD_WString(")");
LCD_DisFreNo(data_nm[key_dis_i+2]);
LCD_WString(":");
LCD_DisFloat(re[key_dis_i+2]);
}
else{ break; }
}
//---------下键-----------
while(k_down == 0)
{
for(i = 0; i < 30000; i++){;}//延时、消抖
if(k_down == 0) // && k_up == 1
{
LCD_ClearLCD();
LCD_WPos(1,1);
LCD_WString("频率 功率/mW");
key_dis_i -= 2;
//第二行
key_dis_i++;
if(key_dis_i < 0)
{
key_dis_i = 97;
}
LCD_WPos(2,1);
LCD_DisFreNo(key_dis_i+1);
LCD_WString(")");
LCD_DisFreNo(data_nm[key_dis_i]);
LCD_WString(":");
LCD_DisFloat(re[key_dis_i]);
//第三行
//key_dis_i++;
if(key_dis_i < 0)
{
LCD_WPos(3,1);
LCD_WString(" 到达频率下限");
LCD_WPos(4,1);
}
else
{
LCD_WPos(3,1);
LCD_DisFreNo(key_dis_i+2);
LCD_WString(")");
LCD_DisFreNo(data_nm[key_dis_i+1]);
LCD_WString(":");
LCD_DisFloat(re[key_dis_i+1]);
}
//第四行
//key_dis_i++;
if(key_dis_i < 0)
{
LCD_WPos(4,1);
LCD_WString(" 到达频率下限");
}
else
{
LCD_WPos(4,1);
LCD_DisFreNo(key_dis_i+3);
LCD_WString(")");
LCD_DisFreNo(data_nm[key_dis_i+2]);
LCD_WString(":");
LCD_DisFloat(re[key_dis_i+2]);
}
}
else{ break; }
}
//------------频谱键--------------
while(k_spec == 0)
{
for(i = 0; i < 30000; i++){;}//延时、消抖
if(k_spec == 0)
{
key_pause = 0;
}
else{ break; }
}
while(k_down == 0 && k_up == 0)
{
for(i = 0; i < 65535; i++);
if(k_down == 0 && k_up == 0)
{
draw_spec();
}
}
}//end of while(key_pause == 1)
LCD_ClearLCD();
}
void BubbleSort(float* pData,int Count)
{
float iTemp; //定义交换的中间变量
int i,j,p;
for( i=1;i<Count;i++)
{
for( j=Count-1;j>=i;j--)
{
if(pData[j]>pData[j-1]) //将其按升序排列
{
iTemp = pData[j-1];
p=data_nm[j-1];
pData[j-1] = pData[j];
data_nm[j-1]=data_nm[j];
pData[j] = iTemp;
data_nm[j] = p;
}
}
}
}
void draw_spec()
{
/*绘制频谱图*/
int page = 0;
int k = 0;
int i = 0;
int j = 0;
int col = 0;
LCD_WCom(0x0c);
LCD_WCom(0x34);
LCD_WCom(0x36);
for(i = 0; i < 64; i++)
{
for(j = 0; j < 16; j++)
{
buffer[i][j] = 0x00;
}
}
for(i = 0; i < 16; i++)
{
buffer[(uchar)(64-re[i*8]/Dis_scale)][i] |= 0x80;
buffer[(uchar)(64-re[i*8+1]/Dis_scale)][i] |= 0x40;
buffer[(uchar)(64-re[i*8+2]/Dis_scale)][i] |= 0x20;
buffer[(uchar)(64-re[i*8+3]/Dis_scale)][i] |= 0x10;
buffer[(uchar)(64-re[i*8+4]/Dis_scale)][i] |= 0x08;
buffer[(uchar)(64-re[i*8+5]/Dis_scale)][i] |= 0x04;
buffer[(uchar)(64-re[i*8+6]/Dis_scale)][i] |= 0x02;
buffer[(uchar)(64-re[i*8+7]/Dis_scale)][i] |= 0x01;
}
for(i = 0; i < 16; i++)
{
for(j = 0; j < 64; j++)
{
if(buffer[j][i] & 0x80)
{
for(k = j; k < 64; k++)
{
buffer[j][i] |= 0x80;
}
break;
}
}
for(j = 0; j < 64; j++)
{
if(buffer[j][i] & 0x40)
{
for(k = j; k < 64; k++)
{
buffer[j][i] |= 0x40;
}
break;
}
}
for(j = 0; j < 64; j++)
{
if(buffer[j][i] & 0x20)
{
for(k = j; k < 64; k++)
{
buffer[j][i] |= 0x20;
}
break;
}
}
for(j = 0; j < 64; j++)
{
if(buffer[j][i] & 0x10)
{
for(k = j; k < 64; k++)
{
buffer[j][i] |= 0x10;
}
break;
}
}
for(j = 0; j < 64; j++)
{
if(buffer[j][i] & 0x08)
{
for(k = j; k < 64; k++)
{
buffer[j][i] |= 0x08;
}
break;
}
}
for(j = 0; j < 64; j++)
{
if(buffer[j][i] & 0x04)
{
for(k = j; k < 64; k++)
{
buffer[j][i] |= 0x04;
}
break;
}
}
for(j = 0; j < 64; j++)
{
if(buffer[j][i] & 0x02)
{
for(k = j; k < 64; k++)
{
buffer[j][i] |= 0x02;
}
break;
}
}
for(j = 0; j < 64; j++)
{
if(buffer[j][i] & 0x01)
{
for(k = j; k < 64; k++)
{
buffer[j][i] |= 0x01;
}
break;
}
}
}
page = 0;//实际行
//上半屏
for(i = 0; i < 32; i++)
{
page = 0x80 | i;
col = 0x80;
LCD_WCom(page);
LCD_WCom(col);
for(j = 0; j < 16; j++)
{
LCD_WData(buffer[i][j]);
}
}
//下半屏
for(i = 0; i < 32; i++)
{
page = 0x80 | i;
col = 0x88;
LCD_WCom(page);
LCD_WCom(col);
for(j = 0; j < 16; j++)
{
LCD_WData(buffer[i+32][j]);
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?