?? menufunc.c
字號(hào):
/******************************************************************************
* MenuFunc.C - "功能"菜單 條項(xiàng)動(dòng)態(tài)生成代碼
*
*
* DESCRIPTION: -
*
* modification history
* --------------------
* 01a, 04/sep/2007, 梁炎昌 written
* --------------------
******************************************************************************/
#include "CPU.H"
#include "Ks0108.H"
#include "Menu.H"
#include "KeyScan.H"
//功能
//Bar型菜單
void DispMenuFuncInit()
{
//--------------------
GUI_Clear();
//--------------------
BarMenu = &MenuFunc[language];
ItemNum = (*BarMenu).TextNum;
DispItem = (*BarMenu).Text;
//顯示按鍵對(duì)應(yīng)的文字提示,1-->"進(jìn)入"
GUI_DispStringAtBar(*(Tip[language].Text+1),0,Enter_PosY,126,GUI_TA_HCENTER);
//用戶定義的初始化代碼請(qǐng)放在這里
BarMenuInit();//調(diào)用公共初始化的代碼
}
void DispMenuFuncUp()
{
switch(Item){
case 0:{
#ifdef DynamicBar
Jump2Menu(MenuDataIndex,FlashMode_AutoInit);
#else
Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
#endif
break;
}
case 1:{
Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
break;
}
default:{
Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
break;
}
}
}
void DispMenuFuncDown()
{
POP();
}
void DispMenuFuncLeft()
{
BarMenuLeft();
}
void DispMenuFuncRight()
{
BarMenuRight();
}
#ifdef DynamicBar
//------------------------------------------------
#define DataItemSize 8
U8 DataItem[DispMax][DataItemSize]=
{
{"DataX "},
{"DataX "},
{"DataX "},
};
U8 *_CONST_ DataItem_p[]=
{
DataItem[0],
DataItem[1],
DataItem[2]
};
U8 DynamicItem;
U8 MaxDynamicItem = 0;
/*
實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)顯示的最簡(jiǎn)單的方式設(shè)定一定大小的緩沖,而后填充數(shù)據(jù),但這樣把可以顯示的項(xiàng)限制了。這個(gè)方法對(duì)于維護(hù)來(lái)說(shuō)是最為簡(jiǎn)單的
2006/08/27
如何利用有限緩沖來(lái)實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)的條項(xiàng)層顯示?
比如僅僅緩沖液晶可以顯示的條項(xiàng)數(shù)目,然后發(fā)現(xiàn)上/下越界了,就刷新緩沖?
但這樣就要重新另外寫類似BarMenuLeft等函數(shù)來(lái)維護(hù)顯示
*/
/*
這里使用一個(gè)僅僅跟LCD顯示條項(xiàng)數(shù)目一致的緩沖區(qū)來(lái)緩沖動(dòng)態(tài)生成的條項(xiàng)
當(dāng)實(shí)際條項(xiàng)數(shù)目MaxDynamicItem<=DispMax時(shí) 函數(shù)BarMenuLeft BarMenuRight工作正常
而當(dāng)MaxDynamicItem>DispMax時(shí),我們?cè)O(shè)ItemNum = DispMax,在原本的代碼中,這意味著LCD剛剛能顯示所有的項(xiàng)
于是一旦到了頂部上翻時(shí)就反顯底部,到了底部下翻時(shí)就反顯頂部 但是事實(shí)上的項(xiàng)的數(shù)目不是ItemNum!而是MaxDynamicItem
我們期望的行為是頂部上翻時(shí),修改底部的項(xiàng)為新的項(xiàng)的數(shù)據(jù),屏幕整個(gè)刷新(底部下翻類似)
做法是設(shè)ItemNum = DispMax 并讓上下翻的行為跟 ItemNum > DispMax時(shí)的行為一致,跟蹤位置動(dòng)態(tài)修改顯示內(nèi)容
*/
void DispMenuDataInit(void)
{
U8 Menu_j; //計(jì)數(shù)變量
U8 *ChangeDispItem; //項(xiàng)顯示內(nèi)容指針
//----------------------
GUI_Clear();
//--------------------
GUI_Delay(100);
// do{
// MaxDynamicItem = InputNum(4,4,9);//要求輸入一個(gè)動(dòng)態(tài)菜單的值,我們根據(jù)這個(gè)值生成菜單
MaxDynamicItem = 8;
// if(MaxDynamicItem == 0xFF){//退出
// Jump2Menu(SelfMenuIndex,FlashMode_AutoInit);
// // ReFlash = true;
// return;
// }
// }while(MaxDynamicItem ==0x00);//大于0才有效
// GUI_Clear();
DynamicItem = 0;
if(MaxDynamicItem >DispMax){//需要顯示的項(xiàng)數(shù)比液晶可以顯示的多
ItemNum = DispMax;
//08/29
BarDataMode = DynamicData;//通知BarMenuLeft和BarMenuRight函數(shù)現(xiàn)在的數(shù)據(jù)是動(dòng)態(tài)數(shù)據(jù)
//當(dāng)ItemNum == DispMax時(shí),默認(rèn)的顯示方式是到頭了直接跳到尾部的(到尾部了直接跳到頭部的)
//但是既然這是動(dòng)態(tài)內(nèi)容的話,而且實(shí)際上的項(xiàng)是MaxDynamicItem不少于DispMax,應(yīng)當(dāng)翻滾顯示的,通過(guò)修正BarDataMode這個(gè)標(biāo)志
//通知BarMenuLeft和BarMenuRight
} else {
ItemNum = MaxDynamicItem;
}
for(Menu_j = 0;Menu_j < ItemNum; Menu_j++){//初始化動(dòng)態(tài)內(nèi)容
ChangeDispItem = (U8 *)&DataItem[Menu_j];
*(ChangeDispItem + 4) = Menu_j+'0';
// *(DataItem_p[Menu_j]+4) = Menu_j+'0';
}
DispItem = (U8 **)DataItem_p;
//顯示按鍵對(duì)應(yīng)的文字提示,2-->"OK"
GUI_DispStringAtBar(*(Tip[language].Text+1),0,Enter_PosY,126,GUI_TA_HCENTER);
BarMenuInit();
Bar(DynamicItem,MaxDynamicItem,MenuBarPosX,MenuBarNumPosX); //維護(hù)滾動(dòng)條
}
void DispMenuDataUp()
{
//沒(méi)有動(dòng)作,停留在本層菜單
Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
}
void DispMenuDataDown()
{
//08/29
BarDataMode = FixedData;
POP();
}
void DispMenuDataLeft()
{
U8 *ChangeDispItem; //項(xiàng)顯示內(nèi)容指針
U8 ItemBackup;
if(DynamicItem == 0){//
DynamicItem = MaxDynamicItem-1;
} else {
DynamicItem--;
}
if(Where == 0){//頂部上移,需要修改數(shù)據(jù)
if (Item == 0) {//獲得Item
ItemBackup = ItemNum-1;
} else {
ItemBackup = Item-1;
}
ChangeDispItem = (U8*)&DataItem[ItemBackup];
*(ChangeDispItem + 4) = DynamicItem+'0';
}
BarMenuLeft();//
Bar(DynamicItem,MaxDynamicItem,MenuBarPosX,MenuBarNumPosX); //維護(hù)滾動(dòng)條
}
void DispMenuDataRight()
{
U8 *ChangeDispItem; //項(xiàng)顯示內(nèi)容指針
U8 ItemBackup;
if(DynamicItem == MaxDynamicItem-1){//維護(hù)實(shí)際的Item值
DynamicItem = 0;
} else {
DynamicItem++;
}
if(Where == (DispMin-1)){//底部下移,需要修改數(shù)據(jù)
if (Item == (ItemNum-1)) {//獲得Item
ItemBackup = 0;
} else {
ItemBackup = Item + 1;
}
ChangeDispItem = (U8*)&DataItem[ItemBackup];//獲得修改位置
*(ChangeDispItem + 4) = DynamicItem+'0';
}
BarMenuRight();
Bar(DynamicItem,MaxDynamicItem,MenuBarPosX,MenuBarNumPosX); //維護(hù)滾動(dòng)條
}
#endif
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -