12684 菜单功能实现

/*******************************
*  声明,此代码我不是原编的,是我看到别人的代码,感觉思路很不错,
*  重新整理下,加了些注释的。仅供大家学习之用
/*******************************


//***************************************//
//函数名称:choose
//函数参数:无
//函数共呢:实现菜单的功能
//**************************************//
void Choose()//功能键选择
{
	unsigned char Key_data = 0x00;
	Key_data = Key();
	switch(Key_data)
	{
	 	case 0x01: 			   //Up_key
		{
			Up_Func();			//调用UP函数
			Index = Menu_Tab[Index].Up_data;	//给Index赋值
			LCD12864_Clean();									//液晶清平
			(*(Menu_Tab[Index].Operate))(); 	//调用函数操作
			break;
		}
		case 0x02: 			   //Down_key
		{
			Down_Func();
			Index = Menu_Tab[Index].Down_data; 
			LCD12864_Clean();
			(*(Menu_Tab[Index].Operate))();
			break;
		}
		case 0x03: 			   //Left_key
		{
			Left_Func();
			Index = Menu_Tab[Index].Left_data; 
			LCD12864_Clean();
			(*(Menu_Tab[Index].Operate))();
			break;
		}
		case 0x04: 			   //Right_key
		{
			Right_Func();
			Index = Menu_Tab[Index].Right_data;
			LCD12864_Clean();
			(*(Menu_Tab[Index].Operate))();
			break;
		}
		case 0x05: 			   //Ok_key
		{
			Ok_Func();
			Index = Menu_Tab[Index].Ok_data;
			LCD12864_Clean();
			(*(Menu_Tab[Index].Operate))();
			break;
		}
		case 0x06: 			   //Ese_key
		{
			Ese_Func();
			Index = Menu_Tab[Index].Ese_data;
			LCD12864_Clean();
			(*(Menu_Tab[Index].Operate))();
			break;
		}
	}
}

//***************************************//
//函数名称:Up_Func
//函数参数:无
//函数共呢:实现菜单的上翻功能
//**************************************//

void Up_Func()
{
	if(Index >= 1 && Index <= 3)								//在main菜单中Up键的功能
	{	
		Main_Menu_Index--;
		if(Main_Menu_Index == 0xff)								
		{
			Main_First_Index = 3-3;									//Main_First_Index 和 Main_Menu_Index 两标签的作用:
			Main_Menu_Index  = 2;										//因为菜单选中需要反选,以示选中,所以这两个标签的作用就是标记莫一行反选
		}
		else if(Main_Menu_Index == (Main_First_Index - 1))
		{
			
			Main_First_Index--;
		}	
	}
	
	//下面就是在不同的菜单中的其他功能了,编写很上面的基本相同
	/*
	if((Index >= 5 && Index <= 7)||Index==16)								//在Work_mode菜单中Up键的功能
	{	
		Work_mode_Menu_Index--;
		if(Work_mode_Menu_Index == 0xff)
		{
			Work_mode_First_Index = 4-3;
			Work_mode_Menu_Index  = 3;	
		}
		else if(Work_mode_Menu_Index == (Work_mode_First_Index - 1))
		{
			
			Work_mode_First_Index--;
		}	
	}
	if(Index >= 8 && Index <= 9)								//在Zizhu_mode菜单中Up键的功能
	{	
		Zizhu_mode_Menu_Index--;
		if(Zizhu_mode_Menu_Index == 0xff)
		{
			Zizhu_mode_Menu_Index  = 1;	
		}	
	}

		if(Index >= 17 && Index <= 18)								//在Zizhu_mode菜单中Up键的功能
	{	
		Duibi_mode_Menu_Index--;
		if(Duibi_mode_Menu_Index == 0xff)
		{
			Duibi_mode_Menu_Index  = 1;	
		}	
	}


	if(Index == 4)												//在Work_param菜单中Up键的功能
	{
		Work_param_Menu_Index--;
		if(Work_param_Menu_Index == 0xff)
		{
			Work_param_First_Index = 0;
			Work_param_Menu_Index  = 2;	
		}
		else if(Work_param_Menu_Index == (Work_param_First_Index - 1))
		{
			
			Work_param_First_Index--;
		}
	}
	if(Index == 11)												//在Shoudong_mode菜单中Up键的功能
	{
		Shoudong_mode_Menu_Index--;
		if(Shoudong_mode_Menu_Index == 0xff)
		{
			Shoudong_mode_First_Index = 4-3;
			Shoudong_mode_Menu_Index  = 3;	
		}
		else if(Shoudong_mode_Menu_Index == (Shoudong_mode_First_Index - 1))
		{
			
			Shoudong_mode_First_Index--;
		}
	}
	if(Index == 12 || Index == 13 || Index ==25)								//在System_set菜单中Up键的功能
	{	
		System_set_Menu_Index--;
		if(System_set_Menu_Index == 0xff)
		{
			System_set_First_Index = 3-3;
			System_set_Menu_Index  = 2;	
		}
		else if(System_set_Menu_Index == (System_set_First_Index - 1))
		{
			
			System_set_First_Index--;
		}	
	}
	if(Index == 14)												//在Time_set菜单中Up键的功能
	{
		Time_set_Menu_Index--;
		if(Time_set_Menu_Index == 0xff)
		{
			Time_set_Menu_Index = 5;
		}
	}
	if(Index == 15)												//在Work_param菜单中Up键的功能
	{
		Work_time_Menu_Index--;
		if(Work_time_Menu_Index == 0xff)
		{
			Work_time_First_Index = 8-3;
			Work_time_Menu_Index  = 7;	
		}
		else if(Work_time_Menu_Index == (Work_time_First_Index - 1))
		{
			
			Work_time_First_Index--;
		}
	}
	if(Index == 20 || Index == 21)								//在System_param菜单中Up键的功能
	{
		System_param_Menu_Index--;
		if(System_param_Menu_Index == 0xff)
		{
			System_param_Menu_Index = 1;
		}
	}
	if(Index == 22)												//在Warm_info菜单中Up键的功能
	{
		Warm_infor_Menu_Index--;
		if(Warm_infor_Menu_Index == 0xff)
		{
			Warm_infor_Menu_Index = 16;
		}
	}
}*/


typedef struct													 //定义菜单结构体
{
  unsigned char  Index_data;               								 //当前的状态索引号	  存储以后用来查询
	unsigned char  Up_data;                 									 //向上键状态索引号
	unsigned char  Down_data;                								 //向下键状态索引号
	unsigned char  Left_data;												 //向左键状态索引号
	unsigned char  Right_data;               								 //向右键状态索引号
	unsigned char  Ok_data;               									 //回车键状态索引号	
	unsigned char  Ese_data;													 //退出键状态索引号
	void   (*Operate)();	    								 //当前状态应执行的操作
}   StateTab;

/*********************结构数组***********************/                     //不完整,有删减,需要的自己不全
code StateTab Menu_Tab[27]=										 //菜单结构数组
{
		/*---Index--Up---Down--Left--Right--Ok--Ese--Operate--------*/
		{	   0,	 		0,	   0,			0,	   0,	 1,	  0,     (*Home_Show)    	     },  //开机进入开机画面,然后按了OK键,Index = 1
		{	   1,	 		3,	   2,			1,	   1,	 23,  0,     (*Main_Show)    	     },	 //(*(Menu_Tab[Index].Operate))(); 执行的将是Main_Show函数
		{	   2,	 		1,	   3,			2,	   2,	 20,  0,     (*Main_Show)   	     },  //同理,进入Main 菜单后,继续按 OK键的话 Index = 23
		{	   3,	 		2,	   1,			3,	   3,	 12,  0,     (*Main_Show)    	     },	 //执行的是Password_menu_Show函数了 
		/************************自主参数设置************************/
		{	   4,	 		4,	   4,			4,	   4,	 4,	  9,     (*Work_param_Show)      },//就是如此简单,其他的要看自己逻辑能力了,别搞错就行
		
		/************************密码输入界面设置********************/
		{	   23,	 23,   23,  23,    23,   23,   1,    (*Password_menu_Show)   },
		{	   24,	 24,   24,  24,    24,   5,   24,    (*Password_menu_Show)   },
		/************************添加系统设置************************/
		{	   25,	 13,   12,	25,	   25,	 26,   3,    (*System_set_Show)      },
		/************************添加系统设置************************/
		{	   26,	 26,   26,	26,	   26,	 26,   3,    (*Password_set_menu_Show) },
};

//***************************************//
//函数名称:Main_Show
//函数参数:无
//函数共呢:实现打印主菜单功能
//**************************************//
void Main_Show()
{
	Show_Menu(1,Main_menu,Main_First_Index,Main_Menu_Index);
}
//**********************************************************
//函数名称:void Show_Menu(unsigned char kong,unsigned char *(*p),unsigned char First_Index,unsigned char Menu_Index)
//函数功能:在第二、三、四行分别显示菜单
//形式参数:unsigned char kong,unsigned char *(*p),unsigned char First_Index,unsigned char Menu_Index
//行参说明:距开头空出的距离(kong*16个小格),显示的菜单项,首行显示菜单项,当前选中的菜单项
//返回参数:无
//使用说明:无
//注意:如果其中的16*8字符个数为奇数,则需要插入空格补位
//**********************************************************

void Show_Menu(unsigned char kong,unsigned char *(*p),unsigned char First_Index,unsigned char Menu_Index)
{
	unsigned char a,b,c;
	if(First_Index == Menu_Index)					  	//判断当前显示在屏幕上顶端的菜单项是否为选中项
	{
		a = 1;
		b = 0;
		c = 0;
	}
	if((First_Index + 1) == Menu_Index)				
	{
		a = 0;
		b = 1;
		c = 0;
	}
	if((First_Index + 2) == Menu_Index)
	{
		a = 0;
		b = 0;
		c = 1;
	}
	if(Menu_Index == 0xff)
	{
		a = 0;
		b = 0;
		c = 0;
	}
	Serial_DisplayStrings_WithFistaddress(0x90+kong,p[First_Index],a);
	Serial_DisplayStrings_WithFistaddress(0x88+kong,p[First_Index+1],b);
	Serial_DisplayStrings_WithFistaddress(0x98+kong,p[First_Index+2],c);  	 
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值