?? main.c
字號:
//產生波形
CS_DAC=c_mag;//輸出D/A幅值
for(i=0;i<bits;i++)
{
temp=x_sin*sin[i]+x_rec*rec[i]+x_tri*tri[i];//線型疊加波形
temp/=x_total;//新波形歸一化
*(D_RAM+i)=temp;//輸出波形表到FPGA雙口RAM
temp_jun[i]=temp;//存儲波形。
}
//輸送16位頻率控制字
//頻率控制字16位,分為高8位freqH;低8位freqL
freqH=((c_freq&0xff00)>>8);//取出頻率控制字高8位
freqL=(c_freq&0x00ff);//取出頻率控制字低8位
cycleH=((cycle_count&0xff00)>>8);
cycleL=(cycle_count&0x00ff);
// W_FPGA=0
*A_FPGA=freqL;
// W_FPGA=1
*(A_FPGA+1)=freqH;
*(A_FPGA+2)=cycleL;
*(A_FPGA+3)=cycleH;
*(A_FPGA+4)=0;
*(A_FPGA+5)=0;
//CS_TEMP=0;
//存儲波形
Sector_erase(save_mag);
Byte_program(save_mag,c_mag);//存儲幅度
Byte_program(save_freq,freqH);//存儲頻率高位
Byte_program((save_freq+1),freqL);//存儲頻率低位
Byte_program(save_count,cycleH);//存儲頻率高位
Byte_program(save_count+1,cycleL);//存儲頻率低位
save(temp_jun);
}
//波形存儲函數
void save(uchar *reg_temp)
{
uint i;
uint addr=save_sector;
Sector_erase(addr);
for(i=0;i<512;i++)
{
Byte_program(addr,reg_temp[i]);
_nop_();
addr++;
}
}
//讀已存波
void read_bo(void)
{
uint i;
uint addr;
uchar temp;
uchar freqH=0,freqL=1;//頻率控制字高低8位
uchar cycleH,cycleL;
uchar *D_RAM=&CS_7132;//雙口RAM頭地址
uchar *A_FPGA=&CS_FPGA;//頻率控制字首地址
addr=save_sector;
for(i=0;i<512;i++)
{
temp=Byte_read(addr);
_nop_();
temp_jun[i]=temp;
addr++;
}
freqH=Byte_read(save_freq);
freqL=Byte_read(save_freq+1);
_nop_();
mag=Byte_read(save_mag);
_nop_();
cycleH=Byte_read(save_count);
cycleL=Byte_read(save_count+1);
_nop_();
//顯示已存波
CS_DAC=mag; //輸出D/A幅值
*A_FPGA=freqL;
*(A_FPGA+1)=freqH;
*(A_FPGA+2)=0;
*(A_FPGA+3)=0;
*(A_FPGA+4)=0;
*(A_FPGA+5)=0;
for(i=0;i<bits;i++)
{
temp=temp_jun[i];
*(D_RAM+i)=temp;//輸出波形表到FPGA雙口RAM
}
//輸送16位頻率控制字
//頻率控制字16位,分為高8位freqH;低8位freqL
//freqH=((freq&0xff00)>>8);//取出頻率控制字高8位
//freqL=(freq&0x00ff);//取出頻率控制字低8位
//cycleH=((cycle_count&0xff00)>>8);
//cycleL=(cycle_count&0x00ff);
// W_FPGA=0
*A_FPGA=freqL;
// W_FPGA=1
*(A_FPGA+1)=freqH;
*(A_FPGA+2)=cycleL;
*(A_FPGA+3)=cycleH;
*(A_FPGA+4)=0;
*(A_FPGA+5)=0;
}
//按ok鍵響應函數
void action(uchar bo_type)
{
if(bo_type==3)
create_combin(mag,freq,a,b,c);
else
create_base(mag,freq,bo_type);
}
///////////////////////////////////////////////////////////////////////////////
//讀取鍵盤數據,返回當前被按下的鍵號
uchar keyin(void)
{
uchar i;
COM=0x40;
i=DAT;
i=i&0x7f; //取鍵盤數據低7位
return(i);
}
////////////////////////////////////////////////////////////////////////////////主函數
void main(void)
{
uchar i,j,k;
//////////////////////////////////////////////////////////////////////////////
//初始化單片機
AUXR = 0x02;/*STC單片機關內部RAM和開ALE*/
for(i=0;i<5;i++)
{
for(j=0;j<100;j++)
{
for(k=0;k<100;k++);
}
}
//////////////////////////////////////////////////////////////////////////////
//初始化8279
COM=0xd1;//1101 0001b 清除所有顯示
do{ACC=COM;}
while(clflag==1); //清除起來比較慢,所以一條指令執行的時間不足以完成所有清除,故需等待
COM=0x01;COM=0x02;
IE=0x81;TCON=0x01;
//////////////////////////////////////////////////////////////////////////////
for(i=0;i<8;i++)
{
COM=0X80+i;
DAT=seg[0];
}
//大循環
while(1)
{
while(int_flag==0) /*等待中斷*/
{
;//后臺程序
}
int_flag=0;
if(ok==1) {ok=0;EA=0;action(state0);EA=1;}
//if(ok==1) {ok=0;action(state0);}
//根據鍵值調用鍵盤響應函數
switch(state0)
{
case 0:switch(state1)
{
case 0:switch(state2)
{
case 0:freq++;display();delay();break;
case 1:freq--;display();delay();break;
case 2:freq+=100;display();delay();break;
case 3:freq-=100;display();delay();break;
case 4:break;
}break;
case 1:switch(state2)
{
case 0:mag+=5;display();delay();break;
case 1:mag-=5;display();delay();break;
case 2:break;
}break;
case 2:break;
}
break;
case 1:switch(state1)
{
case 0:switch(state2)
{
case 0:freq++;display();delay();break;
case 1:freq--;display();delay();break;
case 2:freq+=100;display();delay();break;
case 3:freq-=100;display();delay();break;
case 4:break;
}break;
case 1:switch(state2)
{
case 0:mag+=5;display();delay();break;
case 1:mag-=5;display();delay();break;
case 2:break;
case 3:break;
case 4:break;
}break;
}
break;
case 2:switch(state1)
{
case 0:switch(state2)
{
case 0:freq++;display();delay();break;
case 1:freq--;display();delay();break;
case 2:freq+=100;display();delay();break;
case 3:freq-=100;display();delay();break;
case 4:break;
}break;
case 1:switch(state2)
{
case 0:mag+=5;display();delay();break;
case 1:mag-=5;display();delay();break;
case 2:break;
case 3:break;
case 4:break;
}break;
}
break;
case 3:switch(state1)
{
case 0:switch(state2)
{
case 0:freq++;display();delay();break;
case 1:freq--;display();delay();break;
case 2:freq+=100;display();delay();break;
case 3:freq-=100;display();delay();break;
case 4:break;
}break;
case 1:switch(state2)
{
case 0:mag+=5;display();delay();break;
case 1:mag-=5;display();delay();break;
case 2:break;
case 3:break;
case 4:break;
}break;
}
break;
case 4:{EA=0;read_bo();EA=1;}
default:break;
}
state2=4;
}
}
//INT0的中斷服務函數
//INT0由8279在鍵盤按下時發出
//注意關鍵字interrupt
void int_int0(void) interrupt 0 using 0
{
uchar i;
//設置標志,告訴主循環中斷發生了
int_flag=1;
//讀取鍵值
key_value=keyin();
for(i=0;i<=3;i++)
if(key_value==tb0[i]) state0=i;
for(i=0;i<=2;i++)
if(key_value==tb1[i]) state1=i;
for(i=0;i<=3;i++)
if(key_value==tb2[i]) state2=i;
for(i=0;i<=9;i++)
if(key_value==xishu[i])
{ value=i;
if(state0==3) {count++;
if(count==1) {a=value;COM=0X80;DAT=seg[a];}
if(count==2) {b=value;COM=0X81;DAT=seg[b];}
if(count==3) {c=value;count=0;COM=0X82;DAT=seg[c];}
}
switch(state0)
{
case 0:if(state1==2) {count_cycle++;
if(count_cycle==1) {baiwei=value;COM=0X80;DAT=seg[baiwei];cycle_count=baiwei*100;}
if(count_cycle==2) {shiwei=value;COM=0X81;DAT=seg[shiwei];cycle_count+=shiwei*10;}
if(count_cycle==3) {gewei=value;count_cycle=0;COM=0X82;DAT=seg[gewei];cycle_count+=gewei;}}
break;
case 1:if(state1==2) {count_cycle++;
if(count_cycle==1) {baiwei=value;COM=0X80;DAT=seg[baiwei];cycle_count=baiwei*100;}
if(count_cycle==2) {shiwei=value;COM=0X81;DAT=seg[shiwei];cycle_count+=shiwei*10;}
if(count_cycle==3) {gewei=value;count_cycle=0;COM=0X82;DAT=seg[gewei];cycle_count+=gewei;}}
break;
case 2:if(state1==2) {count_cycle++;
if(count_cycle==1) {baiwei=value;COM=0X80;DAT=seg[baiwei];cycle_count=baiwei*100;}
if(count_cycle==2) {shiwei=value;COM=0X81;DAT=seg[shiwei];cycle_count+=shiwei*10;}
if(count_cycle==3) {gewei=value;count_cycle=0;COM=0X82;DAT=seg[gewei];cycle_count+=gewei;}}
break;
case 3:if(state1==2) {count_cycle++;
if(count_cycle==1) {baiwei=value;COM=0X80;DAT=seg[baiwei];cycle_count=baiwei*100;}
if(count_cycle==2) {shiwei=value;COM=0X81;DAT=seg[shiwei];cycle_count+=shiwei*10;}
if(count_cycle==3) {gewei=value;count_cycle=0;COM=0X82;DAT=seg[gewei];cycle_count+=gewei;}}
break;
}
}
if(key_value==0x18) ok=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -