久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 30927|回復: 53
打印 上一主題 下一主題
收起左側

單片機實現多級菜單

  [復制鏈接]
跳轉到指定樓層
樓主
ID:82934 發表于 2015-6-14 09:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
看到網上有個視頻,用的是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)();//執行當前操作函數
                   }
}
完整程序包如下

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的積分獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏23 分享淘帖 頂1 踩1
回復

使用道具 舉報

沙發
ID:1 發表于 2015-6-14 10:33 | 只看該作者
謝謝分享完整程序包好像沒有上傳上來哦
回復

使用道具 舉報

板凳
ID:73848 發表于 2015-6-16 10:58 來自手機 | 只看該作者
我也想做,先學習了
回復

使用道具 舉報

地板
ID:106794 發表于 2016-3-1 08:39 | 只看該作者
樓主辛苦了 ,感謝分享!
回復

使用道具 舉報

5#
ID:97438 發表于 2016-3-22 10:50 | 只看該作者
東西呢???
回復

使用道具 舉報

6#
ID:120664 發表于 2016-5-14 08:09 | 只看該作者
怎么沒看到完整程序呢
回復

使用道具 舉報

7#
ID:123307 發表于 2016-5-26 12:52 | 只看該作者
樓主,求完整程序
回復

使用道具 舉報

8#
ID:116826 發表于 2016-5-27 17:44 | 只看該作者
感謝費心分享,有用!
回復

使用道具 舉報

9#
ID:122699 發表于 2016-5-30 13:39 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

10#
ID:130710 發表于 2016-7-26 13:57 | 只看該作者
樓主,程序包呢?
回復

使用道具 舉報

11#
ID:115388 發表于 2016-9-21 15:12 | 只看該作者
沒有附件可供下載。
回復

使用道具 舉報

12#
ID:69175 發表于 2016-11-12 21:11 | 只看該作者
用C語言寫的多級菜單源程序
回復

使用道具 舉報

13#
ID:158678 發表于 2017-1-12 09:15 | 只看該作者
謝謝,看看資料源碼
回復

使用道具 舉報

14#
ID:162690 發表于 2017-1-22 11:45 | 只看該作者
怎么沒有完整源碼呢?
回復

使用道具 舉報

15#
ID:57984 發表于 2017-3-1 12:04 | 只看該作者
樓主,完整程序包呢?
回復

使用道具 舉報

16#
ID:57984 發表于 2017-3-1 12:05 | 只看該作者
樓主,求完整程序
回復

使用道具 舉報

17#
ID:167337 發表于 2017-3-1 16:07 | 只看該作者

感謝樓主分享
回復

使用道具 舉報

18#
ID:167337 發表于 2017-3-1 16:28 | 只看該作者
謝謝樓主分享經驗,怎么沒有完整源碼呢?
回復

使用道具 舉報

19#
ID:170026 發表于 2017-5-21 15:07 | 只看該作者
厲害,學習了
回復

使用道具 舉報

20#
ID:125436 發表于 2017-7-20 11:31 | 只看該作者
怎么看不到!
回復

使用道具 舉報

21#
ID:227670 發表于 2017-8-15 03:37 | 只看該作者
下來看看不錯,不錯
回復

使用道具 舉報

22#
ID:226265 發表于 2017-8-15 20:57 | 只看該作者
你好我想看
回復

使用道具 舉報

23#
ID:230847 發表于 2017-9-30 08:55 來自手機 | 只看該作者
學習學習,謝謝樓主
回復

使用道具 舉報

24#
ID:246872 發表于 2017-11-7 14:21 | 只看該作者
好東西值得收藏
回復

使用道具 舉報

25#
ID:90762 發表于 2017-12-2 16:17 | 只看該作者
  {0,3,1,4,(*fun1)  ,x,y,z是未知數,先不確定,他們對應的是三個鍵按下要指示的索引值,如果四個鍵,就有四個未知數。x,y,z是未知數是各鍵按的次數嗎?
回復

使用道具 舉報

26#
ID:167884 發表于 2017-12-22 22:06 | 只看該作者
好像看懂了一點思路
回復

使用道具 舉報

27#
ID:296411 發表于 2018-3-24 16:46 | 只看該作者
謝謝!!!!!!
回復

使用道具 舉報

28#
ID:296411 發表于 2018-3-24 16:49 | 只看該作者
66666666666666
回復

使用道具 舉報

29#
ID:104425 發表于 2018-4-14 19:50 | 只看該作者
路過學習。。。
回復

使用道具 舉報

30#
ID:60316 發表于 2019-1-19 22:37 | 只看該作者
謝謝分享
回復

使用道具 舉報

31#
ID:149799 發表于 2019-1-21 10:14 | 只看該作者
謝謝分享
回復

使用道具 舉報

32#
ID:459370 發表于 2019-2-7 09:27 | 只看該作者
謝謝分享完整程序包好像沒有上傳上來哦
回復

使用道具 舉報

33#
ID:473159 發表于 2019-2-11 13:13 | 只看該作者
己經很好了,LCD那些真不用別人傳了

評分

參與人數 1黑幣 +35 收起 理由
jinsheng7533967 + 35

查看全部評分

回復

使用道具 舉報

34#
ID:474670 發表于 2019-2-11 16:19 | 只看該作者
這里有很好的案例,你們卻還在這兒糾結http://www.zg4o1577.cn/bbs/dpj-150435-1.html
回復

使用道具 舉報

35#
ID:58241 發表于 2019-5-31 20:57 | 只看該作者
謝謝分享
回復

使用道具 舉報

36#
ID:58241 發表于 2019-5-31 20:58 | 只看該作者
辛苦了 ,感謝分享!
回復

使用道具 舉報

37#
ID:139742 發表于 2019-6-1 10:25 | 只看該作者
這個非常有啟發。正在考慮多級菜單應該怎么組織比較清爽呢。
回復

使用道具 舉報

38#
ID:552439 發表于 2019-6-1 13:52 | 只看該作者
用數組實現的話會不會太大了啊。。
回復

使用道具 舉報

39#
ID:541690 發表于 2019-6-6 07:51 | 只看該作者
學習下啦
回復

使用道具 舉報

40#
ID:96552 發表于 2019-8-7 15:11 | 只看該作者
這個帖子沒了,誰幫忙上傳一下,謝謝!
34樓說的這里有很好的案例,你們卻還在這兒糾結http://www.zg4o1577.cn/bbs/dpj-150435-1.html
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99国产精品99久久久久久 | av免费入口 | 欧美精品片 | 国产在线小视频 | 激情一区二区三区 | 免费一级黄色电影 | 激情av免费看 | 成人免费视频观看视频 | 亚洲精品一区二区久 | 国产中文视频 | 欧美日韩看片 | 夜色www国产精品资源站 | 日本黄色影片在线观看 | 91超碰在线观看 | 一区二区三区四区视频 | 亚洲国产成人精品女人久久久 | 精品亚洲一区二区三区 | 日韩五月天 | 99热这里都是精品 | 波多野结衣一二三区 | 久久久国产精品 | 6996成人影院网在线播放 | 国产高清在线精品一区二区三区 | 欧美精品久久久久久久久老牛影院 | 九九久久在线看 | 精品视频一区二区三区在线观看 | 一区二区三区在线 | 97伦理电影网 | 亚洲国产欧美在线 | 综合成人在线 | 国产三级大片 | 国产精彩视频 | 亚洲一区二区三区视频在线 | 国产麻豆一区二区三区 | 免费观看黄色一级片 | 精品国产欧美一区二区三区成人 | 91视频大全 | 少妇一区在线观看 | 99久久精品免费看国产免费软件 | 日韩精品一区二区三区中文在线 | 天天曰夜夜 |