📄 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 + -