📄 menufunc.lst
字号:
C51 COMPILER V7.06 MENUFUNC 04/16/2008 17:32:02 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MENUFUNC
OBJECT MODULE PLACED IN .\Obj\MenuFunc.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Src\MenuFunc.C LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\Lst\MenuFunc.lst) OB
-JECT(.\Obj\MenuFunc.obj)
stmt level source
1 /******************************************************************************
2 * MenuFunc.C - "功能"菜单 条项动态生成代码
3 *
4 *
5 * DESCRIPTION: -
6 *
7 * modification history
8 * --------------------
9 * 01a, 04/sep/2007, 梁炎昌 written
10 * --------------------
11 ******************************************************************************/
12 #include "CPU.H"
13
14 #include "Ks0108.H"
15 #include "Menu.H"
16 #include "KeyScan.H"
17
18
19 //功能
20 //Bar型菜单
21 void DispMenuFuncInit()
22 {
23 1 //--------------------
24 1 GUI_Clear();
25 1 //--------------------
26 1 BarMenu = &MenuFunc[language];
27 1 ItemNum = (*BarMenu).TextNum;
28 1 DispItem = (*BarMenu).Text;
29 1
30 1 //显示按键对应的文字提示,1-->"进入"
31 1 GUI_DispStringAtBar(*(Tip[language].Text+1),0,Enter_PosY,126,GUI_TA_HCENTER);
32 1
33 1 //用户定义的初始化代码请放在这里
34 1 BarMenuInit();//调用公共初始化的代码
35 1 }
36
37 void DispMenuFuncUp()
38 {
39 1
40 1 switch(Item){
41 2 case 0:{
42 3 #ifdef DynamicBar
Jump2Menu(MenuDataIndex,FlashMode_AutoInit);
#else
45 3 Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
46 3 #endif
47 3
48 3 break;
49 3 }
50 2 case 1:{
51 3 Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
52 3 break;
53 3 }
54 2 default:{
C51 COMPILER V7.06 MENUFUNC 04/16/2008 17:32:02 PAGE 2
55 3 Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
56 3 break;
57 3 }
58 2 }
59 1
60 1 }
61 void DispMenuFuncDown()
62 {
63 1 POP();
64 1 }
65
66 void DispMenuFuncLeft()
67 {
68 1 BarMenuLeft();
69 1 }
70 void DispMenuFuncRight()
71 {
72 1 BarMenuRight();
73 1 }
74
75
76
77
78
79 #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;
/*
实现动态数据显示的最简单的方式设定一定大小的缓冲,而后填充数据,但这样把可以显示的项限制了。这个方法对于维
-护来说是最为简单的
2006/08/27
如何利用有限缓冲来实现动态数据的条项层显示?
比如仅仅缓冲液晶可以显示的条项数目,然后发现上/下越界了,就刷新缓冲?
但这样就要重新另外写类似BarMenuLeft等函数来维护显示
*/
/*
这里使用一个仅仅跟LCD显示条项数目一致的缓冲区来缓冲动态生成的条项
当实际条项数目MaxDynamicItem<=DispMax时 函数BarMenuLeft BarMenuRight工作正常
而当MaxDynamicItem>DispMax时,我们设ItemNum = DispMax,在原本的代码中,这意味着LCD刚刚能显示所有的项
于是一旦到了顶部上翻时就反显底部,到了底部下翻时就反显顶部 但是事实上的项的数目不是ItemNum!而是MaxDynamicI
-tem
C51 COMPILER V7.06 MENUFUNC 04/16/2008 17:32:02 PAGE 3
我们期望的行为是顶部上翻时,修改底部的项为新的项的数据,屏幕整个刷新(底部下翻类似)
做法是设ItemNum = DispMax 并让上下翻的行为跟 ItemNum > DispMax时的行为一致,跟踪位置动态修改显示内容
*/
void DispMenuDataInit(void)
{
U8 Menu_j; //计数变量
U8 *ChangeDispItem; //项显示内容指针
//----------------------
GUI_Clear();
//--------------------
GUI_Delay(100);
// do{
// MaxDynamicItem = InputNum(4,4,9);//要求输入一个动态菜单的值,我们根据这个值生成菜单
MaxDynamicItem = 8;
// if(MaxDynamicItem == 0xFF){//退出
// Jump2Menu(SelfMenuIndex,FlashMode_AutoInit);
// // ReFlash = true;
// return;
// }
// }while(MaxDynamicItem ==0x00);//大于0才有效
// GUI_Clear();
DynamicItem = 0;
if(MaxDynamicItem >DispMax){//需要显示的项数比液晶可以显示的多
ItemNum = DispMax;
//08/29
BarDataMode = DynamicData;//通知BarMenuLeft和BarMenuRight函数现在的数据是动态数据
//当ItemNum == DispMax时,默认的显示方式是到头了直接跳到尾部的(到尾部了直接跳到头部的)
//但是既然这是动态内容的话,而且实际上的项是MaxDynamicItem不少于DispMax,应当翻滚显示的,通过修正B
-arDataMode这个标志
//通知BarMenuLeft和BarMenuRight
} else {
ItemNum = MaxDynamicItem;
}
for(Menu_j = 0;Menu_j < ItemNum; Menu_j++){//初始化动态内容
ChangeDispItem = (U8 *)&DataItem[Menu_j];
*(ChangeDispItem + 4) = Menu_j+'0';
// *(DataItem_p[Menu_j]+4) = Menu_j+'0';
}
DispItem = (U8 **)DataItem_p;
//显示按键对应的文字提示,2-->"OK"
GUI_DispStringAtBar(*(Tip[language].Text+1),0,Enter_PosY,126,GUI_TA_HCENTER);
BarMenuInit();
Bar(DynamicItem,MaxDynamicItem,MenuBarPosX,MenuBarNumPosX); //维护滚动条
}
void DispMenuDataUp()
{
//没有动作,停留在本层菜单
Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
}
void DispMenuDataDown()
{
//08/29
BarDataMode = FixedData;
C51 COMPILER V7.06 MENUFUNC 04/16/2008 17:32:02 PAGE 4
POP();
}
void DispMenuDataLeft()
{
U8 *ChangeDispItem; //项显示内容指针
U8 ItemBackup;
if(DynamicItem == 0){//
DynamicItem = MaxDynamicItem-1;
} else {
DynamicItem--;
}
if(Where == 0){//顶部上移,需要修改数据
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); //维护滚动条
}
void DispMenuDataRight()
{
U8 *ChangeDispItem; //项显示内容指针
U8 ItemBackup;
if(DynamicItem == MaxDynamicItem-1){//维护实际的Item值
DynamicItem = 0;
} else {
DynamicItem++;
}
if(Where == (DispMin-1)){//底部下移,需要修改数据
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); //维护滚动条
}
#endif
225
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 155 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -