多级菜单编程的设计思路:
预先定义一个包含 6 个结构元素的结构体、5 个字符型和 1 个指针型。 第 1 个字符变量存放当前界面的索引号;
第 2 个字符变量存放按下“down(向下)”键时需要跳转到的索引号; 第 3 个字符变量存放按下“up(向上)”键时需要跳转到的索引号;
第 4 个字符变量存放按下“enter(进入)”键时需要跳转的索引号; 第 5 个字符变量存放按下“esc(退出)”键时需要跳转的索引号;
第 6 个变量为函数指针变量,存放当前索引号下需要执行的函数的入口地址。 将所有需要显示的界面其所对应的执行函数和按键索引号以结构体的形式列表存储。具体实现如下:
typedef struct
{
uchar index; //第 1 个,存放当前界面的索引号
uchar down_index; //第 2 个,按下“down(向下)”键时需要跳转到的索引号 uchar up_index; //第 3 个,按下“up(向上)”键时需要跳转到的索引号; uchar enter_index; //第 4 个,按下“enter(进入)”键时需要跳转的索引号; uchar esc_index; //第 5 个当前索引号下需要执行 的函数的入口地址。 void (*operate)(); //第 6 个函数指针
}Key_index_struct;
假设菜单分 3 级,共 10 个界面,则有:
Key_index_struct const Key_tab[10]=
// |-----------> Index
// | |down(下)
// | | | up(上)
// | | | | Enter(确认)
// | | | | |Esc (退出)--->功能函数
// | | | | |
{ 0, 1, 2, 3, 4,(*DispMenuTop)},// 待机画面
{ {0, 0, 0, 1, 0,(*main_menu)},
{1, 2, 3, 4, 0,(*sub_menu1)},
{2, 3, 1, 5, 0,(*sub_menu2)},
{3, 1, 2, 7, 0,(*sub_menu3)},
{4, 4, 4, 4, 1,(*sub_menu1_1)},
{5, 6, 6, 5, 2, (*sub_menu2_1)},
{6, 5, 5, 5, 2,(*sub_menu2_2)},
{7, 8, 9, 7, 3,(*sub_menu3_1)},
{8, 9, 7, 8, 3,(*sub_menu3_2)},
{9, 7, 8, 9, 3,(*sub_menu3_3)}, };
/****************************************************
索引号在结构图中,读者可以标上
/********************************************************
void Lcd_display(void)
{
switch(Key_status)
{
case enter: Key_fun=Key_tab[Key_fun].enter_index;
break;
case down: Key_fun=Key_tab[Key_fun].down_index;
break;
case up: Key_fun=Key_tab[Key_fun].up_index;
break;
case esc: Key_fun=Key_tab[Key_fun].esc_index;
break;
default: return;
break;
} Key_fun_Pt=Key_tab[Key_fun].operate;
(*Key_fun_Pt)();//执行当前按键的操作
}
当微处理器扫描键盘检测到有按键按下时,根据按键按下的类型,返回在当前界面下其 所对应的跳转索引号,并执行相应的函数。
这段程序隐含一状态机-----通过按不同的键改变状态。
结构图与这一段代码可理解为状态机。{1, 2, 3, 4, 0,(*sub_menu1)},这些数字代表 不同阶段不同状态的索引号。 按键按下表示在各个状态之间跳转。可理解为状态机,然后根据按键扫描返回的键值,决定所要
跳转的下一状态。
系统启动初始化是显示 Main_menu 界面,当按键检测有返回值(即有按键按下)时,根据按下的按 键所代表的操作跳转到指定的状态。
例如:按下 Up 或者是 down 键时,只是在 Main_menu 界面内高亮显示不同区域; 按下 Enter 时,则要根据原来按下的 Up 和 down 键来选择需要跳转的方向。
假设在按下 Enter 之前仅按下一次 down 键,则 key_v 的值为 2(key_v 的值默认为 1,即默认选中子菜 单的第一项),就跳转为 Sub_menu2 界面。
注:也可以自己任定。key_v 的值,第一级(0-10),第二级 100-150,第三级 1000-1100
方便写程序。
按下 Esc 键时,为从子菜单返回到上一级菜单,如果已经是主菜单了则返回的还是主菜单。 状态机,只有发生一次有效的按键,状态才会发生一次跳转。而且,仅当 Enter 和 Esc 键按下时,才会
切换界面。
多级菜单的程序流程。系统上电初始化后显示主菜单,键盘扫描可以通过主程序用中断扫描来实现, 最终根据键盘返回的键值选择下一状态。
结语 多级菜单的实现方式具有很强的实用性。程序的本质是数组,与函数指针的组合应用。
在芯片中只有二进制码,没有什么结构图,指针,状态图。 同一程序可画结构图来理解, 同一程序可画状态图来理解。
以上的Word格式文档51黑下载地址:
单片机多级菜单编程的理解.zip
(504.08 KB, 下载次数: 565)
|