12864多级菜单设计

46 篇文章 1 订阅
38 篇文章 1 订阅

        看到网上有个视频,用的是12864做的菜单,很花哨,自己也心痒痒想做一个,收集了 很多关于这方面的东西,但是都是五花八门,没有一个完整的可以共大家参考的程序,所以决定写偏文章供大家参考,希望读者下去自己优化,改进。有什么不足之处还请多多包涵。好了,废话不多说,直接进入正题吧。

       

1、首先定义一个机构体如下
typedef struct
{
     uchar current;
     uchar up;//上键
     uchar down;//下键
     uchar enter;//确认键
     void (*current_operation)();
} key_table;

结构体包含5个变量,分别是函数的索引号即用户想要执行哪个函数的代号,然后有三个键,用户可以自己定义别的按键,最后一个是函数指针,即索引号对应的函数。然后在定义一个结构体数组,如下
key_table code table[n]=
{
     {0,2,1,3,(*fun1)},
     {1,0,2,4,(*fun2)},
     {2,1,0,5,(*fun3)},                  
     {3,0,6,3,(*fun4)},
     {4,1,6,4,(*fun5)},                       
     {5,2,6,5,(*fun6)},
     {6,0,0,0,(*fun7)},
     ............                                           
};
其中n为函数数组大小。下面详细介绍key_table code table[n]里面的值是怎么确定的。
首先可以先这样定义该数组
key_table code table[n]=
{
     {0,x,y,z,(*fun1)},
     {1,x,y,z,(*fun2)},
     {2,x,y,z,(*fun3)},                  
     {3,x,y,z,(*fun4)},
     {4,x,y,z,(*fun5)},                       
     {5,x,y,z,(*fun6)},
     {6,x,y,z,(*fun7)},
     ............                                           
};
其中,x,y,z是未知数,先不确定,他们对应的是三个键按下要指示的索引值,如果四个键,就有四个未知数,在确定他们之前,必须要了解自己函数执行什么命令。假如开始时执行数组里面的第一个即table[0],而想在此(fun1状态),按上键执行函数fun6,那么table[0]里面需要这样设置
{0,5,y,z,(*fun1)},同样,如果希望按下键执行fun7则需要设置为
{0,x,6,z,(*fun1)},如果希望按确认键执行fun3则需要设置为
{0,x,y,2,(*fun1)};如果上面三种情况都想要就设置为
{0,5,6,2,(*fun1)}.其它数组元素一次类推。这一步做完了看主程序里面(主要是while(1)里面)。
/*******************find index****************************/
switch(key)
{
    case 0x44:                                           
    func_index=table[func_index].up;    //向上翻                                          
    break;
    case 0x24:                                           
    func_index=table[func_index].enter;//回车
    break;
    case 0x14:                                           
    func_index=table[func_index].down;//向下翻
    break;
    default:break;                    
}  current_operation_index=table[func_index].current_operation;
(*current_operation_index)();//执行当前操作函数
其中,key是返回的按键值,这个用户视情况而定,
下面是详细的例子,

主要是以结构体为基础设计的,以12864显示函数代替了用户需要的函数功能,只需要修改相应的函数和索引号,就可以达到任意界面切换了是小弟研究了还久才搞定的,虽然网上也有这些,但是都不够系统,只有基本的东西,这篇例子希望能够给读者一些有用的东西,仅供参考哦!

#include <reg52.h>

#include "fun.h"

#include "lcd12864.h"

#include "delay.h"

#define uchar unsigned char

sbit keydown=P0^0;

sbit keyenter=P0^1;

sbit keyup=P0^2;

uchar func_index=0;

void (*current_operation_index)();

typedef struct

 {

         uchar current;

         uchar up;//向上翻索引号

         uchar down;//向下翻索引号

         uchar enter;//确认索引号

         void (*current_operation)();

 } key_table;

 key_table code table[30]=

 {

        {0,3,1,4,(*fun1)},//第一层,显示【清华大学】、北京大学、重庆三峡学院、返回

         {1,0,2,8,(*fun2)},//第一层,显示清华大学、【北京大学】、重庆三峡学院、返回

         {2,1,3,12,(*fun3)},//第一层,显示清华大学、北京大学、【重庆三峡学院】、返回                     

         {3,2,0,25,(*fun4)},//第一层,显示清华大学、北京大学、重庆三峡学院、【返回】

         {4,7,5,16,(*fun5)},//第二层,清华大学层下显示【地点】、创建时间、简介、返回                                                   

         {5,4,6,17,(*fun6)},//第二层,清华大学层下显示地点、【创建时间】、简介、返回       

         {6,5,7,18,(*fun7)}, //第二层,清华大学层下显示地点、创建时间、【简介】、返回                                                                             

         {7,6,4,0,(*fun8)},//第二层,清华大学层下显示地点、创建时间、简介、【返回】       

         {8,11,9,19,(*fun9)},//第二层,北京大学层下显示【历史】、政治、简介、返回                                                 

         {9,8,10,20,(*fun10)},//第二层,北京大学层下显示历史、【政治】、简介、返回  

         {10,9,11,21,(*fun11)}, //第二层,北京大学层下显示历史、政治、【简介】、返回                                                                                

         {11,10,8,1,(*fun12)},//第二层,北京大学层下显示历史、政治、简介、【返回】         

         {12,15,13,22,(*fun13)},//第二层,重庆三峡学院层下显示【简介】、最佳院系、最佳实验室、返回                                                        

         {13,12,14,23,(*fun14)}, //第二层,重庆三峡学院层下显示简介、【最佳院系】、最佳实验室、返回                                                               

         {14,13,15,24,(*fun15)}, //第二层,重庆三峡学院层下显示简介、最佳院系、【最佳实验室】、返回                                                               

         {15,14,12,2,(*fun16)}, //第二层,重庆三峡学院层下显示简介、最佳院系、最佳实验室、【返回】   

         {16,16,16,4,(*fun17)}, //第三层,清华大学地点层                                                                    

         {17,17,17,5,(*fun18)}, //第三层,清华大学创时间层                                                      

         {18,18,18,6,(*fun19)}, //第三层,清华大学简介层

         {19,19,19,8,(*fun20)}, //第三层,北京大学历史层                                                                    

         {20,20,20,9,(*fun21)}, //第三层,北京大学政治层                                                           

         {21,21,21,10,(*fun22)}, //第三层,北京大学简介层

         {22,22,22,12,(*fun23)}, //第三层,重庆三峡学院简介层                                                                  

         {23,23,23,13,(*fun24)}, //第三层,重庆三峡学院最佳院系层                                                        

         {24,24,24,14,(*fun25)}, //第三层,重庆三峡学院最佳实验室层        

         {25,25,25,0,(*fun26)}, //0      

                                                                                 

};

void main() 

{  

   init_lcd(); //初始化LCD模块  

   while(1) 

   {     

         /*******************find index****************************/

                            if((keyup==0)||(keydown==0)||(keyenter==0))

                            {

                                     delay(10);//消抖

                                     if(keyup==0)

                                     {

                                     func_index=table[func_index].up;    //向上翻

                                     while(!keyup);//松手检测

                                     }

                                     if(keydown==0)

                                     {

                                     func_index=table[func_index].down;    //向下翻

                                     while(!keydown);

                                     }

                                     if(keyenter==0)

                                     {

                                     func_index=table[func_index].enter;    //确认

                                     while(!keyenter);

                                     }

                              init_lcd();

                           }                                    

                            current_operation_index=table[func_index].current_operation;

                            (*current_operation_index)();//执行当前操作函数

                   } 

}

 

转载处链接:

http://home.eeworld.com.cn/my/space.php?uid=436048&do=blog&id=85400

  • 9
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: LCD12864多级菜单实现是通过显示屏上的不同菜单来实现用户与设备交互和操作的过程。具体实现方式如下: 1. 初始化LCD12864屏幕:首先需要初始化LCD12864屏幕,确保其能正常显示。 2. 设计菜单结构:根据实际需求,设计多级菜单的结构,包括主菜单和子菜单。主菜单是一级菜单,子菜单可以有多级,组成多级菜单。 3. 显示主菜单:将主菜单的选项显示在LCD12864屏幕上,使用屏幕上的光标选择相应的选项。 4. 用户选择选项:通过按键或触摸屏等输入设备,用户可以选择不同的菜单选项。 5. 显示子菜单:根据用户选择的菜单选项,在LCD12864屏幕上显示对应的子菜单选项。 6. 用户选择子菜单选项:用户可以通过光标或触摸屏幕等输入设备选择子菜单中的具体选项。 7. 执行操作:根据用户选择的子菜单选项,执行相应的操作,例如显示特定信息、设置参数、执行功能等。 8. 返回上级菜单:用户可以通过按返回键返回上一级菜单,或者通过选择特定的返回选项返回。 9. 循环操作:循环执行上述步骤,使用户可以在不同菜单之间切换和操作。 通过以上步骤,LCD12864多级菜单实现可以提供用户友好的界面,使用户能够方便地进行操作和配置设备。在实际应用中,还可以根据需要进行其他功能的拓展,例如增加菜单项、添加快捷操作等。 ### 回答2: LCD12864多级菜单的实现主要分为以下几个步骤: 1. 初始化LCD屏幕:将LCD屏幕模式设置为128x64点阵模式,并清空屏幕内容。 2. 定义菜单数据结构:根据实际需求定义菜单的结构体,包括菜单名称、菜单项数目、菜单项内容等信息。可以使用数组、链表等数据结构存储菜单数据。 3. 显示主菜单:根据菜单数据结构,显示主菜单菜单项。可以使用LCD屏幕的绘图函数将菜单项逐个显示出来,同时通过光标或其他标记方式来确定当前选中的菜单项。 4. 处理菜单项选择:通过按键、遥控器等输入方式来选择菜单项。根据不同的输入方式,可以监听对应的按键或遥控器指令,并根据当前选中的菜单项进行相应的操作。 5. 处理上下级菜单切换:当选择某个菜单项时,根据当前菜单项的类型(菜单项还是功能项)进行不同的处理。如果是菜单项,需要切换到下一级菜单,更新菜单数据结构,并重新显示菜单项。如果是功能项,执行对应的功能代码。 6. 返回上一级菜单:在下一级菜单中,可以通过返回按钮或其他指令返回上一级菜单。返回操作需要更新菜单数据结构,重新显示上一级菜单菜单项。 7. 退出菜单系统:当用户退出菜单系统时,清空LCD屏幕内容,并进行必要的资源释放。 通过以上步骤,我们可以实现LCD12864多级菜单的功能,实现用户友好的菜单操作界面,方便用户进行选择和操作。同时,根据具体需求,可以进行个性化的定制和扩展。 ### 回答3: LCD12864多级菜单实现的基本思路是利用LCD12864显示屏和控制器的特性,通过设置不同的菜单层级和相关操作进行菜单的切换和功能的实现。 首先,需要确定菜单的层级结构,可以分为一级菜单、二级菜单等。每一级菜单都有相应的菜单选项和功能操作。 接下来,需要定义菜单切换的条件和方式。通常可以使用按钮、旋钮等控制器来进行菜单项的选择和切换。根据控制器的信号,可以判断当前所处的菜单层级和菜单项,并显示在LCD12864上。 在菜单的实现过程中,需要编写相应的代码逻辑。可以通过判断当前所处的菜单层级和菜单项来执行相应的功能操作。例如,当选择某个菜单项后,可以进入下一级菜单或执行相应的功能操作,如打开某个功能模块、进行一些设置操作等。不同菜单层级和菜单项之间的切换和操作都需要根据具体需求进行编写。 最后,需要在LCD12864上显示当前的菜单和选项内容。可以使用适当的图形和文字来实现清晰易懂的显示效果。在显示的同时,还可以根据需要进行一些动态效果的增加,如闪烁、滚动等,以增强用户的交互体验。 综上所述,LCD12864多级菜单的实现涉及到层级结构的定义、菜单切换的控制、代码逻辑的编写和LCD12864的显示设置等方面。只要根据具体需求和硬件特性进行相应的配置和编码工作,就可以实现一个功能完善的LCD12864多级菜单系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值