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); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值