u32 PageCurveSet(u8 event) { static u8 DrawMask; static u8 iStk; static u8 iFocus,Total,iStart; if(event==PV_INIT) { LcdClear(0); iStk=0; iFocus=CURVE_NUM; iStart=0; Total=CURVE_NUM+CURVE_FUNC; DrawMask=PD_ALL; return 1; } if(event==PV_USER) { LcdClear(0); DrawMask=PD_ALL; } //开始绘图 if(DrawMask) { LcdDrawStart(0, 0,LCD_W-1, LCD_H-1, DRAW_NWSE); //标题绘制 if(DrawMask&PD_TITLE) { LcdDrawRect(0, 0,127,13,0); LcdDrawText(2,0,(char*)PageCurveTitle[iStk]); if(PageCurveCnt>1) LcdDrawText(96,0,"\1ENT\x2"); LcdDrawHLine(0,LCD_CV_X-2,14,1); LcdDrawHLine(0,LCD_CV_X-2,15,1); } //曲线点列表 if(DrawMask&(PD_LIST|PD_VALUE)) { u16 i,x,y,idx; for(i=0,y=18;i<LCD_CURVE_LINES ;i++,y+=7) { idx=iStart+i; LcdBw=(idx==iFocus); LcdDrawRect(LCD_CV_IX,y,LCD_CV_IX+31,y+7,LcdBw); //绘制选中框 LcdDrawMiniInt(LCD_CV_IX+3,y+1,idx+1,1,0,0xff,0); //绘制曲线序号 LcdDrawMiniNum(LCD_CV_IX+7,y+1,LCD_MN_COL); //绘制分隔点 LcdDrawMiniInt(LCD_CV_IX+30,y+1,PageCurveValue[iStk*CURVE_DS+idx],0,1,0,1); //绘制曲线值 LcdBw=0; } //绘制EXP EPA菜单 LcdBw=(iFocus==CURVE_NUM); LcdDrawRect(3,20,LCD_CV_IX-4,26,LcdBw); LcdDrawMiniEng(5,21,"EPA\x12"); LcdDrawMiniInt(40,21,PageCurveValue[iStk*CURVE_DS+CURVE_NUM],0,0,1,1); //绘制EPA LcdBw=(iFocus==CURVE_NUM+1); LcdDrawRect(3,30,LCD_CV_IX-4,36,LcdBw); LcdDrawMiniEng(5,31,"EXP\x12"); LcdDrawMiniInt(40,31,PageCurveValue[iStk*CURVE_DS+CURVE_NUM+1],0,0,1,1);//绘制EXP LcdBw=(iFocus==CURVE_NUM+2); LcdDrawRect(3,40,LCD_CV_IX-4,46,LcdBw); LcdDrawMiniEng(5,41,"LEVEL"); LcdBw=(iFocus==CURVE_NUM+3); LcdDrawRect(3,50,LCD_CV_IX-4,56,LcdBw); LcdDrawMiniEng(5,51,"RESET"); LcdBw=0; //绘制曲线 LcdDrawRect(LCD_CV_X,LCD_CV_Y,LCD_CV_X+LCD_CV_W,LCD_CV_Y+LCD_CV_H,1); LcdDrawRect(LCD_CV_X+1,LCD_CV_Y+1,LCD_CV_X+LCD_CV_W-1,LCD_CV_Y+LCD_CV_H-1,0); LcdDrawHLine(LCD_CV_X,LCD_CV_X+LCD_CV_W,LCD_CV_Y+LCD_CV_H/2,1); LcdDrawVLine(LCD_CV_X+LCD_CV_W/2,LCD_CV_Y,LCD_CV_Y+LCD_CV_H,1); u16 x0,y0; for(i=0,x0=y0=0;i<CURVE_NUM;i++) { x=i*LCD_CV_W/(CURVE_NUM-1); y=LCD_CV_H-(s32)PageCurveValue[iStk*CURVE_DS+i]*LCD_CV_H/CURVE_TRV; if(y>LCD_CV_H) y=LCD_CV_H; LcdDrawLine(LCD_CV_X+x0,LCD_CV_Y+y0,LCD_CV_X+x,LCD_CV_Y+y,1); if(i==iFocus) LcdDrawVLine(LCD_CV_X+x,LCD_CV_Y,LCD_CV_Y+LCD_CV_H,1); x0=x; y0=y; } } //完成绘图 LcdDrawStop(); DrawMask=0; } //加减按键处理 s16 v=PageCurveValue[iStk*CURVE_DS+iFocus]; /////////////////////////////////////////////////////////////// if(iFocus<CURVE_NUM)//曲线值 { if(KeyTstHold(KEY_R)) { v=(v/10+1)*10; if(v>CURVE_TRV) v=CURVE_TRV; DrawMask=PD_LIST; } else if(KeyTstDown(KEY_R)) { if(v<CURVE_TRV) v++; DrawMask=PD_LIST; } if(KeyTstHold(KEY_L)) { v=(v/10-1)*10; if(v<0) v=0; DrawMask=PD_LIST; } else if(KeyTstDown(KEY_L)) { if(v>0) v--; DrawMask=PD_LIST; } } /////////////////////////////////////////////////////////////// else//EXP EPA等 { //////////////////////////////////////// if(iFocus==CURVE_NUM+3)//RESET { if(KeyTstDown(KEY_R) || KeyTstDown(KEY_L)) { u32 i; for(i=0;i<CURVE_NUM;i++) PageCurveValue[iStk*CURVE_DS+i]=i*125; PageCurveValue[iStk*CURVE_DS+CURVE_NUM ]=100; //epa PageCurveValue[iStk*CURVE_DS+CURVE_NUM+1]=0; //exp PageAlert("曲线参数已复位!",500,PV_USER); } } //////////////////////////////////////// if(iFocus==CURVE_NUM+2)//LEVEL { s16 delta=0; if(KeyTstHold(KEY_R)) delta=10; else if(KeyTstDown(KEY_R)) delta=1; if(KeyTstHold(KEY_L)) delta=-10; else if(KeyTstDown(KEY_L)) delta=-1; if(delta) { for(u32 i=0;i<CURVE_NUM;i++) { s16 v=PageCurveValue[iStk*CURVE_DS+i]; v+=delta; if(v>1000) v=1000; if(v<0) v=0; PageCurveValue[iStk*CURVE_DS+i]=v; } DrawMask=PD_LIST; } } //////////////////////////////////////// if(iFocus==CURVE_NUM+1)//EXP { if(KeyTstDown(KEY_R)) if(v<50) v++; if(KeyTstDown(KEY_L)) if(v>0) v--; if(PageCurveValue[iStk*CURVE_DS+CURVE_NUM+1]!=v) { CurveMake(&PageCurveValue[iStk*CURVE_DS],PageCurveValue[iStk*CURVE_DS+CURVE_NUM],v); DrawMask=PD_LIST; } } //////////////////////////////////////// if(iFocus==CURVE_NUM)//EPA { if(KeyTstDown(KEY_R)) if(v<100) v++; if(KeyTstDown(KEY_L)) if(v>-100) v--; if(PageCurveValue[iStk*CURVE_DS+CURVE_NUM]!=v) { CurveMake(&PageCurveValue[iStk*CURVE_DS],v,PageCurveValue[iStk*CURVE_DS+CURVE_NUM+1]); DrawMask=PD_LIST; } } } PageCurveValue[iStk*CURVE_DS+iFocus]=v; /////////////////////////////////////////////////////////////// //上下按键处理 if(KeyTstDown(KEY_UP)) { if(iFocus>0) iFocus--; else iFocus=Total-1; DrawMask=PD_LIST|PD_IDX; } if(KeyTstDown(KEY_DW)) { if(iFocus<Total-1) iFocus++; else iFocus=0; DrawMask=PD_LIST|PD_IDX; } if(iFocus>=Total) iFocus=Total-1; if(iFocus>=CURVE_NUM) iStart=0; else if(iFocus<iStart) iStart=iFocus; else if(iFocus>iStart+LCD_CURVE_LINES-1) iStart=iFocus-LCD_CURVE_LINES+1; /////////////////////////////////////////////////////////////// //回车键切换曲线 if(KeyTstDown(KEY_ENT) ) { iStk++; if(iStk>=PageCurveCnt) iStk=0; DrawMask|=PD_ALL; } /////////////////////////////////////////////////////////////// //返回键处理 if(KeyTstDown(KEY_EXT) ) { PageReturn(PV_REDRAW); } KeyClearDown(KEY_MENUALL); return 0; }
/******************************************************************** 函数功能:在LCD上显示频谱。 入口参数:无。 返 回:无。 备 注:无。 ********************************************************************/ void ShowSpectrum(void) { int i,x,y,j,p; //对输入信号进行缩小 for(i=0;i<LENGTH;i++) { AudioOutBuf[i]/=32; } FftInput(AudioOutBuf); //位倒序 FftExe(AudioOutBuf,Re,Im); //做FFT运算 LcdCls(); //清屏 //显示X、Y轴坐标 LcdSetPoint(0,35); LcdPrints("0V"); LcdDrawLine(13,39,15,39); LcdSetPoint(0,23); LcdPrints("1V"); LcdDrawLine(13,27,15,27); LcdSetPoint(0,11); LcdPrints("2V"); LcdDrawLine(13,15,15,15); LcdSetPoint(0,0); LcdPrints("3V"); LcdDrawLine(13,3,15,3); LcdSetPoint(14,40); LcdPrints("0"); LcdSetPoint(13+26,40); LcdPrints("3K"); LcdSetPoint(84-20,40); LcdPrints("16K"); //直流分量直接显示 x=17; y=MAX_HEIGHT-(Re[0]*MAX_HEIGHT/LENGTH)/1024; LcdDrawLine(x,y,x,MAX_HEIGHT); ProcPeak(0,y); //处理峰值 //每1点显示 for(i=1;i<14;i++) { x++; y=sqrt(Re[i]*Re[i]+Im[i]*Im[i]); //计算模值 y/=10; y=Compress(y); //压缩 y=MAX_HEIGHT-y; //换算为屏幕y轴位置 ProcPeak(i,y); //处理峰值 LcdDrawLine(x,y,x,MAX_HEIGHT); //画线 } //每2点显示 p=14; for(i=14;i<24;i++) { x++; y=0; for(j=0;j<2;j++) { y+=sqrt(Re[p]*Re[p]+Im[p]*Im[p]); //计算模值 p++; } y/=20; //取平均值 y=Compress(y); //压缩 y=MAX_HEIGHT-y; //换算为屏幕y轴位置 ProcPeak(i,y); //处理峰值 LcdDrawLine(x,y,x,MAX_HEIGHT); //画线 } //每3点显示 for(i=24;i<34;i++) { x++; y=0; for(j=0;j<3;j++) { y+=sqrt(Re[p]*Re[p]+Im[p]*Im[p]); //计算模值 p++; } y/=30; //取平均值 y=Compress(y); //压缩 y=MAX_HEIGHT-y; //换算为屏幕y轴位置 ProcPeak(i,y); //处理峰值 LcdDrawLine(x,y,x,MAX_HEIGHT); //画线 } //每4点显示 for(i=34;i<44;i++) { x++; y=0; for(j=0;j<4;j++) { y+=sqrt(Re[p]*Re[p]+Im[p]*Im[p]); //计算模值 p++; } y/=40; //取平均值 y=Compress(y); //压缩 y=MAX_HEIGHT-y; //换算为屏幕y轴位置 ProcPeak(i,y); //处理峰值 LcdDrawLine(x,y,x,MAX_HEIGHT); //画线 } //每6点显示 for(i=44;i<54;i++) { x++; y=0; for(j=0;j<6;j++) { y+=sqrt(Re[p]*Re[p]+Im[p]*Im[p]); //计算模值 p++; } y/=60; //取平均值 y=Compress(y); //压缩 y=MAX_HEIGHT-y; //换算为屏幕y轴位置 ProcPeak(i,y); //处理峰值 LcdDrawLine(x,y,x,MAX_HEIGHT); //画线 } //每9点显示 for(i=54;i<64;i++) { x++; y=0; for(j=0;j<9;j++) { y+=sqrt(Re[p]*Re[p]+Im[p]*Im[p]); //计算模值 p++; } y/=90; //取平均值 y=Compress(y); //压缩 y=MAX_HEIGHT-y; //换算为屏幕y轴位置 ProcPeak(i,y); //处理峰值 LcdDrawLine(x,y,x,MAX_HEIGHT); //画线 } for(i=0;i<64;i++) { LcdDrawPoint(i+17,Peak[i]); } LcdRefresh(); //刷新 }