社区导航

 

搜索
查看: 55180|回复: 280

12864多级菜单设计

  [复制链接]

106

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2012-9-20 18:17 | 显示全部楼层 |阅读模式
 看到网上有个视频,用的是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],而想在此按上键执行函数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)();//执行当前操作函数

                   }

}

完整程序包如下

 

来源:EEWorld 51单片机板块,转载请附上链接

点评

厉害!!!!  详情 回复 发表于 2013-8-25 21:43
学习下  详情 回复 发表于 2013-1-17 15:18
厉害!!!!  详情 回复 发表于 2012-9-21 14:59

评分

1

查看全部评分



回复

使用道具 举报

107

TA的帖子

120

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2012-9-20 23:19 | 显示全部楼层
坛子里有歌帖子也是这种 讲的很不错

点评

和我的菜单程序比起来,太复杂了。。。。。。。  详情 回复 发表于 2012-9-21 14:50


回复

使用道具 举报

5351

TA的帖子

19

TA的资源

裸片初长成(初级)

Rank: 10Rank: 10Rank: 10

荣誉会员勋章

发表于 2012-9-21 14:50 | 显示全部楼层
和我的菜单程序比起来,太复杂了。。。。。。。

点评

那你的简单的,可以分享来看看嘛?  详情 回复 发表于 2012-10-13 21:24


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2012-9-21 14:59 | 显示全部楼层

回复 楼主 tcvsdonnnie 的帖子

厉害!!!!


回复

使用道具 举报

3449

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2012-9-21 18:37 | 显示全部楼层
我有完整的,改天整理整理

点评

这位大虾,你说的这个整理上传了没??  详情 回复 发表于 2014-8-9 08:42


回复

使用道具 举报

520

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2012-9-22 10:48 | 显示全部楼层


回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2012-9-23 20:34 | 显示全部楼层
好啊


回复

使用道具 举报

762

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2012-9-24 09:32 | 显示全部楼层
谢谢分享


回复

使用道具 举报

762

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2012-9-24 09:36 | 显示全部楼层
木有源码呢


回复

使用道具 举报

937

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2012-9-24 10:53 | 显示全部楼层
说的很详细( ⊙ o ⊙ )啊!


回复

使用道具 举报

59

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2012-10-10 10:35 | 显示全部楼层
谢谢楼主的无私。


回复

使用道具 举报

12

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2012-10-10 14:59 | 显示全部楼层

有点复杂,mark下,改天仔细研究研究

有点复杂,mark下,改天仔细研究研究


回复

使用道具 举报

100

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2012-10-10 19:33 | 显示全部楼层
说的很详细
wanglong


回复

使用道具 举报

199

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2012-10-12 13:04 | 显示全部楼层
学习学习....


回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2012-10-13 17:16 | 显示全部楼层

怎么没有文件?

怎么没有文件?

点评

我也不晓得呢,本来上传了的  详情 回复 发表于 2015-11-6 13:52


回复

使用道具 举报

77

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2012-10-13 21:24 | 显示全部楼层

回复 板凳 zhaojun_xf 的帖子

那你的简单的,可以分享来看看嘛?

点评

论坛上有,自己找找吧。。。  详情 回复 发表于 2013-8-20 09:11


回复

使用道具 举报

445

TA的帖子

9

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2012-10-14 09:31 | 显示全部楼层
东西不错


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2012-10-18 12:19 | 显示全部楼层
及时雨啊


回复

使用道具 举报

39

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2012-10-26 00:05 | 显示全部楼层
学习了,呵呵


回复

使用道具 举报

8

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2012-10-31 08:14 | 显示全部楼层

木有程序

木有程序

点评

其实这就是程序了,需要做的就是液晶,本来上传了的。怎么不见了  详情 回复 发表于 2015-11-6 13:53


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-9-21 14:39 , Processed in 0.549648 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表