说明:
这个菜单函数,我用了起码10年了,一直是用于12864的液晶屏,由于采取了数据和程序分离的方式去写,所以在多个项目中,游刃有余。
这个函数,可以用于5个按键。
曾经有项目是6个按键的,只是稍加修改就OK了。当然,其他的模块,比如是键盘模块,我就不一一写上了
#include <reg51.h> #include "keyin.h" #include "keyindef.h" #include "lcd.h"
unsigned char SubMenu(unsigned char code * MenuGP, unsigned char MenuCount, unsigned char MenuDefaul);
unsigned char SubMenu(unsigned char code * MenuGP, unsigned char MenuCount, unsigned char MenuDefaul) { unsigned char MenuIndex, ni;
for (MenuIndex = 0; MenuIndex < MenuCount; MenuIndex++) { if (MenuIndex == MenuDefaul) ReserF = 1; DispStringL(MenuGP + MenuIndex * MenuLen); ReserF = 0; }
MenuIndex = MenuDefaul; do { ReleaseKey(); GetKey(); beep(100); ni = KeyVal; switch(ni) { case KeyAdd: case KeyNext: DispStringL(MenuGP + MenuIndex * MenuLen);
if (++MenuIndex == MenuCount) MenuIndex = 0;
ReserF = 1; DispStringL(MenuGP + MenuIndex * MenuLen); //current menu Menu[menuindex][menulen] ReserF = 0; break; case KeySub: DispStringL(MenuGP + MenuIndex * MenuLen);
if (MenuIndex == 0) MenuIndex = MenuCount; MenuIndex --;
ReserF = 1; DispStringL(MenuGP + MenuIndex * MenuLen); //current menu Menu[menuindex][menulen] ReserF = 0; break; } ReleaseKey(); } while (ni != KeyEnter); return MenuIndex; } --------------------
比如在这个项目中,有个菜单需要这样显示 -------------------- 定产 开始 清零 退出 -------------------- 我采用下面的代码实现 ---------------------- 数据部分: code unsigned char mnuRun[4][MenuLen]= { { 1, 2, 2, Hz+ 34,Hz+ 13 //定产 },
{ 3, 0, 2, Hz+ 36,Hz+ 37 },//开始
{ 3, 6, 2, Hz+ 38,Hz+ 39 },//清零
{ 3, 12, 2, Hz+ 25, Hz+ 26 }//退出 }; ---------------------------- 调用部分 ni = SubMenu(mnuRun, 4, 1); switch(ni) { case eSetMaxRunNo: SetMaxRunNo(); break; case eStartRun: StartRun(); break; case eClearRunNo: ClearRunNo(); break; case eExit: break; } -----------------------------
数据和实现方法分离,再复杂的菜单也照杀不误 |