单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1680|回复: 5
打印 上一主题 下一主题
收起左侧

单片机多级菜单编程的设计思路与理解

[复制链接]
跳转到指定楼层
楼主
liu100m 发表于 2018-11-2 09:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
多级菜单编程的设计思路:

预先定义一个包含 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 的值为 2key_v 值默认为 1默认选中子菜 单的第一项,就跳转为 Sub_menu2 界面。

注:也可以自己任定。key_v 的值,第一级(0-10,第二级 100-150三级 1000-1100
方便写程序。

按下 Esc 键时为从子菜单返回到上一级菜单,如果已经是主菜单了则返回的还是主菜单。 状态机只有发生一次有效的按键状态才会发生一次跳转而且仅当 Enter Esc 键按下时
切换界面

最终根据键盘返回的键值选择下一状态。

结语 多级菜单的实现方式具有很强的实用性。程序的本质是数组,与函数指针的组合应用。
在芯片中只有二进制码,没有什么结构图,指针,状态图。 同一程序可画结构图来理解, 同一程序可画状态图来理解。



完整的Word格式文档51黑下载地址:
单片机多级菜单编程的理解.zip (504.08 KB, 下载次数: 70)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
经纬 发表于 2018-11-13 20:25 | 只看该作者
谢谢分享
回复

使用道具 举报

板凳
wangsheng1997 发表于 2018-12-18 20:28 | 只看该作者
很不错。
回复

使用道具 举报

地板
wangsheng1997 发表于 2018-12-18 20:30 | 只看该作者
可以下载吗!
回复

使用道具 举报

5#
wangpan04321 发表于 2019-5-29 10:13 | 只看该作者
感谢分享
回复

使用道具 举报

6#
catking3119 发表于 2019-6-23 21:24 | 只看该作者
感谢楼主分享,但是附件是此篇文章PDF版本,让我有点失望啊
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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