基于状态机的LCD多级菜单设计方案
非阻塞模式LCD多级菜单的设计及其数据结构

第16卷 第4期2007年10月 云南民族大学学报(自然科学版)Journal of Yunnan Nati onalities University (Natural Sciences Editi on )Vol .16 No .4Oct .20073 收稿日期:2007-06-18.作者简介:纳新(1971~),男(回族),硕士研究生,工程师,主要研究方向:嵌入式系统应用.非阻塞模式LC D 多级菜单的设计及其数据结构纳 新1 赵东风2(1、昆明冶研新材料股份有限公司,云南昆明650031;2、云南大学信息学院,云南昆明650091)摘 要 提出一种非阻塞模式LC D 多级菜单的设计,分析了菜单的树形结构,给出了菜单的状态转换模型及其菜单的核心数据结构.并分析菜单实现算法的较小空间复杂度和给出了其数据结构的C51的实现.关键词 非阻塞模式;LC D;多级菜单;数据结构;空间复杂度【中图分类号】TP31111【文献标识码】A【文章编号】1672—8513(2007)04-0347-03Design of Unbl ock Module LCD Multistage Menu and It ’s Data StructureNa Xin 1 Zhao Dongfeng2(1.Kun m ing Metallurgy Reserarch Ne w Materlals Co .,L td,Kun m ing 650031,China;2.Depart m ent of Co mmunicati on Engineering,College of I nfor mati on,Yunnan University,Kun m ing 650091,China )Abstract:This paper intr oduces a design of multistage menu,and analyzes the tree structure of it .A ls o,the state conversi on model and the core data structure of menu is given .The paper analyzes the s pace comp lexity of al 2gorithm s,it sho ws that the s pace comp lexity of our algorith m is l ower .The data structure of C51is als o obtained in this paper .Key words:unbl ock module;LCD;multistage menu;data structure;s pace comp lexity1 概述目前,使用LCD 模块作为智能仪表的人机接口已成为主流趋势,而软件实现菜单驱动的事件处理的人机交互方式,是目前实现人机交互的首选方式.如何在LCD 上实现多级菜单的操作也就成为了必须要解决的问题.LCD 上实现多级菜单的操作有多种方式,但大多都采用阻塞模式LCD 多级菜单设计.而阻塞模式LCD 多级菜单的设计会给操作带来很多不便.比如操作出现错误,系统就停顿下来等待正确的操作后才能进入下一步操作,如果操作者不能进行正确操作,那么系统将一直处于等待状态;进入底层菜单后,如只有单一退出键时,只能逐层推出.多种退出键时,又带来退出操作上的不便利等.非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该操作不会阻塞当前操作,而会立刻返回.非阻塞模式LC D 多级菜单的设计,使得各种操作后程序就返回到操作结束,不必等待正确的操作才结束菜单操作.操作的结果靠定义状态来表示,其关键在于定义了多种操作状态符,每当进入菜单操作后就判断操作状态来执行相应的操作.这种设计方式使得菜单的操作者,不因不正确的操作而使系统停顿下来,系统能较为方便的返回到工作状态等.2 硬件环境和LCD 菜单实现的功能在智能仪表的液晶显示设备中,目前广泛采用的是128×64图形点阵液晶模块.该类液晶可以实现16×16点阵的汉字4行8列,本文就是基于F M12864A -3图形点阵液晶模块实现非阻塞模式LC D 多级菜单的设计.同时将set (设置)、right (右移)、up (下移)、exit (退出)4个按键分别和单片机的I/O 口相连,这样就很容易实现按键值的读取和键值的判断.菜单设计为二级菜单,菜单形式如图1所示.仪表在工作状态下,按set 键进入一级菜单、按exit 键退出一级菜单;仪表在一级菜单下,按set 键进入二级菜单、按up 键滚动反色显示菜单条、按exit 退出743一级菜单,返回工作状态;在二级菜单下,按set 键进入参数设置状态、按right 和up 键进行参数修改、按exit 键退出二级菜单,返回工作状态.图1 菜单形式3 菜单状态转换模型非阻塞模式LCD 多级菜单设计的关键在于操作状态的定义.我们定义了五种操作状态,状态1为无操作状态:其状态标识符为假;状态2为进入一级菜单状态:其标识符为setup _select M enu;状态3为进入二级菜单:其状态标识符为setup _modi D ata .状态4为:在二级菜单中输入参数后有些参数需进行确认,其标识符为setup_confir m.状态5为超时退出(对于在不同状态下没有键操作,超过一定时间后会使菜单状态发生变化)菜单状态转化模型的可见图2所示.键操作后程序进入菜单程序,判断现程序处于何种状态,目前按何操作键,菜单状态根据判定进行转换,程序执行并不停顿下来.菜单状态转变后立即更新菜单状态.图2 菜单状态转换模型4 菜单数据结构的设计菜单的组织结构是一种树形结构,其结构如图3所示.此树形结构可以用长子兄弟法表示,其中左分支为长子,右分支为兄弟,表示结果见图4.由于菜单操作时,有时需在某一子菜单内反复操作,也就是在遍树结构时,需要有父节点的信息,才能较为方便的返回父节点.如果采用带双亲的链式二叉树,那么一个节点就必须多出3个指针(父亲指针,长子指针、兄弟指针)的存储空间.在单片机存储空间较为紧张的情况下,这是难以接受的.为此我们构造了一级菜单的数据结构和二级菜单的数据结构,通过一级菜单数据项的子项信息能寻址到二级菜单项,进而完成长子兄弟法对菜单树的表示[1].由于菜单的各项数据类型差别较大,难以用一种统一的数据类型来表示所有数据,于是将全体数据存入全体参数结构体中(见4.2),并设计了一种统一的参数项属性数据结构(见4.3).在遍历到二级菜单子节点时,首先读取该节点参数项属性,根据参数项属性和一级菜单中给出的二级菜单中第一子项的位置Par mOffset,计算出该节点的存储位置,并读取相应的数据后根据操作状态来进行操作.图3 菜单的组织结构图4 菜单树本文构造的数据结构实现如下:4.1 一级菜单的数据结构在菜单树中,一级菜单项为树结构前几层的兄弟节点,二级菜单项为一级菜单对应项的儿子节点.针对菜单树中的一级菜单项结点a 、b 、c,定义了如下结构体://一级菜单项结构typedef struct843云南民族大学学报(自然科学版) 第16卷{ucharMenuStrI d;//一级菜单名称字符串编号uchar Par mNu m;//相应二级菜单中子参数项数目uchar Par mOffset;//相应二级菜单中第一子项对应全体参数结构的位置}Main MenuStruct;实例化一级菜单:Main MenuStruct code Main2 Menu[3];当菜单状态转入setup_select M enu状态后,通过up键进行菜单滚动时,程序执行Menu I d++操作,得到相应的Main Menu[Menu I d]数据来得出相应一级菜单名称(菜单名称用于显示)和其长子的地址.对于一级菜单项节点,只需两个虚拟指针Par mNu m 和Par mOffset就可表示该树结构,其维持树形结构的空间复杂度为0(2n)[2].4.2 全体参数结构体对二级菜单中全部参数用如下结构体变量存储://全体参数结构typedef struct{uchar Pass wordU ser[4];//一级参数设置密码fl oat ST D;//校正液体密度fl oat S1;//校正液体计数率uchar Pass wordSys[4];//系统密码fl oat SSG;//悬浮固体密度…uchar LoadSettings;//恢复设置uchar Pass wordTri m[4];//输出设置密码…uchar SaveSettings;//保存设置}Par mStruct;实例化全体参数Par mStruct Par m;4.3 参数项属性数据结构参数项属性的结构体,可以表达全部各类参数的属性.其参数项属性结构体如下://参数项属性结构typedef struct{ucharMode; //参数类型ucharMax Value;//参数中某一位最大允许值(浮点参数固定为0~9)uchar T otal L en;//参数的总长度uchar Dec Len;//浮点参数的小数长度fl oatMaxFl oat;//浮点参数对应的上限值fl oatM inFl oat;//浮点参数对应的下限值uint16Offset;//某项对应全体参数结构的地址偏移量}Par mA ttrStruct;实例化参数项属性Par mA ttrStructcode Par mA ttr[24];当遍历二级菜单子节点时,根据某项参数其属性的Offset(某项对应全体参数结构的地址偏移量)和对应一级菜单项的Par mOffset(相应二级菜单中第一子项对应全体参数结构的位置)即可计算出其在Par mStruct中的位置,从而能从全部参数结构体中读出该参数.对于二级菜单项节点,只需1个虚拟指针Offset就可表示该树结构,其维持树形结构的空间复杂度为0(n)[3].由于二级菜单项节点数目远大于一级菜单项节点数,所以从算法的空间复杂度上可以看出,本算法的空间复杂度约为0(n),而带双亲的链式二叉树的空间复杂度约为0(3n).算法操作上也较为简单,能比较好地适应单片机存储空间较为紧张的环境.5 结论本文给出了一种非阻塞模式LCD多级菜单的设计,并在分析菜单结构的基础上,构造了一种特殊的长子兄弟法表示该菜单树,并分析了其较小的空间复杂度,能比较好地适应单片机存储空间较为紧张的环境.该方法已在作者开发的智能仪表上得到成功应用,其可广泛F应用于单片机系统的LCD多级菜单设计中.参考文献:[1] 李敏通,张战国.一种建立单片机应用系统菜单的新方法[J].计算机工程,2006,32(16):259-273.[2] 马忠梅,马岩,张凯,等.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版社,1997.[3] 孙涵芳,徐爱卿.MCS-51/96系列单片机原理及应用[M].北京:北京航空航天大学出版社,1992.(责任编辑 万志琼)943第4期 纳新等:非阻塞模式LCD多级菜单的设计及其数据结构。
一种易于移植的单片机液晶显示多级菜单设计

一种易于移植的单片机液晶显示多级菜单设计王勇【摘要】LCD display as a human-computer interaction is very popular in various application situations of embedded microcontroller systems. However, general LCD display menu design is a little bit complicated, and does not have the portability, therefore the complexity in development and system maintenance and the cost are increased. In this paper we introduce the window and message mechanisms of Windows Operating System, and design a multilevel menu. The core of the menu is a universal window engine which does not depend on specific hardware and the content of menu. Research and application show that the menu design has the characters of simple structure, easy to use, little resource consumption, portable and so on. In the end of the paper we present an application example running in the FYD12864 LCD module.%在单片机嵌入式系统的许多应用场合均采用液晶显示器作为人机交互的方式,然而通常的液晶显示菜单设计较为复杂,且基本不具备可移植性,从而增加了开发、维护的复杂性和成本.引入Windows系统下的窗口和消息机制,设计一个多级菜单,该菜单的核心部分是一个不依赖具体硬件和菜单内容的通用的窗口引擎.研究和应用表明,该菜单设计具有结构简单、使用方便、占用资源少以及易于移植等特点.最后给出一个在FYD12864液晶模块上使用此方法的应用案例.【期刊名称】《计算机应用与软件》【年(卷),期】2011(028)012【总页数】6页(P263-268)【关键词】单片机;液晶显示;菜单;窗口引擎【作者】王勇【作者单位】电子科技大学四川成都610054东莞电子科技大学电子信息工程研究院广东东莞523808【正文语种】中文【中图分类】TP3110 引言单片机系统,特别是8位单片机系统通常可用资源较少,速度相对较慢,一般不适合部署操作系统,更谈不上图形引擎了。
单片机C语言下LCD多级菜单的一种实现方法

单片机C语言下LCD多级菜单的一种实现方法(转)2012-1-10 00:45阅读(1)单片机菜单程序#include#include#define SIZE_OF_KEYBD_MENU 20 //菜单长度uchar KeyFuncIndex=0;//uchar KeyFuncIndexNew=0;void (*KeyFuncPtr)(); //按键功能指针typedef struct{uchar KeyStateIndex; //当前状态索引号uchar KeyDnState; //按下"向下"键时转向的状态索引号uchar KeyUpState; //按下"向上"键时转向的状态索引号uchar KeyCrState; //按下"回车"键时转向的状态索引号void (*CurrentOperate)(); //当前状态应该执行的功能操作} KbdTabStruct;KbdTabStruct code KeyTab[SIZE_OF_KEYBD_MENU]={{ 0, 0, 0, 1,(*DummyJob)},//顶层{ 1, 2, 0, 3,(*DspUserInfo)},//第二层{ 2, 1, 1, 9,(*DspServiceInfo)}, //第二层{ 3, 0, 0, 1,(*DspVoltInfo)},//第三层>>DspUserInfo的展开{ 4, 0, 0, 1,(*DspCurrInfo)},//第三层>>DspUserInfo的展开{ 5, 0, 0, 1,(*DspFreqInfo)},//第三层>>DspUserInfo的展开{ 6, 0, 0, 1,(*DspCableInfo)},//第三层>>DspUserInfo的展开...........{ 9, 0, 0, 1,(*DspSetVoltLevel)}//第三层>>DspServiceInfo的展开..........};void GetKeyInput(void){uchar KeyValue;KeyValue=P1&0x07; //去掉高5bitdelay(50000);switch(KeyValue){case 1: //回车键,找出新的菜单状态编号{KeyFuncIndex=KeyTab[KeyFuncIndex].KeyCrState;break;}case 2: //向上键,找出新的菜单状态编号{KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState; break;}case 4: //向下键,找出新的菜单状态编号{KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDnState; break;}default: //按键错误的处理......break;}KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate; (*KeyFuncPtr)();//执行当前按键的操作}//其中KeyTab的设计颇费尽心机。
lCD5110 多级菜单

void (*KeyFuncPtr)(); //定义按键功能指针
//定义类型
typedef struct
{
unsigned char KeyStateIndex; //当前的状态索引号
unsigned char KeyUp; //按下向上键时的状态索引号
{8,7,6,3,8, (*Menu2_2)}, //第三层菜单 选择第2行,跳到第1行(up),跳到第0行(down),跳到第1层第0行(lift),跳到第2行(Right)
};
//=====================================================================
LCD_DispStringAscii6x8(0, 1, " Menu2-1");
LCD_DispStringAscii6x8(0, 2, " Menu2-2");
}
void Menu2_1(void) //在第2层菜单选中第1个选项
{
LCD_ClrScr(); //清屏
LCD_DispStringAscii6x8(0, 0, " Menu2-0");
} StateTab;
//=====================================================================
//数据结构数组
StateTab code KeyTab[]=
{
{0,2,1,0,3, (*Menu0_0)}, //顶层菜单 索引,上,下,左,右
(*KeyFuncPtr)(); //执行当前的按键操作
12864液晶多级菜单设计

LCD12864 多级菜单

首先定义一个菜单结构typedef struct menu//定义一个菜单{u8 range_from,range_to; //当前显示的项开始及结束序号 u8 itemCount;//项目总数u8 selected;//当前选择项u8 *menuItems[17];//菜单项目struct menu **subMenus;//子菜单struct menu *parent;//上级菜单,如果是顶级则为null void (**func)();//选择相应项按确定键后执行的函数}Menu;Menu MainMenu = { //定义主菜单0,3,4,0,//默认显示0-3项,总共4项,当前选择第0项 {"设置1 \x10","设置2 \x10","输入指令发送","查询\x10"}};Menu searchMenu = {//查询菜单0,3,6,0,{"记帐记录明细","未采集记录数","设备机号","本机IP地址","记录空间大小","软件版本"}};Menu *currentMenu;//当前的菜单用于显示菜单项void display(u8 line) //显示菜单项并设置选中的项反白{int i;line = 3-(currentMenu->range_to-line);Lcd_Fill(0x00);for(i = 0;i<4;i++){Lcd_Disp(i+1,0,currentMenu->menuItems[i+currentMenu->range_from]);}highlight(0,line,8,255);//反白显示指定行}void func(void){printf("hello\r\n");}初始化菜单:void initMenu(){MainMenu.subMenus = malloc(sizeof(&MainMenu)*4);MainMenu.subMenus[0] = NULL;//第1到3项没有子菜单置null,选择后程序会调用func中相应项中的函数MainMenu.subMenus[1] = NULL;MainMenu.subMenus[2] = NULL;MainMenu.subMenus[3] = &searchMenu;//第四项查询有子菜单MainMenu.func = malloc(sizeof(&func)*4);MainMenu.func[0] = NULL;MainMenu.func[1] = NULL;MainMenu.func[2] = &func;//当选择了并按了确定,会执行func函数MainMenu.func[3] = NULL;MainMenu.parent = NULL;//表示是顶级菜单searchMenu.subMenus = malloc(sizeof(&searchMenu)*6);searchMenu.subMenus[0] = searchMenu.subMenus[1] = searchMenu.subMenus[2] = searchMenu.subMenus[3] = searchMenu.subMenus[4] = searchMenu.subMenus[5] = NULL;searchMenu.func = malloc(sizeof(&printf)*6);searchMenu.func[0] = searchMenu.func[2] = searchMenu.func[2] = searchMenu.func[3] = searchMenu.func[4] = searchMenu.func[5] = NULL;searchMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单项currentMenu = &MainMenu;}mainint main(void){delay_init();uart_init(9600);Lcd_Init();KEY_Init();initMenu();display(currentMenu->selected);while(1){key = KEY_Scan();if(key == 0){delay_ms(10);continue;}printf("key %d is press\r\n",key);switch(key){case 12://向上if(currentMenu->selected == 0)//到了第一项break;else{currentMenu->selected--;if(currentMenu->selected < currentMenu->range_from)//更新显示的区域 {currentMenu->range_from = currentMenu->selected;currentMenu->range_to = currentMenu->range_from+3;}display(currentMenu->selected);break;}case 8://向下if(currentMenu->selected == currentMenu->itemCount-1)break;else{currentMenu->selected++;if(currentMenu->selected>currentMenu->range_to){currentMenu->range_to = currentMenu->selected;currentMenu->range_from = currentMenu->range_to-3;}display(currentMenu->selected);break;}case 4://Enter键{if(currentMenu->subMenus[currentMenu->selected] !=NULL){currentMenu = currentMenu->subMenus[currentMenu->selected]; display(0);}else{if(currentMenu->func[currentMenu->selected] != NULL){currentMenu->func[currentMenu->selected]();//执行相应的函数 display(currentMenu->selected);//返回后恢复原来的菜单状态}}break;}case 3://返回键{if(currentMenu->parent!=NULL)//父菜单不为空,将显示父菜单{currentMenu = currentMenu->parent;display(currentMenu->selected);}break;}default:break;}delay_ms(10);}}void Lcd_Disp(unsigned char x,unsigned char y,unsigned char *s) {Lcd_Write_Cmd(0x30); //进入标准模式LCD_Set_XY(x,y);while (*s){Lcd_Write_Data(*s);s++;}Lcd_Write_Cmd(0x36); //返回图形模式}void highlight(uchar x,uchar y,uchar width,u8 mode) //反白,X值为0-7,Y值为0-3,width为行反白格数{uchar i,j,flag=0x00;if(y>1){flag=0x08;y=y-2;}Lcd_Write_Cmd(0x34); //写数据时,关闭图形显示,且打开扩展指令集for(i=0;i<16;i++){Lcd_Write_Cmd(0x80+(y<<4)+i);Lcd_Write_Cmd(0x80+flag+x);for(j=0;j<width;j++){Lcd_Write_Data(mode);Lcd_Write_Data(mode);}}Lcd_Write_Cmd(0x36); //写完数据,开图形显示}。
LCD12864多级菜单课程设计

LCD12864多级菜单课程设计一、课程目标知识目标:1. 理解LCD12864液晶显示屏的基本工作原理和接口技术。
2. 掌握多级菜单的设计方法,包括菜单结构、界面布局及跳转逻辑。
3. 学会编写程序代码实现LCD12864多级菜单的显示与操作。
技能目标:1. 能够运用所学知识设计出结构清晰、界面友好的多级菜单界面。
2. 熟练使用相关编程语言和开发工具,完成程序编写和调试。
3. 培养学生的动手操作能力和团队协作能力,提高问题解决能力。
情感态度价值观目标:1. 培养学生对电子技术和编程的兴趣,激发学习热情。
2. 培养学生严谨、细心的学习态度,养成良好的编程习惯。
3. 增强学生的创新意识,鼓励学生敢于尝试、勇于实践。
分析课程性质、学生特点和教学要求,本课程目标旨在帮助学生在掌握LCD12864多级菜单设计的基础上,提高实际操作能力,培养学生的创新思维和团队协作精神。
通过本课程的学习,使学生能够在实际项目中运用所学知识,为我国电子信息产业的发展做出贡献。
同时,注重培养学生的情感态度价值观,使学生在学习过程中形成积极向上的人生态度。
二、教学内容1. LCD12864液晶显示屏原理介绍:包括显示原理、接口技术、指令集等基本知识。
- 教材章节:第三章第二节- 内容列举:LCD12864工作原理、接口类型、指令功能。
2. 多级菜单设计方法:- 教材章节:第五章- 内容列举:菜单结构设计、界面布局、跳转逻辑、操作流程。
3. 编程实现LCD12864多级菜单:- 教材章节:第六章- 内容列举:编程环境搭建、代码编写、程序调试、功能实现。
4. 实例分析与操作:- 教材章节:第七章- 内容列举:典型多级菜单实例、操作方法、优化技巧。
5. 动手实践与团队协作:- 教材章节:第八章- 内容列举:实践任务分配、协作流程、成果展示。
根据课程目标,教学内容分为五个部分,确保学生系统掌握LCD12864多级菜单设计的相关知识。
教学大纲明确指出各部分内容的安排和进度,以及教材对应的章节和具体内容。
LCD12864 多级菜单

searchMenu.subMenus = malloc(sizeof(&searchMenu)*6); searchMenu.subMenus[0] = searchMenu.subMenus[1] = searchMenu.subMenus[2] = searchMenu.subMenus[3] = searchMenu.subMenus[4] = searchMenu.subMenus[5] = NULL; searchMenu.func = malloc(sizeof(&printf)*6); searchMenu.func[0] = searchMenu.func[2] = searchMenu.func[2] = searchMenu.func[3] = searchMenu.func[4] = searchMenu.func[5] = NULL; searchMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询 子菜单后按返回键,将会显示这个菜单 项
Lcd_Write_Data(*s); s++; } Lcd_Write_Cmd(0x36); //返回图形模式 }
void highlight(uchar x,uchar y,uchar width,u8 mode)
//反
白,X值为0-7,Y值为0-3,width为行反白格数
{
uchar i,j,flag=0x00;
break; } case 8://向下 if(currentMenu->selected == currentMenu->itemCount-1) break; else { currentMenu->selected++; if(currentMenu->selected>currentMenu->range_to) {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于状态机的LCD多级菜单设计方案
1概述
液晶显示器(Liquid Crystal Display,LCD)由于其体积和功耗等因素,非常适合嵌入式环境的使用。
近年来,随着微处理器性能的提高,嵌入式系统实现的功能越来越强大,产生的数据量也越来越大。
相对应地,需要显示的数据量也随之增大。
嵌入式环境下使用LCD 显示器,由于条件限制,体积较小,且显示的内容有限。
而且,传统的LCD显示模式总是不加选择地显示所有监控的信息,在监控的信息量非常庞大时会导致不能及时显示用户所需求的信息。
多级菜单显示则是将信息分类显示的一种显示方式,该方式根据用户的选择,对显示信息加以筛选并分级显示,这样既保证用户获取其所需的信息,又能保障信息显示的实时性。
2多级菜单的结构
设计多级菜单的目的在于将需要显示的信息分门归类,方便用户筛选。
所以在设计菜单时需要根据整个系统的功能和要求来设定菜单的级数,以及各级子菜单的个数。
整个多级菜单的拓扑结构为树型结构,主菜单为根节点,子菜单为枝节点,最后一级菜单为叶节点,如图1所示。
图1多级菜单的结构图
3多级菜单的程序设计
3.1循环方式
循环方式的设计思路:预先定义一个包含6个结构元素的结构体、5个字符型和1个指针型。
第1个字符变量存放当前界面的索引号;第2个字符变量存放按下down(向下)键时需要跳转到的索引号;第3个字符变量存放按下up(向上)键时需要跳转到的索引号;第4个字符变量存放按下enter(进入)键时需要跳转的索引号;第5个字符变量存放按下esc(退出)键时需要跳转的索引号;第6个变量为函数指针变量,存放当前索引号下需要执行的函数的入口地址。