基于DSP的可调信号发生器设计讲解.docx
《基于DSP的可调信号发生器设计讲解.docx》由会员分享,可在线阅读,更多相关《基于DSP的可调信号发生器设计讲解.docx(25页珍藏版)》请在冰点文库上搜索。
基于DSP的可调信号发生器设计讲解
DSP处理器及应用课程设计报告
(2012—2013学年第一学期)
题目基于DSP的可调信号发生器设计
系别电子与电气工程系
专业电子信息工程
班级0920311
学号092031101
姓名
指导教师
完成时间2013-1-6
评定成绩
一、设计的目的
根据已掌握的《DSP处理器及应用》课程知识,完成课程设计要求的项目。
了解正弦波的产生,以及正弦波幅值和频率的调整方法,掌握信号产生的一般方法并学习使用CCS图形显示功能进行程序调试。
通过硬件设计和程序编写过程,加深对《DSP处理器及应用》课程知识的理解和掌握,培养应用系统设计的能力,以及分析问题和解决问题的方法,并进一步拓宽专业知识面,培养实践应用技能和创新意识。
二、设计的内容与要求
1)在CCS中运行调试程序代码,输出正弦信号波形,并使用CCS的图像显示窗口,实时显示输出的正弦波。
2)使用DSPF2812的GPIO功能,读取外部手动按键的信号,相应改变正弦信号的幅值(幅值,采用有符号16位整型变量定义)。
3)使用DSPF2812的GPIO功能,读取外部手动按键的信号,相应改变正弦信号的周期(每周期的离散采样点数,采用有符号16位整型变量定义)。
4)使用DSPF2812的GPIO功能,读取外部手动按键的信号,相应输出正弦波、三角波、方波、锯齿波、梯形波。
5)用8个七段数码管,每隔一秒依次循环显示三种信息,包括:
①当前的幅值(格式为:
AP-00000~AP-32767);②每周期的离散采样点数(格式为:
tNUb-012~tNUb-512);③自己的学号(格式为学号的低8位,例如学号为092031234的同学,应当显示:
92031234)。
④显示日期(20130104)。
三、
显示幅值
设计方案
应用while循环语句来实现实验中所有程序的循环。
利用if语句实现波形切换与幅值、周期的改变。
应用中断switch来实现数码管循环显示幅值、周期、学号、日期。
四、软件、硬件设计
4.1软件调试
1、波形的显示
正弦波:
for(j=0;jsineTable[j]=sin(2*3.1416/sine_size*j)*gain+offset; 锯齿波:float_temp=100;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==1)float_temp=float_temp-200.0/sine_size;elseif(float_temp>=100&&Updownflag==0)float_temp=100;if(float_temp>=100){Updownflag=1;float_temp=90;}if(float_temp<=0){Updownflag=0;float_temp=100;}sineTable[j]=float_temp*gain/100-offset;}方波:float_temp=0;Updownflag=0;temp=0;for(j=1;j{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}if(temp>=(sine_size/2))Updownflag=1;if(temp>=sine_size){Updownflag=0;temp=0;}sineTable[j]=float_temp*gain+offset;}三角波:float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;sineTable[j]=float_temp*gain/100+offset;梯形波:max1(unsignedintx1){if(x3>x1)x3=x3;elsex3=x1;returnx3;}float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;sineTable[j]=float_temp*gain/100+offset;x2=max1(sineTable[j]);if(sineTable[j]>=x2*0.8+offset)sineTable[j]=0.8*x2+offset;if(sineTable[j]<=x2*0.2+offset)sineTable[j]=x2*0.2+offset;} 2、按键切换波形if((keyx==4)&&(keyy==3))选择正弦波{signaltype=0;}if((keyx==4)&&(keyy==2))选择三角波{signaltype=4;}if((keyx==4)&&(keyy==1))选择锯齿波{signaltype=2;}if((keyx==3)&&(keyy==3))选择方波{signaltype=3;}if((keyx==3)&&(keyy==2))选择tixing{signaltype=1;} 3、按键改变幅值与周期if((keyx==0)&&(keyy==3))增加幅值{gain=gain+500;if(gain>30000)gain=30000;}if((keyx==0)&&(keyy==1))减小幅值{gain=gain-500;if(gain<0)gain=0;}if((keyx==1)&&(keyy==0))减小周期{sine_size=sine_size-2;if(sine_size<12)sine_size=12;}if((keyx==4)&&(keyy==0))增大周期{sine_size=sine_size+2;if(sine_size>512)sine_size=512;} 4、数码管显示幅值://显示当前的幅值(格式为:AP-00000~AP-32767)//8个七段数码管赋初值0,全部灭AmpResult[7]=0xEE;//显示AAmpResult[6]=0xCE;//显示pAmpResult[5]=0x02;//显示-AmpResult[4]=LedCode[(gain/10000)%10];//显示幅值的万位AmpResult[3]=LedCode[(gain/1000)%10];//显示幅值的千位AmpResult[2]=LedCode[(gain/100)%10];//显示幅值的百位AmpResult[1]=LedCode[(gain/10)%10];//显示幅值十位AmpResult[0]=LedCode[gain%10];//显示幅值的个位周期://显示每周期的离散采样点数(格式为:tNUb-012~tNUb-512)sizeResult[7]=0x1E;//显示tsizeResult[6]=0xEC;//显示NsizeResult[5]=0x7C;//显示UsizeResult[4]=0x3E;//显示bsizeResult[3]=0x02;//显示-sizeResult[2]=LedCode[(sine_size/100)%10];//显示离散采样点数的百位sizeResult[1]=LedCode[(sine_size/10)%10];//显示离散采样点数的十位sizeResult[0]=LedCode[sine_size%10];//显示离散采样点数的个位学号:StudentNUM[8]={0x60,0xFC,0x60,0x60,0xF2,0xFC,0xDA,0xF6};//92031101日期:DAYTIME[8]={0x66,0xFC,0x60,0xFC,0xF2,0x60,0xFC,0xDA};//20130104利用中断程序执行显示:interruptvoidTINT0_ISR(void)//CPU-Timer0{CpuTimer0Regs.TCR.bit.TIF=1;//清除定时器的中断标志位PieCtrl.PIEACK.bit.ACK1=1;//写1,清楚中断中断应答位,以响应CPU定时器T0的同组(第一组INT1)其他中断switch(flag){case0:{flag++;//显示按键的列号keyx、行号keyyWriteLEDs(KeyResult);};break;case1:{flag++;//显示当前的幅值//(格式为:AP-00000~AP-32767)WriteLEDs(AmpResult);};break;case2:{flag++;//显示每周期的离散采样点数//(格式为:tNUb-012~tNUb-512)WriteLEDs(sizeResult);};break;case3:{flag++;//显示日期//(格式为:20130104)WriteLEDs(DAYTIME);};break;case4:{flag++;//显示学号:92031101WriteLEDs(StudentNUM);};break;case5:{flag=0;//显示日期:20130104WriteLEDs(DAYTIME);};break;default:flag=0;;break;}}4.2硬件调试按键功能定义,如下:4.3主程序#include"DSP28_Device.h"#include#include#definebuffer_size200unsignedintsine_size=20;unsignedinttemp;intcurrent[buffer_size];floatfloat_temp;intgain=10000;intoffset=0;intflag=0;intUpdownflag=0;intsignaltype=0;unsignedint*CPLDDREG=(unsignedint*)0x2004;unsignedint*CPLDDREGL=(unsignedint*)0x2006;unionCPLD_DREGLMYDREGL;unsignedintlednum[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0xEC,0xCE,0x7C,0x3E,0x1E};unsignedintDateNUM[8]={0x66,0xFC,0x60,0xFC,0xF2,0x60,0xFC,0xDA};unsignedintStudentNUM[8]={0x60,0xFC,0x60,0x60,0xF2,0xFC,0xDA,0xF6};unsignedintKeyResult[8];unsignedintAmpResult[8];unsignedintsizeResult[8];unsignedintcount;unsignedintkeypress=0;unsignedintx2,x3=0;unsignedintkeyx=0,keyy=0;unsignedintkeyx_temp=0,keyy_temp=0;voiddelay(unsignedint);voidldelay(unsignedint);voidWriteLED(unsignedint);voidWriteLEDs(unsignedint*);voidResultCon(void);voidDelay(Uint16);max1(intx1){if(x1>x3)x3=x1;returnx3;}voidmain(void){Uint16a=0x0800;unsignedinti,j;InitSysCtrl();DINT;IER=0x0000;IFR=0x0000;InitPieCtrl();InitPieVectTable();InitGpio();InitCpuTimers();PieCtrl.PIEIER1.bit.INTx7=1;IER|=M_INT1;EINT;ERTM;ConfigCpuTimer(&CpuTimer0,150,400000);StartCpuTimer0();for(i=0;i<8;i++)KeyResult[i]=0x00;WriteLEDs(KeyResult);while(1){GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;if(temp!=0x0780){delay(2000);GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;if(temp!=0x0780){delay(2000);flag=0;a=0x0800;for(i=0;i<5;i++){GpioDataRegs.GPADAT.all=0xffff;GpioDataRegs.GPADAT.all=GpioDataRegs.GPADAT.all&(~(a<delay(500);if(GpioDataRegs.GPADAT.bit.GPIOA10==0){keypress=1;keyx=i;keyy=0;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA9==0){keypress=1;keyx=i;keyy=1;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA8==0){keypress=1;keyx=i;keyy=2;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA7==0){keypress=1;keyx=i;keyy=3;break;}}delay(2000);GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;while(temp!=0x0780){GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;delay(500);x3=0;}for(i=0;i<8;i++)KeyResult[i]=0x00;KeyResult[7]=lednum[keyx];KeyResult[5]=lednum[keyy];if((keyx==0)&&(keyy==3)){gain=gain+500;if(gain>30000)gain=30000;}if((keyx==0)&&(keyy==1)){gain=gain-500;if(gain<0)gain=0;}if((keyx==1)&&(keyy==0)){sine_size=sine_size-2;if(sine_size<12)sine_size=12;}if((keyx==4)&&(keyy==0)){sine_size=sine_size+2;if(sine_size>512)sine_size=512;}if((keyx==4)&&(keyy==3)){signaltype=0;}if((keyx==4)&&(keyy==2)){signaltype=1;}if((keyx==4)&&(keyy==1)){signaltype=2;}if((keyx==3)&&(keyy==3)){signaltype=3;}if((keyx==3)&&(keyy==2)){signaltype=4;}for(j=0;jcurrent[j]=0;switch(signaltype){case0:{for(j=0;jcurrent[j]=cos(2*3.1416/sine_size*j)*gain+offset;};break;case1:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case2:{float_temp=0;Updownflag=0;for(j=buffer_size;j>0;j--){if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=0;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case3:{float_temp=0;Updownflag=0;temp=0;for(j=1;j{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}if(temp>=(sine_size/2))Updownflag=1;if(temp>=sine_size){Updownflag=0;temp=0;}current[j]=float_temp*gain+offset;}};break;case4:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;x2=max1(current[j]);current[j]=current[j]-0.2*x2;if(current[j]>=0.6*x2)current[j]=0.6*x2;if(current[j]<=0)current[j]=0;}};break;default:signaltype=0;;break;}keyx_temp=keyx;keyy_temp=keyy;keyx=0;keyy=0;AmpResult[7]=0xEE;AmpResult[6]=0xCE;AmpResult[5]=0x02;AmpResult[4]=lednum[(gain/10000)%10];AmpResult[3]=lednum[(gain/1000)%10];AmpResult[2]=lednum[(gain/100)%10];AmpResult[1]=lednum[(gain/10)%10];AmpResult[0]=lednum[gain%10];sizeResult[7]=0x1E;sizeResult[6]
sineTable[j]=sin(2*3.1416/sine_size*j)*gain+offset;
锯齿波:
float_temp=100;
Updownflag=0;
for(j=1;j{if(float_temp<=100&&Updownflag==1)float_temp=float_temp-200.0/sine_size;elseif(float_temp>=100&&Updownflag==0)float_temp=100;if(float_temp>=100){Updownflag=1;float_temp=90;}if(float_temp<=0){Updownflag=0;float_temp=100;}sineTable[j]=float_temp*gain/100-offset;}方波:float_temp=0;Updownflag=0;temp=0;for(j=1;j{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}if(temp>=(sine_size/2))Updownflag=1;if(temp>=sine_size){Updownflag=0;temp=0;}sineTable[j]=float_temp*gain+offset;}三角波:float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;sineTable[j]=float_temp*gain/100+offset;梯形波:max1(unsignedintx1){if(x3>x1)x3=x3;elsex3=x1;returnx3;}float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;sineTable[j]=float_temp*gain/100+offset;x2=max1(sineTable[j]);if(sineTable[j]>=x2*0.8+offset)sineTable[j]=0.8*x2+offset;if(sineTable[j]<=x2*0.2+offset)sineTable[j]=x2*0.2+offset;} 2、按键切换波形if((keyx==4)&&(keyy==3))选择正弦波{signaltype=0;}if((keyx==4)&&(keyy==2))选择三角波{signaltype=4;}if((keyx==4)&&(keyy==1))选择锯齿波{signaltype=2;}if((keyx==3)&&(keyy==3))选择方波{signaltype=3;}if((keyx==3)&&(keyy==2))选择tixing{signaltype=1;} 3、按键改变幅值与周期if((keyx==0)&&(keyy==3))增加幅值{gain=gain+500;if(gain>30000)gain=30000;}if((keyx==0)&&(keyy==1))减小幅值{gain=gain-500;if(gain<0)gain=0;}if((keyx==1)&&(keyy==0))减小周期{sine_size=sine_size-2;if(sine_size<12)sine_size=12;}if((keyx==4)&&(keyy==0))增大周期{sine_size=sine_size+2;if(sine_size>512)sine_size=512;} 4、数码管显示幅值://显示当前的幅值(格式为:AP-00000~AP-32767)//8个七段数码管赋初值0,全部灭AmpResult[7]=0xEE;//显示AAmpResult[6]=0xCE;//显示pAmpResult[5]=0x02;//显示-AmpResult[4]=LedCode[(gain/10000)%10];//显示幅值的万位AmpResult[3]=LedCode[(gain/1000)%10];//显示幅值的千位AmpResult[2]=LedCode[(gain/100)%10];//显示幅值的百位AmpResult[1]=LedCode[(gain/10)%10];//显示幅值十位AmpResult[0]=LedCode[gain%10];//显示幅值的个位周期://显示每周期的离散采样点数(格式为:tNUb-012~tNUb-512)sizeResult[7]=0x1E;//显示tsizeResult[6]=0xEC;//显示NsizeResult[5]=0x7C;//显示UsizeResult[4]=0x3E;//显示bsizeResult[3]=0x02;//显示-sizeResult[2]=LedCode[(sine_size/100)%10];//显示离散采样点数的百位sizeResult[1]=LedCode[(sine_size/10)%10];//显示离散采样点数的十位sizeResult[0]=LedCode[sine_size%10];//显示离散采样点数的个位学号:StudentNUM[8]={0x60,0xFC,0x60,0x60,0xF2,0xFC,0xDA,0xF6};//92031101日期:DAYTIME[8]={0x66,0xFC,0x60,0xFC,0xF2,0x60,0xFC,0xDA};//20130104利用中断程序执行显示:interruptvoidTINT0_ISR(void)//CPU-Timer0{CpuTimer0Regs.TCR.bit.TIF=1;//清除定时器的中断标志位PieCtrl.PIEACK.bit.ACK1=1;//写1,清楚中断中断应答位,以响应CPU定时器T0的同组(第一组INT1)其他中断switch(flag){case0:{flag++;//显示按键的列号keyx、行号keyyWriteLEDs(KeyResult);};break;case1:{flag++;//显示当前的幅值//(格式为:AP-00000~AP-32767)WriteLEDs(AmpResult);};break;case2:{flag++;//显示每周期的离散采样点数//(格式为:tNUb-012~tNUb-512)WriteLEDs(sizeResult);};break;case3:{flag++;//显示日期//(格式为:20130104)WriteLEDs(DAYTIME);};break;case4:{flag++;//显示学号:92031101WriteLEDs(StudentNUM);};break;case5:{flag=0;//显示日期:20130104WriteLEDs(DAYTIME);};break;default:flag=0;;break;}}4.2硬件调试按键功能定义,如下:4.3主程序#include"DSP28_Device.h"#include#include#definebuffer_size200unsignedintsine_size=20;unsignedinttemp;intcurrent[buffer_size];floatfloat_temp;intgain=10000;intoffset=0;intflag=0;intUpdownflag=0;intsignaltype=0;unsignedint*CPLDDREG=(unsignedint*)0x2004;unsignedint*CPLDDREGL=(unsignedint*)0x2006;unionCPLD_DREGLMYDREGL;unsignedintlednum[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0xEC,0xCE,0x7C,0x3E,0x1E};unsignedintDateNUM[8]={0x66,0xFC,0x60,0xFC,0xF2,0x60,0xFC,0xDA};unsignedintStudentNUM[8]={0x60,0xFC,0x60,0x60,0xF2,0xFC,0xDA,0xF6};unsignedintKeyResult[8];unsignedintAmpResult[8];unsignedintsizeResult[8];unsignedintcount;unsignedintkeypress=0;unsignedintx2,x3=0;unsignedintkeyx=0,keyy=0;unsignedintkeyx_temp=0,keyy_temp=0;voiddelay(unsignedint);voidldelay(unsignedint);voidWriteLED(unsignedint);voidWriteLEDs(unsignedint*);voidResultCon(void);voidDelay(Uint16);max1(intx1){if(x1>x3)x3=x1;returnx3;}voidmain(void){Uint16a=0x0800;unsignedinti,j;InitSysCtrl();DINT;IER=0x0000;IFR=0x0000;InitPieCtrl();InitPieVectTable();InitGpio();InitCpuTimers();PieCtrl.PIEIER1.bit.INTx7=1;IER|=M_INT1;EINT;ERTM;ConfigCpuTimer(&CpuTimer0,150,400000);StartCpuTimer0();for(i=0;i<8;i++)KeyResult[i]=0x00;WriteLEDs(KeyResult);while(1){GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;if(temp!=0x0780){delay(2000);GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;if(temp!=0x0780){delay(2000);flag=0;a=0x0800;for(i=0;i<5;i++){GpioDataRegs.GPADAT.all=0xffff;GpioDataRegs.GPADAT.all=GpioDataRegs.GPADAT.all&(~(a<delay(500);if(GpioDataRegs.GPADAT.bit.GPIOA10==0){keypress=1;keyx=i;keyy=0;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA9==0){keypress=1;keyx=i;keyy=1;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA8==0){keypress=1;keyx=i;keyy=2;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA7==0){keypress=1;keyx=i;keyy=3;break;}}delay(2000);GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;while(temp!=0x0780){GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;delay(500);x3=0;}for(i=0;i<8;i++)KeyResult[i]=0x00;KeyResult[7]=lednum[keyx];KeyResult[5]=lednum[keyy];if((keyx==0)&&(keyy==3)){gain=gain+500;if(gain>30000)gain=30000;}if((keyx==0)&&(keyy==1)){gain=gain-500;if(gain<0)gain=0;}if((keyx==1)&&(keyy==0)){sine_size=sine_size-2;if(sine_size<12)sine_size=12;}if((keyx==4)&&(keyy==0)){sine_size=sine_size+2;if(sine_size>512)sine_size=512;}if((keyx==4)&&(keyy==3)){signaltype=0;}if((keyx==4)&&(keyy==2)){signaltype=1;}if((keyx==4)&&(keyy==1)){signaltype=2;}if((keyx==3)&&(keyy==3)){signaltype=3;}if((keyx==3)&&(keyy==2)){signaltype=4;}for(j=0;jcurrent[j]=0;switch(signaltype){case0:{for(j=0;jcurrent[j]=cos(2*3.1416/sine_size*j)*gain+offset;};break;case1:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case2:{float_temp=0;Updownflag=0;for(j=buffer_size;j>0;j--){if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=0;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case3:{float_temp=0;Updownflag=0;temp=0;for(j=1;j{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}if(temp>=(sine_size/2))Updownflag=1;if(temp>=sine_size){Updownflag=0;temp=0;}current[j]=float_temp*gain+offset;}};break;case4:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;x2=max1(current[j]);current[j]=current[j]-0.2*x2;if(current[j]>=0.6*x2)current[j]=0.6*x2;if(current[j]<=0)current[j]=0;}};break;default:signaltype=0;;break;}keyx_temp=keyx;keyy_temp=keyy;keyx=0;keyy=0;AmpResult[7]=0xEE;AmpResult[6]=0xCE;AmpResult[5]=0x02;AmpResult[4]=lednum[(gain/10000)%10];AmpResult[3]=lednum[(gain/1000)%10];AmpResult[2]=lednum[(gain/100)%10];AmpResult[1]=lednum[(gain/10)%10];AmpResult[0]=lednum[gain%10];sizeResult[7]=0x1E;sizeResult[6]
{if(float_temp<=100&&Updownflag==1)float_temp=float_temp-200.0/sine_size;elseif(float_temp>=100&&Updownflag==0)float_temp=100;
if(float_temp>=100){Updownflag=1;float_temp=90;}
if(float_temp<=0){Updownflag=0;float_temp=100;}
sineTable[j]=float_temp*gain/100-offset;}
方波:
float_temp=0;
temp=0;
for(j=1;j{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}if(temp>=(sine_size/2))Updownflag=1;if(temp>=sine_size){Updownflag=0;temp=0;}sineTable[j]=float_temp*gain+offset;}三角波:float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;sineTable[j]=float_temp*gain/100+offset;梯形波:max1(unsignedintx1){if(x3>x1)x3=x3;elsex3=x1;returnx3;}float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;sineTable[j]=float_temp*gain/100+offset;x2=max1(sineTable[j]);if(sineTable[j]>=x2*0.8+offset)sineTable[j]=0.8*x2+offset;if(sineTable[j]<=x2*0.2+offset)sineTable[j]=x2*0.2+offset;} 2、按键切换波形if((keyx==4)&&(keyy==3))选择正弦波{signaltype=0;}if((keyx==4)&&(keyy==2))选择三角波{signaltype=4;}if((keyx==4)&&(keyy==1))选择锯齿波{signaltype=2;}if((keyx==3)&&(keyy==3))选择方波{signaltype=3;}if((keyx==3)&&(keyy==2))选择tixing{signaltype=1;} 3、按键改变幅值与周期if((keyx==0)&&(keyy==3))增加幅值{gain=gain+500;if(gain>30000)gain=30000;}if((keyx==0)&&(keyy==1))减小幅值{gain=gain-500;if(gain<0)gain=0;}if((keyx==1)&&(keyy==0))减小周期{sine_size=sine_size-2;if(sine_size<12)sine_size=12;}if((keyx==4)&&(keyy==0))增大周期{sine_size=sine_size+2;if(sine_size>512)sine_size=512;} 4、数码管显示幅值://显示当前的幅值(格式为:AP-00000~AP-32767)//8个七段数码管赋初值0,全部灭AmpResult[7]=0xEE;//显示AAmpResult[6]=0xCE;//显示pAmpResult[5]=0x02;//显示-AmpResult[4]=LedCode[(gain/10000)%10];//显示幅值的万位AmpResult[3]=LedCode[(gain/1000)%10];//显示幅值的千位AmpResult[2]=LedCode[(gain/100)%10];//显示幅值的百位AmpResult[1]=LedCode[(gain/10)%10];//显示幅值十位AmpResult[0]=LedCode[gain%10];//显示幅值的个位周期://显示每周期的离散采样点数(格式为:tNUb-012~tNUb-512)sizeResult[7]=0x1E;//显示tsizeResult[6]=0xEC;//显示NsizeResult[5]=0x7C;//显示UsizeResult[4]=0x3E;//显示bsizeResult[3]=0x02;//显示-sizeResult[2]=LedCode[(sine_size/100)%10];//显示离散采样点数的百位sizeResult[1]=LedCode[(sine_size/10)%10];//显示离散采样点数的十位sizeResult[0]=LedCode[sine_size%10];//显示离散采样点数的个位学号:StudentNUM[8]={0x60,0xFC,0x60,0x60,0xF2,0xFC,0xDA,0xF6};//92031101日期:DAYTIME[8]={0x66,0xFC,0x60,0xFC,0xF2,0x60,0xFC,0xDA};//20130104利用中断程序执行显示:interruptvoidTINT0_ISR(void)//CPU-Timer0{CpuTimer0Regs.TCR.bit.TIF=1;//清除定时器的中断标志位PieCtrl.PIEACK.bit.ACK1=1;//写1,清楚中断中断应答位,以响应CPU定时器T0的同组(第一组INT1)其他中断switch(flag){case0:{flag++;//显示按键的列号keyx、行号keyyWriteLEDs(KeyResult);};break;case1:{flag++;//显示当前的幅值//(格式为:AP-00000~AP-32767)WriteLEDs(AmpResult);};break;case2:{flag++;//显示每周期的离散采样点数//(格式为:tNUb-012~tNUb-512)WriteLEDs(sizeResult);};break;case3:{flag++;//显示日期//(格式为:20130104)WriteLEDs(DAYTIME);};break;case4:{flag++;//显示学号:92031101WriteLEDs(StudentNUM);};break;case5:{flag=0;//显示日期:20130104WriteLEDs(DAYTIME);};break;default:flag=0;;break;}}4.2硬件调试按键功能定义,如下:4.3主程序#include"DSP28_Device.h"#include#include#definebuffer_size200unsignedintsine_size=20;unsignedinttemp;intcurrent[buffer_size];floatfloat_temp;intgain=10000;intoffset=0;intflag=0;intUpdownflag=0;intsignaltype=0;unsignedint*CPLDDREG=(unsignedint*)0x2004;unsignedint*CPLDDREGL=(unsignedint*)0x2006;unionCPLD_DREGLMYDREGL;unsignedintlednum[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0xEC,0xCE,0x7C,0x3E,0x1E};unsignedintDateNUM[8]={0x66,0xFC,0x60,0xFC,0xF2,0x60,0xFC,0xDA};unsignedintStudentNUM[8]={0x60,0xFC,0x60,0x60,0xF2,0xFC,0xDA,0xF6};unsignedintKeyResult[8];unsignedintAmpResult[8];unsignedintsizeResult[8];unsignedintcount;unsignedintkeypress=0;unsignedintx2,x3=0;unsignedintkeyx=0,keyy=0;unsignedintkeyx_temp=0,keyy_temp=0;voiddelay(unsignedint);voidldelay(unsignedint);voidWriteLED(unsignedint);voidWriteLEDs(unsignedint*);voidResultCon(void);voidDelay(Uint16);max1(intx1){if(x1>x3)x3=x1;returnx3;}voidmain(void){Uint16a=0x0800;unsignedinti,j;InitSysCtrl();DINT;IER=0x0000;IFR=0x0000;InitPieCtrl();InitPieVectTable();InitGpio();InitCpuTimers();PieCtrl.PIEIER1.bit.INTx7=1;IER|=M_INT1;EINT;ERTM;ConfigCpuTimer(&CpuTimer0,150,400000);StartCpuTimer0();for(i=0;i<8;i++)KeyResult[i]=0x00;WriteLEDs(KeyResult);while(1){GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;if(temp!=0x0780){delay(2000);GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;if(temp!=0x0780){delay(2000);flag=0;a=0x0800;for(i=0;i<5;i++){GpioDataRegs.GPADAT.all=0xffff;GpioDataRegs.GPADAT.all=GpioDataRegs.GPADAT.all&(~(a<delay(500);if(GpioDataRegs.GPADAT.bit.GPIOA10==0){keypress=1;keyx=i;keyy=0;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA9==0){keypress=1;keyx=i;keyy=1;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA8==0){keypress=1;keyx=i;keyy=2;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA7==0){keypress=1;keyx=i;keyy=3;break;}}delay(2000);GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;while(temp!=0x0780){GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;delay(500);x3=0;}for(i=0;i<8;i++)KeyResult[i]=0x00;KeyResult[7]=lednum[keyx];KeyResult[5]=lednum[keyy];if((keyx==0)&&(keyy==3)){gain=gain+500;if(gain>30000)gain=30000;}if((keyx==0)&&(keyy==1)){gain=gain-500;if(gain<0)gain=0;}if((keyx==1)&&(keyy==0)){sine_size=sine_size-2;if(sine_size<12)sine_size=12;}if((keyx==4)&&(keyy==0)){sine_size=sine_size+2;if(sine_size>512)sine_size=512;}if((keyx==4)&&(keyy==3)){signaltype=0;}if((keyx==4)&&(keyy==2)){signaltype=1;}if((keyx==4)&&(keyy==1)){signaltype=2;}if((keyx==3)&&(keyy==3)){signaltype=3;}if((keyx==3)&&(keyy==2)){signaltype=4;}for(j=0;jcurrent[j]=0;switch(signaltype){case0:{for(j=0;jcurrent[j]=cos(2*3.1416/sine_size*j)*gain+offset;};break;case1:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case2:{float_temp=0;Updownflag=0;for(j=buffer_size;j>0;j--){if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=0;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case3:{float_temp=0;Updownflag=0;temp=0;for(j=1;j{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}if(temp>=(sine_size/2))Updownflag=1;if(temp>=sine_size){Updownflag=0;temp=0;}current[j]=float_temp*gain+offset;}};break;case4:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;x2=max1(current[j]);current[j]=current[j]-0.2*x2;if(current[j]>=0.6*x2)current[j]=0.6*x2;if(current[j]<=0)current[j]=0;}};break;default:signaltype=0;;break;}keyx_temp=keyx;keyy_temp=keyy;keyx=0;keyy=0;AmpResult[7]=0xEE;AmpResult[6]=0xCE;AmpResult[5]=0x02;AmpResult[4]=lednum[(gain/10000)%10];AmpResult[3]=lednum[(gain/1000)%10];AmpResult[2]=lednum[(gain/100)%10];AmpResult[1]=lednum[(gain/10)%10];AmpResult[0]=lednum[gain%10];sizeResult[7]=0x1E;sizeResult[6]
{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}
elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}
if(temp>=(sine_size/2))Updownflag=1;
if(temp>=sine_size){Updownflag=0;temp=0;}
sineTable[j]=float_temp*gain+offset;}
三角波:
for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;sineTable[j]=float_temp*gain/100+offset;梯形波:max1(unsignedintx1){if(x3>x1)x3=x3;elsex3=x1;returnx3;}float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;sineTable[j]=float_temp*gain/100+offset;x2=max1(sineTable[j]);if(sineTable[j]>=x2*0.8+offset)sineTable[j]=0.8*x2+offset;if(sineTable[j]<=x2*0.2+offset)sineTable[j]=x2*0.2+offset;} 2、按键切换波形if((keyx==4)&&(keyy==3))选择正弦波{signaltype=0;}if((keyx==4)&&(keyy==2))选择三角波{signaltype=4;}if((keyx==4)&&(keyy==1))选择锯齿波{signaltype=2;}if((keyx==3)&&(keyy==3))选择方波{signaltype=3;}if((keyx==3)&&(keyy==2))选择tixing{signaltype=1;} 3、按键改变幅值与周期if((keyx==0)&&(keyy==3))增加幅值{gain=gain+500;if(gain>30000)gain=30000;}if((keyx==0)&&(keyy==1))减小幅值{gain=gain-500;if(gain<0)gain=0;}if((keyx==1)&&(keyy==0))减小周期{sine_size=sine_size-2;if(sine_size<12)sine_size=12;}if((keyx==4)&&(keyy==0))增大周期{sine_size=sine_size+2;if(sine_size>512)sine_size=512;} 4、数码管显示幅值://显示当前的幅值(格式为:AP-00000~AP-32767)//8个七段数码管赋初值0,全部灭AmpResult[7]=0xEE;//显示AAmpResult[6]=0xCE;//显示pAmpResult[5]=0x02;//显示-AmpResult[4]=LedCode[(gain/10000)%10];//显示幅值的万位AmpResult[3]=LedCode[(gain/1000)%10];//显示幅值的千位AmpResult[2]=LedCode[(gain/100)%10];//显示幅值的百位AmpResult[1]=LedCode[(gain/10)%10];//显示幅值十位AmpResult[0]=LedCode[gain%10];//显示幅值的个位周期://显示每周期的离散采样点数(格式为:tNUb-012~tNUb-512)sizeResult[7]=0x1E;//显示tsizeResult[6]=0xEC;//显示NsizeResult[5]=0x7C;//显示UsizeResult[4]=0x3E;//显示bsizeResult[3]=0x02;//显示-sizeResult[2]=LedCode[(sine_size/100)%10];//显示离散采样点数的百位sizeResult[1]=LedCode[(sine_size/10)%10];//显示离散采样点数的十位sizeResult[0]=LedCode[sine_size%10];//显示离散采样点数的个位学号:StudentNUM[8]={0x60,0xFC,0x60,0x60,0xF2,0xFC,0xDA,0xF6};//92031101日期:DAYTIME[8]={0x66,0xFC,0x60,0xFC,0xF2,0x60,0xFC,0xDA};//20130104利用中断程序执行显示:interruptvoidTINT0_ISR(void)//CPU-Timer0{CpuTimer0Regs.TCR.bit.TIF=1;//清除定时器的中断标志位PieCtrl.PIEACK.bit.ACK1=1;//写1,清楚中断中断应答位,以响应CPU定时器T0的同组(第一组INT1)其他中断switch(flag){case0:{flag++;//显示按键的列号keyx、行号keyyWriteLEDs(KeyResult);};break;case1:{flag++;//显示当前的幅值//(格式为:AP-00000~AP-32767)WriteLEDs(AmpResult);};break;case2:{flag++;//显示每周期的离散采样点数//(格式为:tNUb-012~tNUb-512)WriteLEDs(sizeResult);};break;case3:{flag++;//显示日期//(格式为:20130104)WriteLEDs(DAYTIME);};break;case4:{flag++;//显示学号:92031101WriteLEDs(StudentNUM);};break;case5:{flag=0;//显示日期:20130104WriteLEDs(DAYTIME);};break;default:flag=0;;break;}}4.2硬件调试按键功能定义,如下:4.3主程序#include"DSP28_Device.h"#include#include#definebuffer_size200unsignedintsine_size=20;unsignedinttemp;intcurrent[buffer_size];floatfloat_temp;intgain=10000;intoffset=0;intflag=0;intUpdownflag=0;intsignaltype=0;unsignedint*CPLDDREG=(unsignedint*)0x2004;unsignedint*CPLDDREGL=(unsignedint*)0x2006;unionCPLD_DREGLMYDREGL;unsignedintlednum[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0xEC,0xCE,0x7C,0x3E,0x1E};unsignedintDateNUM[8]={0x66,0xFC,0x60,0xFC,0xF2,0x60,0xFC,0xDA};unsignedintStudentNUM[8]={0x60,0xFC,0x60,0x60,0xF2,0xFC,0xDA,0xF6};unsignedintKeyResult[8];unsignedintAmpResult[8];unsignedintsizeResult[8];unsignedintcount;unsignedintkeypress=0;unsignedintx2,x3=0;unsignedintkeyx=0,keyy=0;unsignedintkeyx_temp=0,keyy_temp=0;voiddelay(unsignedint);voidldelay(unsignedint);voidWriteLED(unsignedint);voidWriteLEDs(unsignedint*);voidResultCon(void);voidDelay(Uint16);max1(intx1){if(x1>x3)x3=x1;returnx3;}voidmain(void){Uint16a=0x0800;unsignedinti,j;InitSysCtrl();DINT;IER=0x0000;IFR=0x0000;InitPieCtrl();InitPieVectTable();InitGpio();InitCpuTimers();PieCtrl.PIEIER1.bit.INTx7=1;IER|=M_INT1;EINT;ERTM;ConfigCpuTimer(&CpuTimer0,150,400000);StartCpuTimer0();for(i=0;i<8;i++)KeyResult[i]=0x00;WriteLEDs(KeyResult);while(1){GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;if(temp!=0x0780){delay(2000);GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;if(temp!=0x0780){delay(2000);flag=0;a=0x0800;for(i=0;i<5;i++){GpioDataRegs.GPADAT.all=0xffff;GpioDataRegs.GPADAT.all=GpioDataRegs.GPADAT.all&(~(a<delay(500);if(GpioDataRegs.GPADAT.bit.GPIOA10==0){keypress=1;keyx=i;keyy=0;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA9==0){keypress=1;keyx=i;keyy=1;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA8==0){keypress=1;keyx=i;keyy=2;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA7==0){keypress=1;keyx=i;keyy=3;break;}}delay(2000);GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;while(temp!=0x0780){GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;delay(500);x3=0;}for(i=0;i<8;i++)KeyResult[i]=0x00;KeyResult[7]=lednum[keyx];KeyResult[5]=lednum[keyy];if((keyx==0)&&(keyy==3)){gain=gain+500;if(gain>30000)gain=30000;}if((keyx==0)&&(keyy==1)){gain=gain-500;if(gain<0)gain=0;}if((keyx==1)&&(keyy==0)){sine_size=sine_size-2;if(sine_size<12)sine_size=12;}if((keyx==4)&&(keyy==0)){sine_size=sine_size+2;if(sine_size>512)sine_size=512;}if((keyx==4)&&(keyy==3)){signaltype=0;}if((keyx==4)&&(keyy==2)){signaltype=1;}if((keyx==4)&&(keyy==1)){signaltype=2;}if((keyx==3)&&(keyy==3)){signaltype=3;}if((keyx==3)&&(keyy==2)){signaltype=4;}for(j=0;jcurrent[j]=0;switch(signaltype){case0:{for(j=0;jcurrent[j]=cos(2*3.1416/sine_size*j)*gain+offset;};break;case1:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case2:{float_temp=0;Updownflag=0;for(j=buffer_size;j>0;j--){if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=0;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case3:{float_temp=0;Updownflag=0;temp=0;for(j=1;j{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}if(temp>=(sine_size/2))Updownflag=1;if(temp>=sine_size){Updownflag=0;temp=0;}current[j]=float_temp*gain+offset;}};break;case4:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;x2=max1(current[j]);current[j]=current[j]-0.2*x2;if(current[j]>=0.6*x2)current[j]=0.6*x2;if(current[j]<=0)current[j]=0;}};break;default:signaltype=0;;break;}keyx_temp=keyx;keyy_temp=keyy;keyx=0;keyy=0;AmpResult[7]=0xEE;AmpResult[6]=0xCE;AmpResult[5]=0x02;AmpResult[4]=lednum[(gain/10000)%10];AmpResult[3]=lednum[(gain/1000)%10];AmpResult[2]=lednum[(gain/100)%10];AmpResult[1]=lednum[(gain/10)%10];AmpResult[0]=lednum[gain%10];sizeResult[7]=0x1E;sizeResult[6]
{if(float_temp<=100&&Updownflag==0)
float_temp=float_temp+200.0/sine_size;
else
if(float_temp>=0&&Updownflag==1)
float_temp=float_temp-200.0/sine_size;
if(float_temp>=100)Updownflag=1;
if(float_temp<=0)Updownflag=0;
sineTable[j]=float_temp*gain/100+offset;
梯形波:
max1(unsignedintx1)
{if(x3>x1)x3=x3;
elsex3=x1;
returnx3;}
for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;sineTable[j]=float_temp*gain/100+offset;x2=max1(sineTable[j]);if(sineTable[j]>=x2*0.8+offset)sineTable[j]=0.8*x2+offset;if(sineTable[j]<=x2*0.2+offset)sineTable[j]=x2*0.2+offset;} 2、按键切换波形if((keyx==4)&&(keyy==3))选择正弦波{signaltype=0;}if((keyx==4)&&(keyy==2))选择三角波{signaltype=4;}if((keyx==4)&&(keyy==1))选择锯齿波{signaltype=2;}if((keyx==3)&&(keyy==3))选择方波{signaltype=3;}if((keyx==3)&&(keyy==2))选择tixing{signaltype=1;} 3、按键改变幅值与周期if((keyx==0)&&(keyy==3))增加幅值{gain=gain+500;if(gain>30000)gain=30000;}if((keyx==0)&&(keyy==1))减小幅值{gain=gain-500;if(gain<0)gain=0;}if((keyx==1)&&(keyy==0))减小周期{sine_size=sine_size-2;if(sine_size<12)sine_size=12;}if((keyx==4)&&(keyy==0))增大周期{sine_size=sine_size+2;if(sine_size>512)sine_size=512;} 4、数码管显示幅值://显示当前的幅值(格式为:AP-00000~AP-32767)//8个七段数码管赋初值0,全部灭AmpResult[7]=0xEE;//显示AAmpResult[6]=0xCE;//显示pAmpResult[5]=0x02;//显示-AmpResult[4]=LedCode[(gain/10000)%10];//显示幅值的万位AmpResult[3]=LedCode[(gain/1000)%10];//显示幅值的千位AmpResult[2]=LedCode[(gain/100)%10];//显示幅值的百位AmpResult[1]=LedCode[(gain/10)%10];//显示幅值十位AmpResult[0]=LedCode[gain%10];//显示幅值的个位周期://显示每周期的离散采样点数(格式为:tNUb-012~tNUb-512)sizeResult[7]=0x1E;//显示tsizeResult[6]=0xEC;//显示NsizeResult[5]=0x7C;//显示UsizeResult[4]=0x3E;//显示bsizeResult[3]=0x02;//显示-sizeResult[2]=LedCode[(sine_size/100)%10];//显示离散采样点数的百位sizeResult[1]=LedCode[(sine_size/10)%10];//显示离散采样点数的十位sizeResult[0]=LedCode[sine_size%10];//显示离散采样点数的个位学号:StudentNUM[8]={0x60,0xFC,0x60,0x60,0xF2,0xFC,0xDA,0xF6};//92031101日期:DAYTIME[8]={0x66,0xFC,0x60,0xFC,0xF2,0x60,0xFC,0xDA};//20130104利用中断程序执行显示:interruptvoidTINT0_ISR(void)//CPU-Timer0{CpuTimer0Regs.TCR.bit.TIF=1;//清除定时器的中断标志位PieCtrl.PIEACK.bit.ACK1=1;//写1,清楚中断中断应答位,以响应CPU定时器T0的同组(第一组INT1)其他中断switch(flag){case0:{flag++;//显示按键的列号keyx、行号keyyWriteLEDs(KeyResult);};break;case1:{flag++;//显示当前的幅值//(格式为:AP-00000~AP-32767)WriteLEDs(AmpResult);};break;case2:{flag++;//显示每周期的离散采样点数//(格式为:tNUb-012~tNUb-512)WriteLEDs(sizeResult);};break;case3:{flag++;//显示日期//(格式为:20130104)WriteLEDs(DAYTIME);};break;case4:{flag++;//显示学号:92031101WriteLEDs(StudentNUM);};break;case5:{flag=0;//显示日期:20130104WriteLEDs(DAYTIME);};break;default:flag=0;;break;}}4.2硬件调试按键功能定义,如下:4.3主程序#include"DSP28_Device.h"#include#include#definebuffer_size200unsignedintsine_size=20;unsignedinttemp;intcurrent[buffer_size];floatfloat_temp;intgain=10000;intoffset=0;intflag=0;intUpdownflag=0;intsignaltype=0;unsignedint*CPLDDREG=(unsignedint*)0x2004;unsignedint*CPLDDREGL=(unsignedint*)0x2006;unionCPLD_DREGLMYDREGL;unsignedintlednum[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0xEC,0xCE,0x7C,0x3E,0x1E};unsignedintDateNUM[8]={0x66,0xFC,0x60,0xFC,0xF2,0x60,0xFC,0xDA};unsignedintStudentNUM[8]={0x60,0xFC,0x60,0x60,0xF2,0xFC,0xDA,0xF6};unsignedintKeyResult[8];unsignedintAmpResult[8];unsignedintsizeResult[8];unsignedintcount;unsignedintkeypress=0;unsignedintx2,x3=0;unsignedintkeyx=0,keyy=0;unsignedintkeyx_temp=0,keyy_temp=0;voiddelay(unsignedint);voidldelay(unsignedint);voidWriteLED(unsignedint);voidWriteLEDs(unsignedint*);voidResultCon(void);voidDelay(Uint16);max1(intx1){if(x1>x3)x3=x1;returnx3;}voidmain(void){Uint16a=0x0800;unsignedinti,j;InitSysCtrl();DINT;IER=0x0000;IFR=0x0000;InitPieCtrl();InitPieVectTable();InitGpio();InitCpuTimers();PieCtrl.PIEIER1.bit.INTx7=1;IER|=M_INT1;EINT;ERTM;ConfigCpuTimer(&CpuTimer0,150,400000);StartCpuTimer0();for(i=0;i<8;i++)KeyResult[i]=0x00;WriteLEDs(KeyResult);while(1){GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;if(temp!=0x0780){delay(2000);GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;if(temp!=0x0780){delay(2000);flag=0;a=0x0800;for(i=0;i<5;i++){GpioDataRegs.GPADAT.all=0xffff;GpioDataRegs.GPADAT.all=GpioDataRegs.GPADAT.all&(~(a<delay(500);if(GpioDataRegs.GPADAT.bit.GPIOA10==0){keypress=1;keyx=i;keyy=0;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA9==0){keypress=1;keyx=i;keyy=1;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA8==0){keypress=1;keyx=i;keyy=2;break;}elseif(GpioDataRegs.GPADAT.bit.GPIOA7==0){keypress=1;keyx=i;keyy=3;break;}}delay(2000);GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;while(temp!=0x0780){GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;delay(500);x3=0;}for(i=0;i<8;i++)KeyResult[i]=0x00;KeyResult[7]=lednum[keyx];KeyResult[5]=lednum[keyy];if((keyx==0)&&(keyy==3)){gain=gain+500;if(gain>30000)gain=30000;}if((keyx==0)&&(keyy==1)){gain=gain-500;if(gain<0)gain=0;}if((keyx==1)&&(keyy==0)){sine_size=sine_size-2;if(sine_size<12)sine_size=12;}if((keyx==4)&&(keyy==0)){sine_size=sine_size+2;if(sine_size>512)sine_size=512;}if((keyx==4)&&(keyy==3)){signaltype=0;}if((keyx==4)&&(keyy==2)){signaltype=1;}if((keyx==4)&&(keyy==1)){signaltype=2;}if((keyx==3)&&(keyy==3)){signaltype=3;}if((keyx==3)&&(keyy==2)){signaltype=4;}for(j=0;jcurrent[j]=0;switch(signaltype){case0:{for(j=0;jcurrent[j]=cos(2*3.1416/sine_size*j)*gain+offset;};break;case1:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case2:{float_temp=0;Updownflag=0;for(j=buffer_size;j>0;j--){if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=0;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case3:{float_temp=0;Updownflag=0;temp=0;for(j=1;j{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}if(temp>=(sine_size/2))Updownflag=1;if(temp>=sine_size){Updownflag=0;temp=0;}current[j]=float_temp*gain+offset;}};break;case4:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;x2=max1(current[j]);current[j]=current[j]-0.2*x2;if(current[j]>=0.6*x2)current[j]=0.6*x2;if(current[j]<=0)current[j]=0;}};break;default:signaltype=0;;break;}keyx_temp=keyx;keyy_temp=keyy;keyx=0;keyy=0;AmpResult[7]=0xEE;AmpResult[6]=0xCE;AmpResult[5]=0x02;AmpResult[4]=lednum[(gain/10000)%10];AmpResult[3]=lednum[(gain/1000)%10];AmpResult[2]=lednum[(gain/100)%10];AmpResult[1]=lednum[(gain/10)%10];AmpResult[0]=lednum[gain%10];sizeResult[7]=0x1E;sizeResult[6]
x2=max1(sineTable[j]);
if(sineTable[j]>=x2*0.8+offset)
sineTable[j]=0.8*x2+offset;
if(sineTable[j]<=x2*0.2+offset)
sineTable[j]=x2*0.2+offset;
}
2、按键切换波形
if((keyx==4)&&(keyy==3))选择正弦波
{signaltype=0;}
if((keyx==4)&&(keyy==2))选择三角波
{signaltype=4;}
if((keyx==4)&&(keyy==1))选择锯齿波
{signaltype=2;}
if((keyx==3)&&(keyy==3))选择方波
{signaltype=3;}
if((keyx==3)&&(keyy==2))选择tixing
{signaltype=1;}
3、按键改变幅值与周期
if((keyx==0)&&(keyy==3))增加幅值
{gain=gain+500;
if(gain>30000)gain=30000;}
if((keyx==0)&&(keyy==1))减小幅值
{gain=gain-500;
if(gain<0)gain=0;}
if((keyx==1)&&(keyy==0))减小周期
{sine_size=sine_size-2;
if(sine_size<12)sine_size=12;}
if((keyx==4)&&(keyy==0))增大周期
{sine_size=sine_size+2;
if(sine_size>512)sine_size=512;}
4、数码管显示
幅值:
//显示当前的幅值(格式为:
AP-00000~AP-32767)
//8个七段数码管赋初值0,全部灭
AmpResult[7]=0xEE;//显示A
AmpResult[6]=0xCE;//显示p
AmpResult[5]=0x02;//显示-
AmpResult[4]=LedCode[(gain/10000)%10];//显示幅值的万位
AmpResult[3]=LedCode[(gain/1000)%10];//显示幅值的千位
AmpResult[2]=LedCode[(gain/100)%10];//显示幅值的百位
AmpResult[1]=LedCode[(gain/10)%10];//显示幅值十位
AmpResult[0]=LedCode[gain%10];//显示幅值的个位
周期:
//显示每周期的离散采样点数(格式为:
tNUb-012~tNUb-512)
sizeResult[7]=0x1E;//显示t
sizeResult[6]=0xEC;//显示N
sizeResult[5]=0x7C;//显示U
sizeResult[4]=0x3E;//显示b
sizeResult[3]=0x02;//显示-
sizeResult[2]=LedCode[(sine_size/100)%10];//显示离散采样点数的百位
sizeResult[1]=LedCode[(sine_size/10)%10];//显示离散采样点数的十位
sizeResult[0]=LedCode[sine_size%10];//显示离散采样点数的个位
学号:
StudentNUM[8]={0x60,0xFC,0x60,0x60,0xF2,0xFC,0xDA,0xF6};//92031101
日期:
DAYTIME[8]={0x66,0xFC,0x60,0xFC,0xF2,0x60,0xFC,0xDA};//20130104
利用中断程序执行显示:
interruptvoidTINT0_ISR(void)//CPU-Timer0
{CpuTimer0Regs.TCR.bit.TIF=1;//清除定时器的中断标志位
PieCtrl.PIEACK.bit.ACK1=1;
//写1,清楚中断中断应答位,以响应CPU定时器T0的同组(第一组INT1)其他中断
switch(flag)
{case0:
{flag++;
//显示按键的列号keyx、行号keyy
WriteLEDs(KeyResult);};break;
case1:
//显示当前的幅值
//(格式为:
WriteLEDs(AmpResult);};break;
case2:
//显示每周期的离散采样点数
WriteLEDs(sizeResult);};break;
case3:
//显示日期
20130104)
WriteLEDs(DAYTIME);};break;
case4:
//显示学号:
92031101
WriteLEDs(StudentNUM);};break;
case5:
{flag=0;
//显示日期:
20130104
default:
flag=0;;break;}}
4.2硬件调试
按键功能定义,如下:
4.3主程序
#include"DSP28_Device.h"
#include
#definebuffer_size200
unsignedintsine_size=20;
unsignedinttemp;
intcurrent[buffer_size];
floatfloat_temp;
intgain=10000;
intoffset=0;
intflag=0;
intUpdownflag=0;
intsignaltype=0;
unsignedint*CPLDDREG=(unsignedint*)0x2004;
unsignedint*CPLDDREGL=(unsignedint*)0x2006;
unionCPLD_DREGLMYDREGL;
unsignedintlednum[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0xEC,0xCE,0x7C,0x3E,0x1E};
unsignedintDateNUM[8]={0x66,0xFC,0x60,0xFC,0xF2,0x60,0xFC,0xDA};
unsignedintStudentNUM[8]={0x60,0xFC,0x60,0x60,0xF2,0xFC,0xDA,0xF6};
unsignedintKeyResult[8];
unsignedintAmpResult[8];
unsignedintsizeResult[8];
unsignedintcount;
unsignedintkeypress=0;
unsignedintx2,x3=0;
unsignedintkeyx=0,keyy=0;
unsignedintkeyx_temp=0,keyy_temp=0;
voiddelay(unsignedint);
voidldelay(unsignedint);
voidWriteLED(unsignedint);
voidWriteLEDs(unsignedint*);
voidResultCon(void);
voidDelay(Uint16);
max1(intx1)
{if(x1>x3)
x3=x1;
voidmain(void)
{Uint16a=0x0800;
unsignedinti,j;
InitSysCtrl();
DINT;
IER=0x0000;
IFR=0x0000;
InitPieCtrl();
InitPieVectTable();
InitGpio();
InitCpuTimers();
PieCtrl.PIEIER1.bit.INTx7=1;
IER|=M_INT1;
EINT;ERTM;
ConfigCpuTimer(&CpuTimer0,150,400000);
StartCpuTimer0();
for(i=0;i<8;i++)
KeyResult[i]=0x00;
WriteLEDs(KeyResult);
while
(1)
{GpioDataRegs.GPADAT.all=0x07FF;
temp=GpioDataRegs.GPADAT.all&0x0780;
if(temp!
=0x0780)
{delay(2000);
GpioDataRegs.GPADAT.all=0x07FF;
flag=0;a=0x0800;
for(i=0;i<5;i++)
{GpioDataRegs.GPADAT.all=0xffff;
GpioDataRegs.GPADAT.all=GpioDataRegs.GPADAT.all&(~(a<
delay(500);
if(GpioDataRegs.GPADAT.bit.GPIOA10==0)
{keypress=1;keyx=i;
keyy=0;
break;}
elseif(GpioDataRegs.GPADAT.bit.GPIOA9==0)
{keypress=1;
keyx=i;
keyy=1;
elseif(GpioDataRegs.GPADAT.bit.GPIOA8==0)
keyy=2;
elseif(GpioDataRegs.GPADAT.bit.GPIOA7==0)
keyy=3;break;}}delay(2000);GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;
while(temp!
delay(500);x3=0;}
for(i=0;i<8;i++)KeyResult[i]=0x00;
KeyResult[7]=lednum[keyx];
KeyResult[5]=lednum[keyy];
if((keyx==0)&&(keyy==3))
if((keyx==0)&&(keyy==1))
if((keyx==1)&&(keyy==0))
if((keyx==4)&&(keyy==0))
if((keyx==4)&&(keyy==3))
if((keyx==4)&&(keyy==2))
if((keyx==4)&&(keyy==1))
if((keyx==3)&&(keyy==3))
if((keyx==3)&&(keyy==2))
for(j=0;jcurrent[j]=0;switch(signaltype){case0:{for(j=0;jcurrent[j]=cos(2*3.1416/sine_size*j)*gain+offset;};break;case1:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case2:{float_temp=0;Updownflag=0;for(j=buffer_size;j>0;j--){if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=0;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case3:{float_temp=0;Updownflag=0;temp=0;for(j=1;j{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}if(temp>=(sine_size/2))Updownflag=1;if(temp>=sine_size){Updownflag=0;temp=0;}current[j]=float_temp*gain+offset;}};break;case4:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;x2=max1(current[j]);current[j]=current[j]-0.2*x2;if(current[j]>=0.6*x2)current[j]=0.6*x2;if(current[j]<=0)current[j]=0;}};break;default:signaltype=0;;break;}keyx_temp=keyx;keyy_temp=keyy;keyx=0;keyy=0;AmpResult[7]=0xEE;AmpResult[6]=0xCE;AmpResult[5]=0x02;AmpResult[4]=lednum[(gain/10000)%10];AmpResult[3]=lednum[(gain/1000)%10];AmpResult[2]=lednum[(gain/100)%10];AmpResult[1]=lednum[(gain/10)%10];AmpResult[0]=lednum[gain%10];sizeResult[7]=0x1E;sizeResult[6]
current[j]=0;
switch(signaltype)
{for(j=0;jcurrent[j]=cos(2*3.1416/sine_size*j)*gain+offset;};break;case1:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case2:{float_temp=0;Updownflag=0;for(j=buffer_size;j>0;j--){if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=0;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case3:{float_temp=0;Updownflag=0;temp=0;for(j=1;j{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}if(temp>=(sine_size/2))Updownflag=1;if(temp>=sine_size){Updownflag=0;temp=0;}current[j]=float_temp*gain+offset;}};break;case4:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;x2=max1(current[j]);current[j]=current[j]-0.2*x2;if(current[j]>=0.6*x2)current[j]=0.6*x2;if(current[j]<=0)current[j]=0;}};break;default:signaltype=0;;break;}keyx_temp=keyx;keyy_temp=keyy;keyx=0;keyy=0;AmpResult[7]=0xEE;AmpResult[6]=0xCE;AmpResult[5]=0x02;AmpResult[4]=lednum[(gain/10000)%10];AmpResult[3]=lednum[(gain/1000)%10];AmpResult[2]=lednum[(gain/100)%10];AmpResult[1]=lednum[(gain/10)%10];AmpResult[0]=lednum[gain%10];sizeResult[7]=0x1E;sizeResult[6]
current[j]=cos(2*3.1416/sine_size*j)*gain+offset;};
break;
{float_temp=0;
for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case2:{float_temp=0;Updownflag=0;for(j=buffer_size;j>0;j--){if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=0;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;}};break;case3:{float_temp=0;Updownflag=0;temp=0;for(j=1;j{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}if(temp>=(sine_size/2))Updownflag=1;if(temp>=sine_size){Updownflag=0;temp=0;}current[j]=float_temp*gain+offset;}};break;case4:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;x2=max1(current[j]);current[j]=current[j]-0.2*x2;if(current[j]>=0.6*x2)current[j]=0.6*x2;if(current[j]<=0)current[j]=0;}};break;default:signaltype=0;;break;}keyx_temp=keyx;keyy_temp=keyy;keyx=0;keyy=0;AmpResult[7]=0xEE;AmpResult[6]=0xCE;AmpResult[5]=0x02;AmpResult[4]=lednum[(gain/10000)%10];AmpResult[3]=lednum[(gain/1000)%10];AmpResult[2]=lednum[(gain/100)%10];AmpResult[1]=lednum[(gain/10)%10];AmpResult[0]=lednum[gain%10];sizeResult[7]=0x1E;sizeResult[6]
{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;
elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;
current[j]=float_temp*gain/100+offset;}};
break;case2:
for(j=buffer_size;j>0;j--)
elseif(float_temp>=0&&Updownflag==1)float_temp=0;
for(j=1;j{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}if(temp>=(sine_size/2))Updownflag=1;if(temp>=sine_size){Updownflag=0;temp=0;}current[j]=float_temp*gain+offset;}};break;case4:{float_temp=0;Updownflag=0;for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;x2=max1(current[j]);current[j]=current[j]-0.2*x2;if(current[j]>=0.6*x2)current[j]=0.6*x2;if(current[j]<=0)current[j]=0;}};break;default:signaltype=0;;break;}keyx_temp=keyx;keyy_temp=keyy;keyx=0;keyy=0;AmpResult[7]=0xEE;AmpResult[6]=0xCE;AmpResult[5]=0x02;AmpResult[4]=lednum[(gain/10000)%10];AmpResult[3]=lednum[(gain/1000)%10];AmpResult[2]=lednum[(gain/100)%10];AmpResult[1]=lednum[(gain/10)%10];AmpResult[0]=lednum[gain%10];sizeResult[7]=0x1E;sizeResult[6]
current[j]=float_temp*gain+offset;}};
break;case4:
for(j=1;j{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;if(float_temp>=100)Updownflag=1;if(float_temp<=0)Updownflag=0;current[j]=float_temp*gain/100+offset;x2=max1(current[j]);current[j]=current[j]-0.2*x2;if(current[j]>=0.6*x2)current[j]=0.6*x2;if(current[j]<=0)current[j]=0;}};break;default:signaltype=0;;break;}keyx_temp=keyx;keyy_temp=keyy;keyx=0;keyy=0;AmpResult[7]=0xEE;AmpResult[6]=0xCE;AmpResult[5]=0x02;AmpResult[4]=lednum[(gain/10000)%10];AmpResult[3]=lednum[(gain/1000)%10];AmpResult[2]=lednum[(gain/100)%10];AmpResult[1]=lednum[(gain/10)%10];AmpResult[0]=lednum[gain%10];sizeResult[7]=0x1E;sizeResult[6]
current[j]=float_temp*gain/100+offset;
x2=max1(current[j]);
current[j]=current[j]-0.2*x2;
if(current[j]>=0.6*x2)
current[j]=0.6*x2;
if(current[j]<=0)
current[j]=0;}};
signaltype=0;;break;}
keyx_temp=keyx;
keyy_temp=keyy;
keyx=0;
AmpResult[7]=0xEE;
AmpResult[6]=0xCE;
AmpResult[5]=0x02;
AmpResult[4]=lednum[(gain/10000)%10];
AmpResult[3]=lednum[(gain/1000)%10];
AmpResult[2]=lednum[(gain/100)%10];
AmpResult[1]=lednum[(gain/10)%10];
AmpResult[0]=lednum[gain%10];
sizeResult[7]=0x1E;
sizeResult[6]
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2