标题:
单片机多级菜单编程的设计思路与理解
[打印本页]
作者:
liu100m
时间:
2018-11-2 09:10
标题:
单片机多级菜单编程的设计思路与理解
多级菜单编程
的设计思路:
预先定义一个包含
6
个结
构
元素的结构体
、
5
个字符型和
1
个指针
型
。
第
1
个字符
变
量存放当前界面的索引号;
第
2
个字符
变
量存放按下
“
d
o
wn
(向下)
”
键时需要跳转到的索引号;
第
3
个字符
变
量存放按下
“u
p
(向上)
”
键时需要跳转到的索引号;
第
4
个字符
变
量存放按下
“
e
n
t
er
(进入)
”
键时需要跳转的索引号;
第
5
个字符
变
量存放按下
“
e
s
c
(退出)
”
键时需要跳转的索引号;
第
6
个变量
为
函数指针变量,存放当前索引号下需要执行的函数的入口地址。
将所有需要显示的界面其所对应的执行函数和按键索引号以结构体的形式列表存储。具体实现如下:
typed
e
f
s
truct
{
uchar
ind
e
x;
/
/
第
1
个
,
存放当前界面的索引号
uchar
d
o
wn
_
ind
e
x;
/
/
第
2
个
,
按下
“
d
o
w
n
(向下)
”
键时需要跳转到的索引号
uchar
up_ind
e
x;
/
/
第
3
个
,
按下
“u
p
(向上)
”
键时需要跳转到的索引号;
uchar
e
n
t
er_
i
nd
e
x;
/
/
第
4
个
,
按下
“
e
n
t
er
(进入)
”
键时需要跳转的索引号;
uchar
e
s
c_ind
e
x;
/
/
第
5
个当前索
引
号下需要执行
的函数
的
入口地址。
void
(
*oper
a
te)();
//
第
6
个函数指针
}
K
e
y_
i
nd
e
x_
s
t
ruct;
假
设
菜
单分
3
级,
共
10
个
界
面
,则
有
:
K
e
y_
i
nd
e
x_
s
truct
c
on
s
t
K
e
y_
t
ab[
10]=
//
|
--------
-
-->
In
d
ex
//
|
|
dow
n
(下)
//
|
|
|
up
(
上)
//
|
|
|
|
Ent
e
r
(确认)
//
|
|
|
|
|
Esc
(退出)
--->
功能函数
//
|
|
|
|
|
{
0,
1,
2
,
3
,
4
,
(
*Dis
p
Menu
T
op)},
/
/
待机画面
{
{
0,
0,
0,
1,
0
,
(
*main_menu)},
{1,
2,
3,
4,
0
,
(
*
sub_menu1)},
{2,
3,
1,
5,
0,(*
s
ub_menu2)},
{3,
1,
2,
7,
0
,
(
*
sub_menu3)},
{4,
4,
4,
4,
1
,
(
*
sub_menu1_1)},
{5,
6,
6,
5,
2,
(
*
s
ub_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)},
};
/******
*
******
*
***
*
*
*
*
***
*
***
*
*
*
*
***
*
***
*
*
*
*
***
*
***
*
*
索引号在
结构图
中,读者可以标上
/******
*
******
*
***
*
*
*
*
***
*
***
*
*
*
*
***
*
***
*
*
*
*
***
*
***
*
*
*
*
**
v
oid
Lcd_di
s
p
l
a
y(
v
oid)
{
s
wi
t
ch(
K
e
y_
s
t
a
tus)
{
c
ase
e
n
t
er:
K
e
y_
f
un=
K
e
y_
t
ab[
K
e
y_
f
un]
.
e
n
t
er_
i
nd
e
x;
b
r
eak;
c
ase
d
o
wn:
K
e
y_
f
u
n=
K
e
y_
t
ab[
K
e
y_
f
un]
.
d
o
wn_ind
e
x;
b
r
eak;
c
ase
up:
K
e
y_
f
un=
K
e
y_
t
ab[
K
e
y_
f
un]
.
up_ind
e
x;
b
r
eak;
c
ase
e
s
c:
K
e
y_
f
un=
K
e
y_
t
ab[
K
e
y_
f
un]
.
e
s
c_ind
e
x;
b
r
eak;
d
e
f
ault:
r
e
tu
r
n;
b
r
eak;
}
K
e
y_
f
un_
P
t=
K
e
y_
t
ab[
K
e
y_
f
un].ope
r
a
t
e;
(*
K
e
y_
f
un_
P
t
)
();/
/
执行当
前
按键的操作
}
当微处理
器
扫描键盘
检
测到有按
键
按下时,
根
据按键按
下
的类型,
返
回在当前
界
面
下
其
所对应的跳转索引号,并执行相应的函数。
这段程序隐含一状态机
-
-
--
-
通过
按
不同的键改变状态。
结构图与这一段代码可理解为状态机。
{1,
2,
3,
4
,
0
,
(*
s
ub_me
n
u1)}
,
这些
数
字代表
不同阶段不同状态的
索引号。
按
键
按
下
表示
在
各
个
状
态之
间
跳
转
。
可理
解
为
状
态
机,
然
后
根
据
按键
扫
描
返
回
的键
值
,
决
定
所
要
跳转的下一状态。
系统启动初始化是显示
Ma
i
n_
me
n
u
界面
,
当按键检测有返回值
(
即有按键按下
)
时,根据按下的按
键所代表的操作跳转到指定的状态。
例如:按下
Up
或者是
d
o
wn
键
时,只是在
Mai
n
_m
e
nu
界面
内
高亮显示不同区域;
按下
E
n
t
er
时
,
则要根据原来按下的
Up
和
d
o
wn
键来选
择
需要
跳转的方向
。
假设在按下
E
n
t
er
之前仅按下一次
d
o
wn
键
,
则
k
e
y_v
的值为
2
(
k
e
y_v
的
值默认为
1
,
即
默认选中子菜
单的第一项
)
,就跳转为
Sub_menu2
界面。
注:也可以自己任定。
k
e
y_v
的值,第一级(
0
-
10
)
,第二级
100
-
150
,
第
三级
1000
-
1100
方便写程序。
按下
Esc
键时
,
为从子菜单返回到上一级菜单
,如果已经是主菜单了则返回的还是主菜单。
状态机
,
只有发生一次有效的按键
,
状态才会发生一次跳转
。
而且
,
仅当
E
n
t
er
和
E
s
c
键按下时
,
才
会
切换界面
。
多
级
菜
单
的
程
序
流
程
。
系
统
上
电
初
始
化
后
显
示
主
菜
单
,
键
盘
扫
描
可
以
通
过
主
程
序
用
中
断
扫
描
来
实
现
,
最终根据键盘返回的键值选择下一状态。
结语
多级菜单的实现方式具有很强的实用性。程序的本质是数组,与函数指针的组合应用。
在芯片中只有二进制码,没有什么结构图,指针,状态图。
同一程序可画结构图来理解,
同一程序可画状态图来理解。
以上的Word格式文档51黑下载地址:
单片机多级菜单编程的理解.zip
(504.08 KB, 下载次数: 565)
2018-11-2 09:10 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
经纬
时间:
2018-11-13 20:25
谢谢分享
作者:
wangsheng1997
时间:
2018-12-18 20:28
很不错。
作者:
wangsheng1997
时间:
2018-12-18 20:30
可以下载吗!
作者:
wangpan04321
时间:
2019-5-29 10:13
感谢分享
作者:
catking3119
时间:
2019-6-23 21:24
感谢楼主分享,但是附件是此篇文章PDF版本,让我有点失望啊
作者:
hilam
时间:
2019-10-4 10:24
资料不错,但假如我的子菜单名称是不固定的呢,例如一级菜单第二项是设置,第二级菜单是电机PID参数,要求在菜单中实时显示PID变化 参数,这个框架应该怎样修改?
作者:
ygflsa
时间:
2019-11-23 15:58
看不懂这个怎么执行的
{ 0, 1, 2, 3, 4,(*DispMenuTop)},// 待机画面
作者:
ygflsa
时间:
2019-12-1 13:07
下载什么是没有.还口我10黑币
作者:
jifengjianwu
时间:
2020-1-15 09:46
谢谢楼主分享
作者:
jifengjianwu
时间:
2020-5-4 19:36
谢谢分享
作者:
布莱克先生
时间:
2020-9-7 15:24
感谢楼主的解答
作者:
紫色的云
时间:
2020-12-12 10:56
谢谢楼主的分享,最近正在学习多级菜单的编写
作者:
西点钟灵毓秀
时间:
2021-10-22 15:09
谢谢楼主的分享,最近正在学习多级菜单的编写
作者:
n_n
时间:
2021-12-6 16:04
谢谢楼主的分享,最近正在学习多级菜单的编写
作者:
993347045
时间:
2022-3-15 10:25
感谢分享,共同进步
作者:
飞扬1023
时间:
2022-10-17 15:40
感谢分享,共同进步
作者:
fangbolin
时间:
2023-7-19 16:21
很好的思路
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1