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

📄 main.c

📁 以SPCE061A单片机为核心
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "MENU.h"
#include "bit.h"
#include "sposvar.h"
#include "spos.h"
#include "user.h"
#include "9850A.h"
#include "UARTTEST.h"
#define	M_IO_CS	 PA->bit.bit2			//CS与SPCE061A的接口定义
#define N_M_BEGAINFUNC()      (*((*Now_MENU).BeginFunc))()
Uint Keying=0;
unsigned long Step_HZ=100;   //默认步进为100HZ
////////////////////////////////////////////////////////////////////
//                                                                //
//                       OS 相关变量                              //
//                                                                //
////////////////////////////////////////////////////////////////////
int err;          //ERROR NO.
int t1stack[500];  //R-S
int t2stack[50];  //R-S
int dddd222=0;
HEvent G_ICO_sem;
enum FUNC_MODE 
      { 
          SINE=0, 
          PSK=1, 
          ASK=2, 
          FM=3,
          AM=4,
      }MODE;
char str_MODE1[5]="SINE";
char str_MODE2[5]=" PSK";
char str_MODE3[5]=" ASK"; 
char str_MODE4[5]="  FM";
char str_MODE5[5]="  AM";
char *str_MODE[5]={str_MODE1,str_MODE2,str_MODE3,str_MODE4,str_MODE5};
////////////////////////////////////////////////////////////////////
//                                                                //
//                       OS 无关变量                              //
//                                                                //
////////////////////////////////////////////////////////////////////
union _EVENT_FLAG_{
	struct _bit_flag{
		unsigned char INTOSUBMENU		:1;
		unsigned char RETURNMINMENU		:1;
		unsigned char CANNEL 		:1;
		unsigned char OK		:1;
		unsigned char ASK		:1;
		unsigned char PSK		:1;
		unsigned char AM		:1;
		unsigned char FM		:1;
		unsigned char SINE		:1;
		unsigned char Reserve		:9;//保留
	}Bit;
	unsigned char Value;
}MY_Event={0x00};
unsigned long int SET_FREG=100000;
Uint AM_MA=10;    //初始ma值为10%
////////////////////////////////////////////////////////////////////
//                                                                //
//                       菜单相关变量                             //
//                                                                //
////////////////////////////////////////////////////////////////////

MENU Min_MENU,Sub_MENU_SINE,Sub_MENU_PSK,Sub_MENU_ASK,Sub_MENU_FM,Sub_MENU_AM;
MENU *Now_MENU;
unsigned int *PICO[6]={encoding_1286411,encoding_1286412,encoding_1286413,encoding_1286414,encoding_1286415,encoding_1286416};
unsigned int *PICO1[1]={};
int (*PSUBFUNC[6])()={0,0,0,0,0,0};
struct MENU_S (*PSUBMENU[6])={&Sub_MENU_SINE,&Sub_MENU_PSK,&Sub_MENU_ASK,&Sub_MENU_FM,&Sub_MENU_AM,0};
Uint *G_ICO[2]={TU_GUANGBIAOh,TU_GUANGBIAOb};
Uint  G_ICO_X=16;
Uint  G_ICO_Y=32;
void Psk_Sub_FUNC();
void Ask_Sub_FUNC();
void FM_Sub_FUNC();
void AM_Sub_FUNC();
Uint SINE_SET_INPUT_MODE=0;
////////////////////////////////////////////////////////////////////
//                                                                //
//                         功能函数声明                           //
//                                                                //
////////////////////////////////////////////////////////////////////
void ReturnTOSUBMENU();     //返回主菜单
void Menu_init();    //菜单初始化
Uint ScanKeyTask();  //KEY
void InTOSUBMENU();  //进入子菜单
void SYS_IO_INIT();  //io init
void LCDMENUDROW();  //通用界面
Uint INPUT_SINE();     //输入函数
void Sine_Sub_FUNC();  //sine 功能函数
void FMReady(unsigned long center_freq,Uint offset);
void LOGIN();
////////////////////////////////////////////////////////////////////
//                                                                //
//                       中断函数                                 //
//                                                                //
////////////////////////////////////////////////////////////////////

void IRQ1_TMA_ISR()
{
	static	Uint fmi;
	if(fmi<31)
	{
		fmi++;
	}
	else fmi=0;
//*	SendFreq(CurrentFreq+DirUnFMed[fmi]);
	f_freqword=DirFMword[fmi];
	UpdateDDS();
}
void IRQ2_TMB_ISR()
{
	static Uint ami;
	if(ami<41)
	{
		ami++;
	}
	else ami=0;
	DA0=AMoffset[ami];
}
////////////////////////////////////////////////////////////////////
//                                                                //
//                       主函数                                   //
//                                                                //
////////////////////////////////////////////////////////////////////

void main(void)

{
	void MainTask();
    void Timer_INT();
    void DisPlay();
    void Task1();
    void IRQ1_TMA_ISR();
    void IRQ2_TMB_ISR();
    Delaydds(10);
	SpSInit();
	MODE=0xff;
	Menu_init();
	SYS_IO_INIT();
	LCD501_Init(0);				//初始化端口、包括LCD的初始设置、以及显示初始(即传到函数的参数
    LCD501_SetContrast(05);
    err = SpSTaskCreate(MainTask,0,t1stack+499,1);
    SpSSetVector(IRQ1_TMA_VEC,IRQ1_TMA_ISR);
    SpSSetVector(IRQ2_TMB_VEC,IRQ2_TMB_ISR);
    Now_MENU=&Min_MENU;
    G_ICO_sem=SpSSemCreate(0);
    P1_7=0;
	SpSStart();
}





////////////////////////////////////////////////////////////////////
//                                                                //
//                         系统任务                               //
//                                                                //
////////////////////////////////////////////////////////////////////
void MainTask()
{
	Uint dd=0;
	Uint Key = 0;
	int BBB[8];
	unsigned int  iii;
	SET_FREG=100000;      //初始化100KHZ
	SendFreq(SET_FREG);
	N_M_BEGAINFUNC();
	while(1)
	{
		Watchdog_Clear = 0x0001;
		Key=ScanKeyTask();	
		switch(Key)
		{
			case 0x11 : 
			if((*Now_MENU).IDPoint==0)
    			(*Now_MENU).IDPoint=(*Now_MENU).ucCount;  	
			if((*Now_MENU).IDPoint>0)
    			(*Now_MENU).IDPoint--;
			N_M_BEGAINFUNC();//(*((*Now_MENU).BeginFunc))();   
   			break;
			case 0x41 :   //2	
			if((*Now_MENU).IDPoint<(*Now_MENU).ucCount)
    			(*Now_MENU).IDPoint++;
    		if((*Now_MENU).IDPoint==(*Now_MENU).ucCount)
    			(*Now_MENU).IDPoint=0;
    		N_M_BEGAINFUNC();//(*((*Now_MENU).BeginFunc))()
			break;
			case 0x81 :   //3
			InTOSUBMENU();
			break;
		 	case 0x12 :   //4
		 	//iii=iii+100;
		 //	SendFreq(iii);
			break;
			case 0x22 :   //5
		//	iii=iii-100;
		//	SendFreq(iii);
			break;
			case 0x42 :   //6
			break; 
			case 0x82 :   //7
			ReturnTOSUBMENU();
			break;
			case 0x14 :   //8
			break;
			case 0x24 :   //9  
			break;
		/*	case 0x44 :   //10
			break;
			case 0x84 :   //11
			break;
			case 0x18 :   //12
			break;
			case 0x28 :   //13
			break;*/
			case 0x48 :   //14
			break;   
			case 0x88 :   //15
			break;
			default:
			break;
		}
		SpSTimeDly(1);
	}
}


void DisPlay()
{

	static int YD_vv=0;
	char DisPlay_ID=0;
	Uint DisPlay_i;
	while(1)
    {
    	Watchdog_Clear = 0x0001;
    	LCD501_Bitmap(G_ICO_X,G_ICO_Y,G_ICO[DisPlay_ID],0);
    	if(DisPlay_ID==0)
    		DisPlay_ID=1;
    	else if(DisPlay_ID==1)
    		DisPlay_ID=0;
    	Delaydds(2000);
    	SpSTimeDly(1);
    }
}
////////////////////////////////////////////////////////////////////
//                                                                //
//                         功能函数                               //
//                                                                //
////////////////////////////////////////////////////////////////////

void SYS_IO_INIT()
{
	P0_Dir_Highbyte=0xf0;
	P0_Attrib_Highbyte=0xf0;
	P0_Highbyte=0xf0;
	P1_Dir=0xffff;
	P1_Attrib=0xffff;
	P1=0;
}
Uint ScanKeyTask()             //键盘扫描任务
{  
	unsigned int iTemp;
    unsigned int Keyval;

		Watchdog_Clear=1;
		P0_Dir_Highbyte=0xf0;
	    P0_Attrib_Highbyte=0xf0;
		P0_Highbyte=0xf0;
		Delaydds(10);
        Keyval = P0_Highbyte;
        if(Keyval!=0xf0)
        {
        	Keyval = P0_Highbyte;
        	if(Keyval!=0xf0)
        	{
        		Keyval&=0x0f;
        		P0_Dir_Highbyte=0x0f;
	    		P0_Attrib_Highbyte=0x0f;
				P0_Highbyte=0x0f;
				SpSTimeDly(1);
				iTemp=P0_Highbyte;
				Keyval|= iTemp&0xf0;
				while(P0_Highbyte==iTemp)
				{
					Delaydds(10);
					Watchdog_Clear=1;	
				}
			return Keyval;
			}
        }
}
void FMReady(unsigned long center_freq,Uint offset)
{
	Uint mi;
	SpFSetTimer(OS_SET_TIMEA,0x30,0xfd00);				//center_freqword=freq*42.949673;
	for(mi=0;mi<32;mi++)		//f_freqword=(center_freq+deltafreq)*42.949673=center_freqword+deltafreq*42.949673;
	{
		
		if(offset)
		{
			DirFMword[mi]=(unsigned long)((DirUnFMed[mi]+center_freq)*42.94967296);
		}
		else
		{
			DirFMword[mi]=(unsigned long)(DirUnFMed[mi]*21.47483648+center_freq*42.94967296);
		}
	}
}

void AMReady(Uint ma)			//他妈的ma怎么确定调制信号的幅度和偏移啊??
{
	Uint mi;
	float aama;
	if(ma<=100)
	{
		aama=ma;
		aama=aama/100;	
		SpFSetTimer(OS_SET_TIMEB,0,0xfdb7);	
		for(mi=0;mi<42;mi++)
		{
			AMoffset[mi]=(Uint)((aama*UnAMed[mi])+32767);
		}
	}
}


////////////////////////////////////////////////////////////////////
//                                                                //
//                    菜单相关功能函数                            //
//                                                                //
////////////////////////////////////////////////////////////////////
void Menu_init()
{
	Min_MENU.ucCount=6;
	Min_MENU.pIcon=PICO;
	Min_MENU.BeginFunc=heiheiDisplayMenu;
	Min_MENU.IDPoint=0;
	Min_MENU.SubFunc=PSUBFUNC;
	Min_MENU.SubMenu=PSUBMENU;
	PSUBFUNC[0]=InTOSUBMENU;
	Sub_MENU_SINE.ucCount=1;
	Sub_MENU_SINE.pIcon=PICO1;
	Sub_MENU_SINE.BeginFunc=Sine_Sub_FUNC;
	Sub_MENU_SINE.IDPoint=0;
	Sub_MENU_SINE.SubFunc=0;
	Sub_MENU_PSK.ucCount=1;
	Sub_MENU_PSK.pIcon=PICO1;
	Sub_MENU_PSK.BeginFunc=Psk_Sub_FUNC;
	Sub_MENU_PSK.IDPoint=0;
	Sub_MENU_PSK.SubFunc=0;
	Sub_MENU_ASK.ucCount=1;
	Sub_MENU_ASK.pIcon=PICO1;
	Sub_MENU_ASK.BeginFunc=Ask_Sub_FUNC;
	Sub_MENU_ASK.IDPoint=0;
	Sub_MENU_ASK.SubFunc=0;
	Sub_MENU_FM.ucCount=1;
	Sub_MENU_FM.pIcon=PICO1;
	Sub_MENU_FM.BeginFunc=FM_Sub_FUNC;
	Sub_MENU_FM.IDPoint=0;
	Sub_MENU_FM.SubFunc=0;
	Sub_MENU_AM.ucCount=1;
	Sub_MENU_AM.pIcon=PICO1;
	Sub_MENU_AM.BeginFunc=AM_Sub_FUNC;
	Sub_MENU_AM.IDPoint=0;
	Sub_MENU_AM.SubFunc=0;
}
void heiheiDisplayMenu()
{
	LCD501_ClrScreen(0);
	LCD501_Bitmap(0,0,(*Now_MENU).pIcon[(*Now_MENU).IDPoint],0);
}
void InTOSUBMENU()     //进入子菜单
{
	Now_MENU=((*Now_MENU).SubMenu)[(*Now_MENU).IDPoint];
	N_M_BEGAINFUNC();
}

void ReturnTOSUBMENU()     //返回主菜单
{
	Now_MENU=&Min_MENU;
}

void LCDMENUDROW()        //通用界面
{
	LCD501_ClrScreen(0);
	LCD501_Rectangle(0,0,127,63,0);
	LCD501_Bitmap(1,1,hanzi_dang);
	LCD501_Bitmap(17,1,hanzi_qiang);
	LCD501_Bitmap(17+16,1,hanzi_mo);
	LCD501_Bitmap(17+16+16,1,hanzi_shi);
	LCD501_PutString(17+16+16+16,1,":");
	LCD501_PutString(17+16+16+16+8,1,str_MODE[MODE]);
	if(MODE==SINE||MODE==AM)
		LCD501_PutString(1,16+1,"KEY5 +  KEY6 -");
	if(MODE==FM)
		LCD501_PutString(1,16+1,"K7 10K   K8 5K");
}
void INPUT_SINE_DROW()
{
	LCD501_PutString(93,32,"HZ"); 
	LCD501_Bitmap(0,0,hanzi_qing);
	LCD501_Bitmap(16,0,hanzi_shu);
	LCD501_Bitmap(16+16,0,hanzi_ru);
	LCD501_Bitmap(16+16+16,0,hanzi_she);
	LCD501_Bitmap(16+16+16+16,0,hanzi_ding);
	LCD501_Bitmap(16+16+16+16+16,0,hanzi_pin);
	LCD501_Bitmap(16+16+16+16+16+16,0,hanzi_lv);
	LCD501_PutString(16+16+16+16+16+16+16,0,":");
}
void INPUT_AM_DROW()
{
	LCD501_PutString(93,32,"%"); 
	LCD501_Bitmap(0,0,hanzi_qing);
	LCD501_Bitmap(16,0,hanzi_shu);
	LCD501_Bitmap(16+16,0,hanzi_ru);
	LCD501_Bitmap(16+16+16,0,hanzi_she);
	LCD501_Bitmap(16+16+16+16,0,hanzi_ding);
	LCD501_PutString(16+16+16+16+16,0,":");
 	LCD501_PutString(16+16+16+16+16+8,0,"ma");
 	LCD501_PutString(16+16+16+16+16+8+16,0,"%");
 
}

Uint INPUT_SINE()      //输入函数
{
	char INPUT_NUM[8];
	Uint Key = 0;
	Uint INPUT_NUM_ID=0;
	Uint INPUT_ii;
	static unsigned long old_SET_FREG=0;
	unsigned long NOW_SET_FREG=0;
	G_ICO_X=16;
	LCD501_ClrScreen(0);	
	err = SpSTaskCreate(DisPlay,0,t2stack+49,3);
	INPUT_SINE_DROW();
	if(SINE_SET_INPUT_MODE==2)
	{
		LCD501_Bitmap(16+16+16,0,hanzi_bu);
		LCD501_Bitmap(16+16+16+16,0,hanzi_jin);
	}
	while(1)
	{
		Watchdog_Clear = 0x0001;
		Key=ScanKeyTask();
		if(INPUT_NUM_ID>0)	
		{
			switch(Key)
			{
				case 0x84 :   //11
				NOW_SET_FREG=(NOW_SET_FREG-INPUT_NUM[INPUT_NUM_ID-1]+'0')/10;
				INPUT_NUM_ID--;
				G_ICO_X-=8;
				LCD501_ClrScreen(0);
				INPUT_SINE_DROW();
				break;
				case 0x81 :   //3
				MY_Event.Bit.OK=1;
				//返回SET_FREG值
				break;
				default:
				break;
			}
		}
		if(INPUT_NUM_ID<8)
		{
			switch(Key)
			{
				case 0x11 :  	
   				break;
				case 0x21 :
				if(INPUT_NUM_ID==0)
					break;
				INPUT_NUM[INPUT_NUM_ID]=0+'0';
				NOW_SET_FREG=NOW_SET_FREG*10+0;	
				G_ICO_X+=8;	   
				INPUT_NUM_ID++; 
				break;
			//	case 0x41 :   //2		
			//	break;
				case 0x12 :   //4

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -