⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ss_sweep.c

📁 DDS-320-func: 在采用 320x240 屏的设计实验箱上运行
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -