標(biāo)題:
單片機(jī)多級(jí)菜單編程的設(shè)計(jì)思路與理解
[打印本頁(yè)]
作者:
liu100m
時(shí)間:
2018-11-2 09:10
標(biāo)題:
單片機(jī)多級(jí)菜單編程的設(shè)計(jì)思路與理解
多級(jí)菜單編程
的設(shè)計(jì)思路:
預(yù)先定義一個(gè)包含
6
個(gè)結(jié)
構(gòu)
元素的結(jié)構(gòu)體
、
5
個(gè)字符型和
1
個(gè)指針
型
。
第
1
個(gè)字符
變
量存放當(dāng)前界面的索引號(hào);
第
2
個(gè)字符
變
量存放按下
“
d
o
wn
(向下)
”
鍵時(shí)需要跳轉(zhuǎn)到的索引號(hào);
第
3
個(gè)字符
變
量存放按下
“u
p
(向上)
”
鍵時(shí)需要跳轉(zhuǎn)到的索引號(hào);
第
4
個(gè)字符
變
量存放按下
“
e
n
t
er
(進(jìn)入)
”
鍵時(shí)需要跳轉(zhuǎn)的索引號(hào);
第
5
個(gè)字符
變
量存放按下
“
e
s
c
(退出)
”
鍵時(shí)需要跳轉(zhuǎn)的索引號(hào);
第
6
個(gè)變量
為
函數(shù)指針變量,存放當(dāng)前索引號(hào)下需要執(zhí)行的函數(shù)的入口地址。
將所有需要顯示的界面其所對(duì)應(yīng)的執(zhí)行函數(shù)和按鍵索引號(hào)以結(jié)構(gòu)體的形式列表存儲(chǔ)。具體實(shí)現(xiàn)如下:
typed
e
f
s
truct
{
uchar
ind
e
x;
/
/
第
1
個(gè)
,
存放當(dāng)前界面的索引號(hào)
uchar
d
o
wn
_
ind
e
x;
/
/
第
2
個(gè)
,
按下
“
d
o
w
n
(向下)
”
鍵時(shí)需要跳轉(zhuǎn)到的索引號(hào)
uchar
up_ind
e
x;
/
/
第
3
個(gè)
,
按下
“u
p
(向上)
”
鍵時(shí)需要跳轉(zhuǎn)到的索引號(hào);
uchar
e
n
t
er_
i
nd
e
x;
/
/
第
4
個(gè)
,
按下
“
e
n
t
er
(進(jìn)入)
”
鍵時(shí)需要跳轉(zhuǎn)的索引號(hào);
uchar
e
s
c_ind
e
x;
/
/
第
5
個(gè)當(dāng)前索
引
號(hào)下需要執(zhí)行
的函數(shù)
的
入口地址。
void
(
*oper
a
te)();
//
第
6
個(gè)函數(shù)指針
}
K
e
y_
i
nd
e
x_
s
t
ruct;
假
設(shè)
菜
單分
3
級(jí),
共
10
個(gè)
界
面
,則
有
:
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
(確認(rèn))
//
|
|
|
|
|
Esc
(退出)
--->
功能函數(shù)
//
|
|
|
|
|
{
0,
1,
2
,
3
,
4
,
(
*Dis
p
Menu
T
op)},
/
/
待機(jī)畫面
{
{
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)},
};
/******
*
******
*
***
*
*
*
*
***
*
***
*
*
*
*
***
*
***
*
*
*
*
***
*
***
*
*
索引號(hào)在
結(jié)構(gòu)圖
中,讀者可以標(biāo)上
/******
*
******
*
***
*
*
*
*
***
*
***
*
*
*
*
***
*
***
*
*
*
*
***
*
***
*
*
*
*
**
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
)
();/
/
執(zhí)行當(dāng)
前
按鍵的操作
}
當(dāng)微處理
器
掃描鍵盤
檢
測(cè)到有按
鍵
按下時(shí),
根
據(jù)按鍵按
下
的類型,
返
回在當(dāng)前
界
面
下
其
所對(duì)應(yīng)的跳轉(zhuǎn)索引號(hào),并執(zhí)行相應(yīng)的函數(shù)。
這段程序隱含一狀態(tài)機(jī)
-
-
--
-
通過(guò)
按
不同的鍵改變狀態(tài)。
結(jié)構(gòu)圖與這一段代碼可理解為狀態(tài)機(jī)。
{1,
2,
3,
4
,
0
,
(*
s
ub_me
n
u1)}
,
這些
數(shù)
字代表
不同階段不同狀態(tài)的
索引號(hào)。
按
鍵
按
下
表示
在
各
個(gè)
狀
態(tài)之
間
跳
轉(zhuǎn)
。
可理
解
為
狀
態(tài)
機(jī),
然
后
根
據(jù)
按鍵
掃
描
返
回
的鍵
值
,
決
定
所
要
跳轉(zhuǎn)的下一狀態(tài)。
系統(tǒng)啟動(dòng)初始化是顯示
Ma
i
n_
me
n
u
界面
,
當(dāng)按鍵檢測(cè)有返回值
(
即有按鍵按下
)
時(shí),根據(jù)按下的按
鍵所代表的操作跳轉(zhuǎn)到指定的狀態(tài)。
例如:按下
Up
或者是
d
o
wn
鍵
時(shí),只是在
Mai
n
_m
e
nu
界面
內(nèi)
高亮顯示不同區(qū)域;
按下
E
n
t
er
時(shí)
,
則要根據(jù)原來(lái)按下的
Up
和
d
o
wn
鍵來(lái)選
擇
需要
跳轉(zhuǎn)的方向
。
假設(shè)在按下
E
n
t
er
之前僅按下一次
d
o
wn
鍵
,
則
k
e
y_v
的值為
2
(
k
e
y_v
的
值默認(rèn)為
1
,
即
默認(rèn)選中子菜
單的第一項(xiàng)
)
,就跳轉(zhuǎn)為
Sub_menu2
界面。
注:也可以自己任定。
k
e
y_v
的值,第一級(jí)(
0
-
10
)
,第二級(jí)
100
-
150
,
第
三級(jí)
1000
-
1100
方便寫程序。
按下
Esc
鍵時(shí)
,
為從子菜單返回到上一級(jí)菜單
,如果已經(jīng)是主菜單了則返回的還是主菜單。
狀態(tài)機(jī)
,
只有發(fā)生一次有效的按鍵
,
狀態(tài)才會(huì)發(fā)生一次跳轉(zhuǎn)
。
而且
,
僅當(dāng)
E
n
t
er
和
E
s
c
鍵按下時(shí)
,
才
會(huì)
切換界面
。
多
級(jí)
菜
單
的
程
序
流
程
。
系
統(tǒng)
上
電
初
始
化
后
顯
示
主
菜
單
,
鍵
盤
掃
描
可
以
通
過(guò)
主
程
序
用
中
斷
掃
描
來(lái)
實(shí)
現(xiàn)
,
最終根據(jù)鍵盤返回的鍵值選擇下一狀態(tài)。
結(jié)語(yǔ)
多級(jí)菜單的實(shí)現(xiàn)方式具有很強(qiáng)的實(shí)用性。程序的本質(zhì)是數(shù)組,與函數(shù)指針的組合應(yīng)用。
在芯片中只有二進(jìn)制碼,沒(méi)有什么結(jié)構(gòu)圖,指針,狀態(tài)圖。
同一程序可畫結(jié)構(gòu)圖來(lái)理解,
同一程序可畫狀態(tài)圖來(lái)理解。
以上的Word格式文檔51黑下載地址:
單片機(jī)多級(jí)菜單編程的理解.zip
(504.08 KB, 下載次數(shù): 565)
2018-11-2 09:10 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
經(jīng)緯
時(shí)間:
2018-11-13 20:25
謝謝分享
作者:
wangsheng1997
時(shí)間:
2018-12-18 20:28
很不錯(cuò)。
作者:
wangsheng1997
時(shí)間:
2018-12-18 20:30
可以下載嗎!
作者:
wangpan04321
時(shí)間:
2019-5-29 10:13
感謝分享
作者:
catking3119
時(shí)間:
2019-6-23 21:24
感謝樓主分享,但是附件是此篇文章PDF版本,讓我有點(diǎn)失望啊
作者:
hilam
時(shí)間:
2019-10-4 10:24
資料不錯(cuò),但假如我的子菜單名稱是不固定的呢,例如一級(jí)菜單第二項(xiàng)是設(shè)置,第二級(jí)菜單是電機(jī)PID參數(shù),要求在菜單中實(shí)時(shí)顯示PID變化 參數(shù),這個(gè)框架應(yīng)該怎樣修改?
作者:
ygflsa
時(shí)間:
2019-11-23 15:58
看不懂這個(gè)怎么執(zhí)行的
{ 0, 1, 2, 3, 4,(*DispMenuTop)},// 待機(jī)畫面
作者:
ygflsa
時(shí)間:
2019-12-1 13:07
下載什么是沒(méi)有.還口我10黑幣
作者:
jifengjianwu
時(shí)間:
2020-1-15 09:46
謝謝樓主分享
作者:
jifengjianwu
時(shí)間:
2020-5-4 19:36
謝謝分享
作者:
布萊克先生
時(shí)間:
2020-9-7 15:24
感謝樓主的解答
作者:
紫色的云
時(shí)間:
2020-12-12 10:56
謝謝樓主的分享,最近正在學(xué)習(xí)多級(jí)菜單的編寫
作者:
西點(diǎn)鐘靈毓秀
時(shí)間:
2021-10-22 15:09
謝謝樓主的分享,最近正在學(xué)習(xí)多級(jí)菜單的編寫
作者:
n_n
時(shí)間:
2021-12-6 16:04
謝謝樓主的分享,最近正在學(xué)習(xí)多級(jí)菜單的編寫
作者:
993347045
時(shí)間:
2022-3-15 10:25
感謝分享,共同進(jìn)步
作者:
飛揚(yáng)1023
時(shí)間:
2022-10-17 15:40
感謝分享,共同進(jìn)步
作者:
fangbolin
時(shí)間:
2023-7-19 16:21
很好的思路
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1