⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menuindanpianji.c

📁 单片机在液晶上实现菜单!!!!!!!!!!!
💻 C
字号:
我的硬件:LPC2131+NOKIA5510

 其实这个程序是跟硬件无关的....

一共有两个最重要的文件,其它文件在这两个文件里也有说明.....

 菜单的数据结构就是树...


--------------------------------------------------------------------------------

/***********************************Copyright (c)**********************************
**                               
**                               XPSTUDIO,曹香鹏.
**                         http://xpstudio2003.blog.163.com
**
**文件说明:
 此文件为菜单的实现文件.
 
 1.文件引用说明
  "config.h"      ---系统配置文件
  "MenuFunc.H"    ---菜单中要执行的函数文件
  "MENUDISP.H"    ---菜单图形编码
  "GUI.H"         ---液晶接口
 2.对向输出接口
  Menu_Next(void);
  Menu_Prev(void);
  Menu_Enter(void);
  Menu_Esc(void);
  Menu_Init(void);        
 3.菜单数据结构:
  树.
 4.修改添加菜单依照下面菜单结构.
  见菜单结构中的说明
 
***********************************************************************************/

#include "config.h"
#include "MenuFunc.H"
#include "MENUDISP.H"
#include "GUI.H"

//===============================================================
//第一部分(1/3)
//菜单树结构及菜单定义

typedef struct  MENU
{
 INT8U MenuCount;
 
 INT8U const * MenuDiscrip;   //菜单项描述(引用自MENUDISP.H)
  
 struct MENU * pChldrnMenu;   //子菜单
 struct MENU * pPrntMenu;   //父菜单
  
 void (*pSub)();     //节点函数(引用自MenuFunc.H文件)
 
}MENU;

//1.首先定义各菜单.
#define     SYSINFO_NUM     3
#define     MAINMENU_NUM    8

MENU  SysInfo[SYSINFO_NUM];
MENU  MainMenu[MAINMENU_NUM];


//2.再实现菜单之间的关联.
MENU  SysInfo[SYSINFO_NUM]=
{
 {SYSINFO_NUM,   Str0,    0,  MainMenu,   SysVersion},   //系统版本
 {SYSINFO_NUM,   Str1,    0,  MainMenu,   SysAuthor},    //系统作者 
 {SYSINFO_NUM,   Str4,    0,  MainMenu,   0},            //选项二
 
};   

MENU  MainMenu[MAINMENU_NUM]=
{
 { MAINMENU_NUM, Str3,    0,         0,   0},  //选项一
 { MAINMENU_NUM, Str2,    SysInfo,   0,   0},  //系统信息显示    
 { MAINMENU_NUM, Str4,    0,         0,   0},  //选项二
 { MAINMENU_NUM, Str5,    0,         0,   0},  //选项三
 { MAINMENU_NUM, Str6,    0,         0,   0},  //选项四
 { MAINMENU_NUM, Str7,    0,         0,   0},  //选项五
 { MAINMENU_NUM, Str8,    0,         0,   0},  //选项六
 { MAINMENU_NUM, Str9,    0,         0,   0},  //选项七            
}; 
//===============================================================
//第二部分(2/3)
//菜单图形显示操作


//菜单显示参数配置
#define     LCD_MENU_BEGIN      13      //菜单开始位置(pix)
#define     LCD_HZ_WIDTH        12      //汉字占用宽度(pix) >=12
#define     LCD_LINE_MAX        4       //菜单所用行数(line)
#define     MENU_ITEM_HZ_NUM    4       //每菜单项占用汉字数, >=4


//菜单操作全局变量
static MENU  *pMenuCurr;    //当前菜单指针
static INT8U MenuSlct;      //当前菜单选中项
static INT8U MenuMIN;       //
static INT8U MenuMAX;       //
static INT8U LineSlct;      //屏幕选中行.


//显示一行菜单项
//显示在line行,显示内容为str内.
void ShowMenuItem(INT8U line, INT8U const * str)
{
 INT8U const * pStr;
 INT8U x;
 INT8U i;
 INT8U HZnum;        //菜单项汉字个数
 
 HZnum   =   str[0];
 pStr    =   str+1;
 x= LCD_MENU_BEGIN;
 
 for(i=0; i<HZnum; i++)
 {
  GUI_ShowHZ12(line, x, Hzk[(pStr[i])]);
  x   = x + LCD_HZ_WIDTH;
 }
 for(; i<MENU_ITEM_HZ_NUM; i++)
 {
  GUI_ShowHZ12(line, x, Space);
  x   = x + LCD_HZ_WIDTH;        
 }
}

//显示菜单界面
//当操作了菜单后,界面就会更改,些函数只更改出现变化的部分.
void ShowMenu(MENU *pMenu, INT8U Sel)
{
 INT8U MnMinTmp;
 INT8U MnMaxTmp;
 INT8U LnSlctTmp;
 INT8U line;
 INT8U i;
//-------------------------------------------    
//防止出错
 if(pMenu == 0)return ;
 
 if( (pMenu->MenuCount -1) < Sel)
 {
  Sel = 0;
 }
//-------------------------------------------    
//确定显示范围
 //情况1.选项少于行数
 if((pMenu->MenuCount) <= LCD_LINE_MAX)
 {
  MnMinTmp = 0;
  MnMaxTmp = (pMenu->MenuCount)-1;
 }
 //情况2.选项多于行数
 else if(Sel < LCD_LINE_MAX )
 {
  MnMinTmp = 0;
  MnMaxTmp = LCD_LINE_MAX-1;        
 }
 else if(  ( (pMenu->MenuCount) - Sel ) > LCD_LINE_MAX )
 {
  MnMinTmp = Sel;
  MnMaxTmp = Sel+LCD_LINE_MAX;        
 }
 else
 {
  MnMinTmp = (pMenu->MenuCount)-LCD_LINE_MAX;
  MnMaxTmp = (pMenu->MenuCount)-1;  
 }
 
//-------------------------------------------    
//确定选中哪一行
 LnSlctTmp =   Sel-MnMinTmp;
 if(LnSlctTmp!=LineSlct)
 {
  LineSlct=LnSlctTmp;
  
  for(i=0; i<LnSlctTmp; i++)
  {
   GUI_ShowHZ12(i, 0, Space);
  }
  GUI_ShowHZ12(i++, 0, PicArrowSel);
  for(; i<LCD_LINE_MAX; i++)
  {
   GUI_ShowHZ12(i, 0, Space);     
  }        
 }
//-------------------------------------------    
//显示菜单项
 if( (MnMinTmp!=MenuMIN )   || (MnMaxTmp!=MenuMAX ) )
 {
  MenuMIN=MnMinTmp;
  MenuMAX=MnMaxTmp;
  
  pMenu += MnMinTmp;
  for(line=0; MnMinTmp<=MnMaxTmp; MnMinTmp++,line++)
  {
   ShowMenuItem(line, pMenu->MenuDiscrip);
   pMenu++;
  }
  for(; line<LCD_LINE_MAX; line++)
  {
   ShowMenuItem(line, SpaceMenu);
  }
 }
//-------------------------------------------    
}

//===============================================================
//第三部分(3/3)
//菜单输出函数接口.

//菜单初始化函数.初始化菜单操作全局变量
void Menu_Init(void)
{
 pMenuCurr = 0;
 MenuSlct  = 0;
 MenuMIN   = 0;
 MenuMAX   = 0;
 LineSlct  = 0xFF;
}


void Menu_Next(void)
{
 if( pMenuCurr == 0)return;    //空菜单,返回
 
 MenuSlct++;
 if(MenuSlct >= (pMenuCurr->MenuCount) )
 {
  MenuSlct = 0;
 }
 
 ShowMenu(pMenuCurr, MenuSlct);
}

void Menu_Prev(void)
{
 if( pMenuCurr == 0)return;    //空菜单,返回
 
 if(MenuSlct>0)
 {
  MenuSlct--;
 }
 else
 {
  MenuSlct = (pMenuCurr->MenuCount)-1;
 }
 
 ShowMenu(pMenuCurr, MenuSlct);    
} 
void Menu_Enter(void)
{
 if( pMenuCurr == 0)
 {
  pMenuCurr = MainMenu;
  ShowMenu(pMenuCurr, MenuSlct); 
  return;
 }
 
 //如果子目录存在
 if( ((pMenuCurr+MenuSlct)->pChldrnMenu)!=0 )
 {
  pMenuCurr = (pMenuCurr+MenuSlct)->pChldrnMenu;
  MenuSlct  = 0;
  MenuMIN   = 0;
  MenuMAX   = 0;
  LineSlct  = 0xFF;
  ShowMenu(pMenuCurr, MenuSlct); 
 }
 //如果是可执行函数
 else if( ((pMenuCurr+MenuSlct)->pSub) !=0)
 {
  ((pMenuCurr+MenuSlct)->pSub)();
 }
 
}
void Menu_Esc(void)
{
 if( pMenuCurr == 0)return;    //空菜单,返回
 
 //如果上一级菜单存在
 if( ((pMenuCurr+MenuSlct)->pPrntMenu)!=0 )
 {
  pMenuCurr = (pMenuCurr+MenuSlct)->pPrntMenu;
  MenuSlct  = 0;
  MenuMIN   = 0;
  MenuMAX   = 0;
  LineSlct  = 0xFF;
  ShowMenu(pMenuCurr, MenuSlct);         
 }
}


//MENU.C文件结束
//===============================================================

 



--------------------------------------------------------------------------------

第二个文件

/***********************************Copyright (c)**********************************
**                               
**                               XPSTUDIO,曹香鹏.
**                         http://xpstudio2003.blog.163.com
**
**文件说明:
    此文件为MENU.C的配套文件,单独使用无意义.
    可以依照格式添加.
    1.在 INT8U const Hzk[]追加汉字码.
    2.在 文件最后追加汉字串编码
    
    即可在文件MENU.C中引用.
***********************************************************************************/

//右箭头.
INT8U const PicArrowSel[24]=
    {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFC,0xF8,0xF0,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x01,0x00,0x00,
};

//汉字空格
INT8U const Space[24]=
    {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

INT8U const Hzk[][24]={
//版
 {0x00,0xFE,0x48,0xCF,0x08,0xFE,0x2A,0x4A,0x89,0x79,0x09,0x00,0x06,0x01,0x00,0x07,0x02,0x05,0x02,0x01,0x01,0x02,0x04,0x00},
//本
 {0x04,0x84,0x44,0x24,0x14,0xFF,0x14,0x24,0x44,0x86,0x04,0x00,0x01,0x00,0x01,0x01,0x01,0x07,0x01,0x01,0x01,0x00,0x01,0x00},
//作
 {0x10,0x08,0xFC,0x13,0x08,0x04,0xFF,0x24,0x24,0x24,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x01,0x01,0x01,0x01,0x00},
//者
 {0x10,0x12,0x92,0xD2,0x7F,0x52,0x5A,0x56,0xD2,0x19,0x10,0x00,0x01,0x01,0x00,0x07,0x05,0x05,0x05,0x05,0x07,0x00,0x00,0x00},
//系
 {0x00,0x02,0x4A,0xCA,0x6E,0xDA,0x49,0xC9,0x65,0x41,0x00,0x00,0x04,0x02,0x01,0x04,0x04,0x07,0x00,0x00,0x01,0x02,0x04,0x00},
//统
 {0x48,0x6C,0x5B,0x4C,0x00,0x32,0xEA,0x27,0xE2,0x32,0x22,0x00,0x02,0x02,0x01,0x05,0x04,0x02,0x01,0x00,0x07,0x04,0x07,0x00},
//信
 {0x20,0xF8,0x07,0x02,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0x02,0x00,0x00,0x07,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x07,0x00,0x00},
//息
 {0x00,0x00,0xFE,0xAA,0xAB,0xAA,0xAA,0xAA,0xFE,0x00,0x00,0x00,0x04,0x03,0x00,0x07,0x04,0x05,0x06,0x04,0x06,0x01,0x02,0x00},
//选
 {0x11,0xF6,0x00,0x18,0x16,0xF4,0x1F,0xF4,0x14,0x14,0x90,0x00,0x06,0x01,0x02,0x06,0x05,0x04,0x04,0x05,0x05,0x05,0x05,0x00},
//项
 {0x02,0x02,0xFE,0x82,0x01,0xFD,0x05,0xF7,0x05,0xFD,0x01,0x00,0x01,0x01,0x00,0x00,0x04,0x04,0x02,0x01,0x01,0x02,0x04,0x00},
//一
 {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
//二
 {0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00},
//三
 {0x00,0x02,0x22,0x22,0x22,0x22,0x22,0x22,0x23,0x02,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00},
//四
 {0x00,0xFF,0x81,0x41,0x3F,0x01,0x01,0xFF,0x81,0x81,0xFF,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x07,0x00},
//五
 {0x00,0x11,0x11,0x91,0x7F,0x11,0x11,0x11,0xF1,0x01,0x00,0x00,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x00},
//六
 {0x08,0x08,0x88,0x68,0x09,0x0E,0x28,0x48,0x88,0x08,0x08,0x00,0x04,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00},
//七
 {0x20,0x20,0x20,0x20,0xFF,0x10,0x10,0x10,0x08,0x08,0x88,0x00,0x00,0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x04,0x07,0x00},

//在此外添加汉字图形编码
//add your character pic 

 
 };
 
/*空菜单*/
INT8U const SpaceMenu[]={0};
/*版本*/
INT8U const Str0[]={2,0,1};
/*作者*/
INT8U const Str1[]={2,2,3};
/*系统信息*/
INT8U const Str2[]={4,4,5,6,7};
/*选项一*/
INT8U const Str3[]={3,8,9,10};
/*选项二*/
INT8U const Str4[]={3,8,9,11};
/*选项三*/
INT8U const Str5[]={3,8,9,12};
/*选项四*/
INT8U const Str6[]={3,8,9,13};
/*选项五*/
INT8U const Str7[]={3,8,9,14};
/*选项六*/
INT8U const Str8[]={3,8,9,15};
/*选项七*/
INT8U const Str9[]={3,8,9,16};

//在此处追加汉字串编码....
//add your character string code


 
//MENUDISP.H文件结束
//===============================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -