?? ss_sweep.c
字號:
#define Start 0
#define Screen 1
#define Setup 2
#define FreqScan 3
#define TiaoFu 4
#define enter_num 0
#define wait_key 1
#define exit_setup 2
#define scan_start 3
#define scan_select 4
unsigned long int Freq,FreqS,step,minF,maxF;
unsigned long int Freq_temp;
unsigned char MainSM=0;
unsigned char SetupSM=0;
//unsigned char SetFSM=4;//掃頻狀態的子狀態
unsigned long int SetFSM=0;
unsigned long int aa=0;//aa是掃頻狀態中表示子狀態的一個參數,記錄按下setup的次數
unsigned long int bb=1;//bb is freq scan mod select
void main(void)
{
unsigned char mod,value_index;
init_port();
init_interrupt();
_nop_();
_nop_();
_nop_();
display_init();
huanying1();
huanying1();
//huanying2();
cls();
while(1){
switch(MainSM)
{
case Start: MainSM=Screen;
SetPhase(0);
SetCMD(mod&0x01);
refresh_led();
break;
case Screen:
Set_Display_Add(128);
printf("Please press enter key to set Frequency");
if(key_pressed==ON)
{
switch(key_no)
{
case key_enter: MainSM=Setup;
break;
case key_clr: MainSM=FreqScan;
FreqS=Freq;
break;
case key_mod: SetCMD((++mod)&0x01);
display_mod((mod)&0x01);
refresh_led();
break;
case key_tiao: MainSM=TiaoFu;
break;
default: break;
}
key_pressed=OFF;
}
break;
case FreqScan: //掃頻輸出狀態
Set_Display_Add(384);
printf("Scan Frequence");
switch(SetFSM)//進入掃頻狀態的設置
{
case enter_num://掃頻初始狀態,并LCD顯示不同的內容
if(aa==0){//設置掃頻頻率的最小值
cls();
Set_Display_Add(512);
printf("min:");
}
if(aa==1){//設置掃頻頻率的最大值
Set_Display_Add(640);
printf("max:");
}
if(aa==2){//設置掃頻頻率的步長或者對數增長的系數
Set_Display_Add(768);
if(bb==0){
printf("step:");}
if(bb==1){
printf("xishu:");}
}
value_index=0;
SetFSM=wait_key;
break;
case wait_key: //處理鍵盤輸入
if(key_pressed==ON)
{
switch(key_no)
{
case key0:
case key1:
case key2:
case key3:
case key4:
case key5:
case key6:
case key7:
case key8:
case key9:
if(value_index<5)
{
value[value_index]=key_no;
value_index++;
}
break;
case key_enter://每按一下setup,aa加1,以進行不同的處理
aa=(aa+1)%4;
SetFSM=exit_setup;
break;
case key_xuan1://選擇模式2,對數模式
bb=1;
Set_Display_Add(480);
printf("mod 2");
delayMs(100);
SetFSM=enter_num;
break;
case key_xuan2://選擇模式1,線性模式
bb=0;
Set_Display_Add(480);
printf("mod 1");
delayMs(100);
SetFSM=enter_num;
break;
default: break;
}
refresh_led();
key_pressed=OFF;
}
break;
case exit_setup: Freq_temp=value[0];
Freq=Freq_temp*10000;
Freq_temp=value[1];
Freq=Freq+Freq_temp*1000;
Freq_temp=value[2];
Freq=Freq+Freq_temp*100;
Freq_temp=value[3];
Freq=Freq+Freq_temp*10;
Freq=Freq+value[4];
if(aa==1) {//設置并顯示最小頻率
minF=Freq;
Set_Display_Add(576);
putchar(value[0]+0x30);
putchar(value[1]+0x30);
putchar(value[2]+0x30);
putchar(value[3]+0x30);
putchar(value[4]+0x30);
refresh_led();
SetFSM=enter_num;
}
if(aa==2) {//設置并顯示最大頻率
maxF=Freq;
Set_Display_Add(704);
putchar(value[0]+0x30);
putchar(value[1]+0x30);
putchar(value[2]+0x30);
putchar(value[3]+0x30);
putchar(value[4]+0x30);
refresh_led();
SetFSM=enter_num;
}
if(aa==3) {//設置并顯示步長或者系數
step=Freq;
Set_Display_Add(832);
putchar(value[0]+0x30);
putchar(value[1]+0x30);
putchar(value[2]+0x30);
putchar(value[3]+0x30);
putchar(value[4]+0x30);
refresh_led();
SetFSM=scan_start;
}
break;
case scan_start:
delayMs(10);//延時函數,每隔100ms頻率改變一次
if(FreqS>maxF) FreqS=minF;//設置掃頻的最小值
SetPhase(FreqS&0x7fff); //設置頻率,以模32k循環
if(bb==0){
FreqS+=step;
Set_Display_Add(480);
printf("mod 1");
} //頻率步進step,linear freq change
if(bb==1){
FreqS=(FreqS+1)*step/100;
Set_Display_Add(480);
printf("mod 2");
}//頻率對數變化
if(key_pressed==ON){
switch(key_no){
case key_enter: MainSM=Setup;//進入掃頻設置狀態
cls();
break;
case key_mod: SetCMD((++mod)&0x03);//模波形式設置,在本實驗中實際上沒有用處
display_mod((mod)&0x03);
refresh_led();
break;
default: SetFSM=scan_start;
}
key_pressed=OFF;
}
break;
}
break;
////////////////////////////////////////////////////////////////////////
case Setup:
// cls();
Set_Display_Add(428);
printf("SETUP");
SetFSM=0;
aa=0;
switch(SetupSM)
{
case enter_num: value[0]=0;
value[1]=0;
value[2]=0;
value[3]=0;
value[4]=0;
Set_Display_Add(560);
putchar(value[0]+0x30);
putchar(value[1]+0x30);
putchar(value[2]+0x30);
putchar(value[3]+0x30);
putchar(value[4]+0x30);
value_index=0;
SetupSM=wait_key;
break;
case wait_key: if(key_pressed==ON)
{
switch(key_no)
{
case key0:
case key1:
case key2:
case key3:
case key4:
case key5:
case key6:
case key7:
case key8:
case key9:
if(value_index<5)
{
value[value_index]=key_no;
value_index++;
}
break;
case key_enter:SetupSM=exit_setup;
break;
case key_mod: SetCMD((++mod)&0x03);
display_mod((mod)&0x03);
refresh_led();
break;
default: break;
}
Set_Display_Add(560);
putchar(value[0]+0x30);
putchar(value[1]+0x30);
putchar(value[2]+0x30);
putchar(value[3]+0x30);
putchar(value[4]+0x30);
refresh_led();
key_pressed=OFF;
}
break;
case exit_setup: Freq_temp=value[0];
Freq=Freq_temp*10000;
Freq_temp=value[1];
Freq=Freq+Freq_temp*1000;
Freq_temp=value[2];
Freq=Freq+Freq_temp*100;
Freq_temp=value[3];
Freq=Freq+Freq_temp*10;
Freq=Freq+value[4];
SetPhase(Freq);
Set_Display_Add(560);
putchar(value[0]+0x30);
putchar(value[1]+0x30);
putchar(value[2]+0x30);
putchar(value[3]+0x30);
putchar(value[4]+0x30);
refresh_led();
Set_Display_Add(428);
printf(" ");
refresh_led();
SetupSM=enter_num;
MainSM=Screen;
break;
}
break;
////////////////////////////////////////////////////////////
case TiaoFu: //調幅狀態
SetCMD(2);
display_mod(2);
aa=0;
SetFSM=0;
switch(SetupSM)
{
case enter_num: value[0]=0;//調制波頻率初始值為前一個狀態所設置的值
value[1]=0;
value[2]=0;
value[3]=0;
value[4]=0;
Set_Display_Add(560);
putchar(value[0]+0x30);
putchar(value[1]+0x30);
putchar(value[2]+0x30);
putchar(value[3]+0x30);
putchar(value[4]+0x30);
value_index=0;
SetupSM=wait_key;
break;
case wait_key: if(key_pressed==ON)//提取按鍵值,進行狀態的處理
{
switch(key_no)
{
case key0:
case key1:
case key2:
case key3:
case key4:
case key5:
case key6:
case key7:
case key8:
case key9:
if(value_index<5)
{
value[value_index]=key_no;
value_index++;
}
break;
case key_enter:SetupSM=exit_setup;//按下setup,進行載波調制波頻率的設置
break;
case key_tiao: //若再按下調幅鍵,則進入DDS的最初狀態,即screen狀態,可以進行正常頻率的設置
SetupSM=enter_num;
MainSM=Screen;
SetCMD(0);
display_mod(0);
break;
default: break;
}
Set_Display_Add(560);
putchar(value[0]+0x30);
putchar(value[1]+0x30);
putchar(value[2]+0x30);
putchar(value[3]+0x30);
putchar(value[4]+0x30);
refresh_led();
key_pressed=OFF;
}
break;
case exit_setup: Freq_temp=value[0];
Freq=Freq_temp*10000;
Freq_temp=value[1];
Freq=Freq+Freq_temp*1000;
Freq_temp=value[2];
Freq=Freq+Freq_temp*100;
Freq_temp=value[3];
Freq=Freq+Freq_temp*10;
Freq=Freq+value[4];
SetPhase(Freq);//設置調制波頻率
Set_Display_Add(560);
putchar(value[0]+0x30);
putchar(value[1]+0x30);
putchar(value[2]+0x30);
putchar(value[3]+0x30);
putchar(value[4]+0x30);
refresh_led();
Set_Display_Add(428);
printf(" ");
refresh_led();
SetupSM=enter_num;
MainSM=Screen;
break;
}
break;
////////////////////////////////////////////////////////////
default:
break;
}
} //等待中斷
}
void interrupt_handle() interrupt 0
{
//uchar disdata;
DISABLE; //CPU關中斷
wait(); //鍵盤消抖延時
if (Int_wire==0)
{
key_pressed=ON;
P2=0xFF;
key_no=P2&0x0F; //讀取P2口的低四位顯示數據編碼
}
ENABLE; //CPU開中斷
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -