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

📄 menu_func.h

📁 自己花了很长时间编写的单片机开发板程序
💻 H
📖 第 1 页 / 共 2 页
字号:
#ifndef __menu_func_H__
#define __menu_func_H__

//菜单号
#define MENU_FACE							        0
#define MENU_ROOT						         	1
#define 	MENU_VIEW					         	2
#define			MENU_VIEW_1			            	3
#define			MENU_VIEW_2			            	4
#define         MENU_VIEW_3                         5
#define		MENU_OPERATION					    	6
#define			MENU_OPERATION_1	            	7
#define			MENU_OPERATION_2                	8
#define         MENU_OPERATION_3					9
#define         MENU_OPERATION_4                    10
#define		MENU_TEST						        11
#define			MENU_TEST_1			            	12
#define			MENU_TEST_2			            	13
#define         MENU_TEST_3                         14
#define         MENU_TEST_4                         15
#define		MENU_HELP						        16
#define			MENU_HELP_1			            	17
#define		    MENU_HELP_2                	        18 
//键盘编码
#define KEY_OK    0x0f
#define KEY_ESC   0x0c
#define KEY_DOWN  0x07
#define KEY_UP    0x03
#define KEY_0     0x0d
#define KEY_1     0x00
#define KEY_2     0x01
#define KEY_3     0x02
#define KEY_4     0x04
#define KEY_5     0x05
#define KEY_6     0x06
#define KEY_7     0x08
#define KEY_8     0x09
#define KEY_9     0x0a
#define KEY_shift 0x0b
#define KEY_A     0x6a
#define KEY_B     0x6b
#define KEY_C     0x6c
#define KEY_D     0x6d
#define KEY_E     0x6e
#define KEY_F     0x6f
#define KeyIO     XBYTE[0x8001]						   // 键盘 IO 口

												   
uchar iMenuID;			                       //菜单索引号
uchar TextInputTemp,NowKey,temp,temp1,Motor_speed;
bit   KeyInputTemp,NowKeyReg;
//函数声明 
extern void GetKeyInput();
extern void DispFaceBmp();
extern void DispMenu_Root();
extern void DispMenu_View();
extern void DispMenu_Operation();
extern void DispMenu_Test();
extern void DispMenu_Help();					   
extern void MenuFunction();
extern void Menu_DispTmp();
extern void Menu_Memory_WrData();
extern void Menu_Memory_ReData();
extern void DispNull(uchar x); 
extern void Menu_TextInput();
extern void JudgeHLight();
extern void MenuFunction_Help_2();
extern void DispKeyID();
extern void Menu_ADC0832();
extern void Menu_DAC0808();
extern void Menu_Back();
extern void Menu_SerialReceive_PC();
extern void Menu_SerialSend_PC();
extern void Menu_SerialReceive_MCU();
extern void Menu_SerialSend_MCU();
extern void Menu_Motor_s();

typedef xdata struct  
	{
	    uchar KeyTab_MenuIndex;	         	//当前状态索引号	   
        uchar KeyTab_PressOk;           	//按下"回车"键时转向的状态索引号	  
        uchar KeyTab_PressEsc;	        	//按下"返回"键时转向的状态索引号	  
        uchar KeyTab_PressDown;    	        //按下"向下"键时转向的状态索引号	  
        uchar KeyTab_PressUp;           	//按下"向上"键时转向的状态索引号	  
     	void      ( code *CurrentOperate)();   //当前状态应该执行的功能操作
	}KeyTabStruct;
void  ( code *KeyFuncPtr)();                       //按键功能指针
//CurMenuID=本菜单ID 
//OkMenuID=子菜单层所对应的菜单ID,ID=254已经到底了		 
//EscMenuID=父菜单层所对应的菜单ID,ID=254为菜单已经到顶了			 
//DownMenuID=弟菜单层所对应的菜单ID,ID=254为菜单是独生子		   
//UpMenuID=兄菜单层所对应的菜单ID,ID=254 单是独生子			   
//CurFunction=本菜单所对应的菜单函数指针
KeyTabStruct xdata KeyTab[]=
	{
		//CurMenuID,        OkMenuID,         EscMenuID,       DownMenuID,           UpMenuID,        CurFunction
		{MENU_FACE, 	    MENU_ROOT,        254,             254,                  254,             (*DispFaceBmp)},
		{MENU_ROOT,	        MENU_VIEW,        254,             254,                  254,             (*DispMenu_Root)},
		{MENU_VIEW,	        MENU_VIEW_1,      MENU_ROOT,       MENU_OPERATION,       MENU_HELP,       (*DispMenu_View)},
		{MENU_VIEW_1,       254,              MENU_VIEW,       MENU_VIEW_2,	         MENU_VIEW_3,     (*Menu_DispTmp)},
		{MENU_VIEW_2,       254,              MENU_VIEW,       MENU_VIEW_3,	         MENU_VIEW_1,     (*Menu_DAC0808)},
		{MENU_VIEW_3,       254,              MENU_VIEW,       MENU_VIEW_1,          MENU_VIEW_2,     (*Menu_ADC0832)},
		{MENU_OPERATION,	MENU_OPERATION_1, MENU_ROOT,   	   MENU_TEST,            MENU_VIEW,       (*DispMenu_Operation)},
		{MENU_OPERATION_1,  254,              MENU_OPERATION,  MENU_OPERATION_2,     MENU_OPERATION_4,(*Menu_Motor_s)},
		{MENU_OPERATION_2,  254,              MENU_OPERATION,  MENU_OPERATION_3,     MENU_OPERATION_1,(*Menu_Memory_WrData)},
		{MENU_OPERATION_3,  254,              MENU_OPERATION,  MENU_OPERATION_4,     MENU_OPERATION_2,(*Menu_Memory_ReData)},
		{MENU_OPERATION_4,  254,              MENU_OPERATION,  MENU_OPERATION_1,     MENU_OPERATION_3,(*Menu_TextInput)},			
		{MENU_TEST,         MENU_TEST_1,      MENU_ROOT,       MENU_HELP,            MENU_OPERATION,  (*DispMenu_Test)},
		{MENU_TEST_1,       254,              MENU_TEST,       MENU_TEST_2,          MENU_TEST_4,     (*Menu_SerialReceive_PC)},
		{MENU_TEST_2,    	254,              MENU_TEST,       MENU_TEST_3,          MENU_TEST_1,     (*Menu_SerialSend_PC)},
		{MENU_TEST_3,    	254,              MENU_TEST,       MENU_TEST_4,          MENU_TEST_2,     (*Menu_SerialReceive_MCU)},
		{MENU_TEST_4,    	254,              MENU_TEST,       MENU_TEST_1,          MENU_TEST_3,     (*Menu_SerialSend_MCU)},
		{MENU_HELP,         MENU_HELP_1,      MENU_ROOT,       MENU_VIEW,            MENU_TEST,       (*DispMenu_Help)},
		{MENU_HELP_1,       254,              MENU_HELP,       MENU_HELP_2,          MENU_HELP_2,     (*MenuFunction)},
		{MENU_HELP_2,	    254,              MENU_HELP,       MENU_HELP_1,          MENU_HELP_1, 	  (*MenuFunction_Help_2)},
	};

/*----------------------接收菜单功能键---------*/
void GetKeyInput()
{
       	switch(NowKey)			 
			{
			  case	KEY_OK://   KEY_OK,		KEY_UP,		KEY_ESC,
				   	
				          if(KeyTab[iMenuID].KeyTab_PressOk!=254)		    //   按下OK键时的状态
						  {
						     iMenuID=KeyTab[iMenuID].KeyTab_PressOk;
						     JudgeHLight();	 					 	 				  		
						  }
				     	else											    //已经到底层
						  {
						     KeyFuncPtr=KeyTab[iMenuID].CurrentOperate;					 							 
    			             ( *KeyFuncPtr)();			 				    //      执行当前ID的功能函数
						  }	   
						     				
					break;			
		     case	KEY_ESC:
					
					if(KeyTab[iMenuID].KeyTab_PressEsc!=254)
						{					      
						   iMenuID=KeyTab[iMenuID].KeyTab_PressEsc;         //     按下ESC键时的状态  	  
						   JudgeHLight();	   		 		
						}
					break;
			 case	KEY_DOWN:
					if(KeyTab[iMenuID].KeyTab_PressDown!=254)
						{												//     按下DOWN键时的状态
						  iMenuID=KeyTab[iMenuID].KeyTab_PressDown;
						  JudgeHLight();					
						}
					break;
		     case	KEY_UP:
					if(KeyTab[iMenuID].KeyTab_PressUp!=254)
						{												 //       按下UP键时的状态
					    	iMenuID=KeyTab[iMenuID].KeyTab_PressUp;	
					     	JudgeHLight();						
						}
					break; 		
					 					
			 default:
					break; 		
		}

}





/*-----------显示当前的菜单----------*/
void JudgeHLight()
{
   switch(iMenuID)
	{
	  case	MENU_FACE:
			DispFaceBmp();
			break;
      case	MENU_ROOT:
			DispFaceBmp();
			break;
	  case	MENU_VIEW:
			DispMenu_Root();
			break;
	  case	MENU_VIEW_1:
	  case	MENU_VIEW_2:
	  case  MENU_VIEW_3:	
			DispMenu_View();
			break;
	  case	MENU_OPERATION:
			DispMenu_Root();
			break;
	  case	MENU_OPERATION_1:
	  case	MENU_OPERATION_2:
	  case	MENU_OPERATION_3:
	  case	MENU_OPERATION_4:
			DispMenu_Operation();
			break;
	  case	MENU_TEST:
			DispMenu_Root();
			break;
	  case	MENU_TEST_1:
	  case	MENU_TEST_2:
	  case  MENU_TEST_3:
	  case  MENU_TEST_4:
			DispMenu_Test();
			break;
	  case	MENU_HELP:
			DispMenu_Root();
			break;
	  case	MENU_HELP_1:
	  case  MENU_HELP_2:        
			DispMenu_Help();
			break; 		
	  default:
			break;
	}

//////////////////////////反百显示当前按钮//////////////////////
	switch (iMenuID)								 
	  {   
	      case  MENU_VIEW: 
				  
				   chn_fdisp(0,0,2,16,1,2,hz_view);					  
			
				break;
		  case  MENU_VIEW_1: 
				  
				    chn_fdisp(0,0,2,16,1,2,hz_view_1); 
				   
				break;
		  case  MENU_VIEW_2:		          
				    chn_fdisp(2,0,2,16,1,2,hz_view_2);				   
				break;
		  case  MENU_VIEW_3:
		            chn_fdisp(4,0,2,16,1,1,hz_view_2+32); 
                    chn_fdisp(4,16,2,16,1,1,hz_view_2);
		        break;
		  case  MENU_OPERATION: 

				   chn_fdisp(2,0,2,16,1,2,hz_operation);
				break;
		  case  MENU_OPERATION_1: 

				   chn_fdisp(0,0,2,16,1,4,hz_operation_1);
				break;
		  case  MENU_OPERATION_2:   
				   chn_fdisp(2,0,2,16,1,2,hz_operation_2);	//数据
                   chn_fdisp(2,32,2,16,1,2,hz_operation_3);	//存储
				break;
		  case  MENU_OPERATION_3:   
				   
				 chn_fdisp(4,0,2,16,1,2,hz_operation_2);    //数据
                 chn_fdisp(4,32,2,16,1,2,hz_operation_4);	//读取 
				break;
		  case	MENU_OPERATION_4:
		         chn_fdisp(6,0,2,16,1,4,hz_operation_5);
				break;
		  case  MENU_TEST: 
				   
				   chn_fdisp(4,0,2,16,1,2,hz_test);
				  
				break;
		  case  MENU_TEST_1:			  
				   
				    chn_fdisp(0,0,2,16,1,2,hz_test_1);
                    chn_fdisp(0,32,2,16,1,2,hz_test_2);	
				  				
				break;
		  case  MENU_TEST_2: 			   				   
                  
				   chn_fdisp(2,0,2,16,1,2,hz_test_1);
                   chn_fdisp(2,32,2,16,1,2,hz_test_3);				
				  
				break;
		  case  MENU_TEST_3:
		         chn_fdisp(4,0,2,16,1,2,hz_test_4);
                 chn_fdisp(4,32,2,16,1,2,hz_test_2);
		        break;
		  case  MENU_TEST_4:
		          chn_fdisp(6,0,2,16,1,2,hz_test_4);
                  chn_fdisp(6,32,2,16,1,2,hz_test_3); 
		        break;
		  case  MENU_HELP:	       
				   chn_fdisp(6,0,2,16,1,2,hz_help);				
				break;		  
		  case  MENU_HELP_1: 			   
				   chn_fdisp(0,0,2,16,1,2,hz_help);
                   num_disp(1,0,32,1); 			 
				break;
		  case  MENU_HELP_2:
				   chn_fdisp(2,0,2,16,1,2,hz_about);
				break;
		  default: 
				break;    
	  }

}

void MenuFunction()
{    
}

/*-------显示开机画面-------*/
void DispFaceBmp()
{  
   clrscr();
   cs1=1;
   cs2=0;
   chn_disp(0,0,2,16,1,4,hz_face);
   chn_disp(4,0,2,16,1,3,hz_make);
   chn_disp(6,32,2,8,1,4,hz_me);
   cs1=0;
   cs2=1;
   chn_disp(0,0,2,16,1,4,(hz_face+128));
   chn_disp(6,0,2,8,1,8,(hz_me+64));
     
}
/*---------显示主目录-----------*/
void DispMenu_Root()
{
   clrscr();
   cs1=1;
   cs2=0;
   chn_disp(0,0,2,16,1,2,hz_view);
   chn_disp(2,0,2,16,1,2,hz_operation);
   chn_disp(4,0,2,16,1,2,hz_test);
   chn_disp(6,0,2,16,1,2,hz_help);
} 
/*-----------显示查看子目录----------*/
void DispMenu_View()
{
   clrscr();
   cs1=1;
   cs2=0;	   
   chn_disp(0,0,2,16,1,2,hz_view_1);  		  //温度
   chn_disp(2,0,2,16,1,2,hz_view_2);		  //数模
   chn_disp(4,0,2,16,1,1,hz_view_2+32); 	  //模数
   chn_disp(4,16,2,16,1,1,hz_view_2); 
}
/*-----------显示工具子目录----------*/
void DispMenu_Operation()
{
  clrscr();
  cs1=1;
  cs2=0;
  chn_disp(0,0,2,16,1,4,hz_operation_1);
  chn_disp(2,0,2,16,1,2,hz_operation_2);	//数据
  chn_disp(2,32,2,16,1,2,hz_operation_3);	//存储
  chn_disp(4,0,2,16,1,2,hz_operation_2);    //数据
  chn_disp(4,32,2,16,1,2,hz_operation_4);	//读取
  chn_disp(6,0,2,16,1,4,hz_operation_5); 
}
/*-----------显示通信子目录------------*/
void DispMenu_Test()
{
  clrscr(); 
  cs1=1;
  cs2=0; 
  chn_disp(0,0,2,16,1,2,hz_test_1);
  chn_disp(0,32,2,16,1,2,hz_test_2);
  chn_disp(2,0,2,16,1,2,hz_test_1);
  chn_disp(2,32,2,16,1,2,hz_test_3);
  chn_disp(4,0,2,16,1,2,hz_test_4);
  chn_disp(4,32,2,16,1,2,hz_test_2);
  chn_disp(6,0,2,16,1,2,hz_test_4);
  chn_disp(6,32,2,16,1,2,hz_test_3);  
}
/*--------------显示帮助子目录----------*/
void DispMenu_Help()
{  
   clrscr();	   
   num_disp(1,0,32,1);
   chn_disp(0,0,2,16,1,2,hz_help);   
   chn_disp(2,0,2,16,1,2,hz_about);	
}
/*-------------------输出文本-------------------------*/
void GetTextInput()
{
   while(NowKey==KEY_shift)					  //2ND上当键判断
   {
	  //EX0=1;
	  cs1=0;
	  cs2=1;      
	  chn_disp(6,48,2,16,1,1,hz_shift);
	  if (NowKey==KEY_1)
	       NowKey=KEY_A;
	  if (NowKey==KEY_2)
	       NowKey=KEY_B;
	  if (NowKey==KEY_3)
	       NowKey=KEY_C;
	  if (NowKey==KEY_4)
	       NowKey=KEY_D;
	  if (NowKey==KEY_5)
	       NowKey=KEY_E;
	  if (NowKey==KEY_6)
	       NowKey=KEY_F;
   }
   chn_disp(6,48,2,16,1,1,hz_null);							 
	if (NowKeyReg)				              //    判断当前按键有无变化
		{  
		   KeyInputTemp=1;
		   if (NowKey==KEY_0)				  //    查当前按键的键对应的数字
		        TextInputTemp=0;
		   else if(NowKey==KEY_1)
		        TextInputTemp=1;
		   else if(NowKey==KEY_2)
		        TextInputTemp=2;
		   else if(NowKey==KEY_3)
		        TextInputTemp=3;
		   else if(NowKey==KEY_4)
		        TextInputTemp=4;
		   else if(NowKey==KEY_5)
		        TextInputTemp=5;
		   else if(NowKey==KEY_6)
		        TextInputTemp=6;
		   else if(NowKey==KEY_7)
		        TextInputTemp=7;
		   else if(NowKey==KEY_8)
		        TextInputTemp=8;
		   else if(NowKey==KEY_9)
		        TextInputTemp=9;
		   else if(NowKey==KEY_A)
		        TextInputTemp=10;
		   else if(NowKey==KEY_B)
		        TextInputTemp=11;
		   else if(NowKey==KEY_C)
		        TextInputTemp=12;
		   else if(NowKey==KEY_D)
		        TextInputTemp=13;
		   else if(NowKey==KEY_E)
		        TextInputTemp=14;
		   else if(NowKey==KEY_F)
		        TextInputTemp=15;
		   else   KeyInputTemp=0; 	 
		   NowKeyReg=0;
	    }
	 
}
/*---------------------------文本输入------------------------------*/
void Menu_TextInput()
{
	 uchar x,y,j;
	 bit cs3=1;	 
	 clrscr();	 	 
	 KeyInputTemp=0;	 	 
	 while (NowKey!=KEY_ESC)	   			       //   按ESC键退出
	 {
	    //EX0=1;						 
		GetTextInput();
		if (KeyInputTemp==1)					   //    输出数字
		 { 
		       num_disp(cs3,x,y,TextInputTemp);			   
			   y+=8;
			   if(y==64)						   //     输出8个数字时换右屏
			   {
			     cs3=!cs3;
				 y=0;
				 j++;								  
			   }
			   if(j==2)							   //      输出16个数字时换行
			   {
			     x+=2;
				 j=0;
			   }
			   if(x==8)
			   { 
			      x=0;
				  clrscr();
			   }
			   KeyInputTemp=0;			   
		 }
	  	 
	 }
	 
   Menu_Back();

}

/*------------温度监测--------------*/
void Menu_DispTmp()
{
   
  clrscr();
  config_18b20();
  chn_disp(0,0,2,16,1,2,hz_view_1);  
  while(NowKey!=KEY_ESC)
  {	  
      //EX0=1;    
      get_tmp();
	  if(tmp>99)
	  {   
		 num_disp(0,0,0,tmp/100);				   //显示百位
	     num_disp(0,0,8,tmp/10%10);				   //显示十位
		 num_disp(0,0,16,tmp%100%10);			   //显示个位
		 chn_disp(0,24,2,8,1,1,hz_dot);
		 num_disp(0,0,32,tmpd);			          //小数点后一位 		 
		 chn_disp(0,40,2,8,1,1,hz_oc);
	  }
	  else  
	    {
	     
		 num_disp(0,0,8,tmp/10);
		 num_disp(0,0,16,tmp%10);
		 if(tmp_f)
		  {
		   chn_disp(0,0,2,8,1,1,hz_s_);			  //显示负号
		  }
		 else chn_disp(0,0,2,8,1,1,hz_null);	  // 不显示负号
		 chn_disp(0,24,2,8,1,1,hz_dot);
		 num_disp(0,0,32,tmpd);
		// con_disp(0,0,40,tmpd%10);			  //小数点后两位
		 chn_disp(0,40,2,8,1,1,hz_oc);
	    }

  }
 Menu_Back();
}
/*--------------步进电机--------------------*/
Timer1() interrupt 3 using 1
{
  uchar P_motor2[]={0x20,0x6f,0x40,0xc0,0x80,0x90,0x10,0x30};  
  uint timer;  
  temp1=(temp1&0x0f)|P_motor2[temp];
  PC8255=temp1;  
  temp++;
  if(temp==8) 
    temp=0;
  timer=0xffff-1250000/Motor_speed;				// 定时常数计算 
  TH1=timer>>8;
  TL1=timer&&0x00ff; 
  
}

void Menu_Motor_s()
{
  uchar P_motor1[]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03};  
  uchar i=0;
  clrscr();
  Motor_speed=20;
  TMOD=0x20;  			   //T1方式2
  TH1=0x0b;				   //每分钟20转的初值
  TL1=0xdb;
  temp=0;
  num_disp(1,0,0,Motor_speed/100);
  num_disp(1,0,8,Motor_speed/10%10);
  num_disp(1,0,16,Motor_speed%10);
  COM8255=0x82;	           //B口输入,C口输出 
  temp1=0x00;
  ET1=1;
  TR1=1;   
  while(NowKey!=KEY_ESC)
  {
   //EX0=1;  
   if (NowKey==KEY_1)
   {
     TR1=0;
     temp1=(temp1&0xf0)|P_motor1[i];
	 PC8255=temp1;	 
	 delay(10);
	 i++;
	 NowKey=0xff;	 
	 if(i==8)
	 {
	   i=0;
	 }
	 TR1=1; 

⌨️ 快捷键说明

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