📄 menutop.s
字号:
.module MenuTop.C
.area text(rom, con, rel)
.even
_InitMenuVal::
; /******************************************************************************
; * MenuTop.C - 顶层菜单 条项菜单核心函数 图标层函数等
; ******************************************************************************/
;
; #include "SYS_Config.h"
; #include "GUI_Config.h"
; #include "GUI.H"
; #include "LcdDrive.h"
; #include "Menu.H"
;
; #define BarRemainDot 3
; //数字显示位置
; #define BarNumPosY 56
; //Bar的显示开始/结束位置
; #define BarBeginPosY 0
;
; #define BarEndPosX LCD_XSIZE
; #define BarEndPosY 6*8
;
; extern INT8U ItemBackup_i;
; extern INT8U ItemBackup[];
;
; void Bar(INT8U Item_,INT8U ItemNum_,INT8U BarPosX,INT8U BarNumPosX);
;
; void DispBuildTime(void);
; //编译时间
; /*
; *****************************************************************************
; * InitMenuVal - 初始化菜单系统
; * DESCRIPTION: -
; * 该函数必须在进入菜单前被调用 初始化全局变量
; *****************************************************************************
; */
; void InitMenuVal(void)
; {
; WhereBackup_i=0 ;
clr R2
sts _WhereBackup_i,R2
; ItemBackup_i=0 ;
sts _ItemBackup_i,R2
; Layer=0 ;
sts _Layer,R2
; FatherIndex[Layer++]=MenuTopIndex ;
clr R3
mov R24,R2
subi R24,255 ; addi 1
sts _Layer,R24
ldi R24,<_FatherIndex
ldi R25,>_FatherIndex
mov R30,R2
clr R31
add R30,R24
adc R31,R25
std z+0,R2
L1:
.dbline 0 ; func end
ret
.even
_DispMenuTop::
sbiw R28,5
; //push index 待机界面作为起点
; }
; /*
; *****************************************************************************
; * DispMenuTop - 待机界面层5个函数
; * DESCRIPTION: -
; * DispMenuTop DispMenuTopUp DispMenuTopDown DispMenuTopLeft DispMenuTopRight
; *****************************************************************************
; */
;
; //待机界面
; void DispMenuTop(void)
; {
; GUI_Clear();
xcall _GUI_Clear
; GUI_DispStringAtBar("菜单",0,1,LCD_XSIZE,GUI_TA_HCENTER);
ldi R24,16
std y+4,R24
ldi R24,97
std y+2,R24
ldi R24,1
std y+0,R24
clr R18
ldi R16,<L3
ldi R17,>L3
xcall _GUI_DispStringAtBar
; //显示按键对应的文字提示,0-->"功能表"
; GUI_DispStringAt(*(Tip[language].Text),1,LCD_YSIZE-14);
ldi R24,54
std y+0,R24
ldi R18,1
lds R2,_language
ldi R24,5
mul R24,R2
movw R30,R0
ldi R24,<_Tip
ldi R25,>_Tip
add R30,R24
adc R31,R25
lpm R0,Z+
lpm R1,Z
movw R30,R0
ldd R16,z+0
ldd R17,z+1
xcall _GUI_DispStringAt
; //显示按键对应的文字提示,0-->"捷径"
; GUI_DispStringAt(*(Tip[language].Text+5),LCD_XSIZE-24,LCD_YSIZE-14);
ldi R24,54
std y+0,R24
ldi R18,73
lds R2,_language
ldi R24,5
mul R24,R2
movw R30,R0
ldi R24,<_Tip
ldi R25,>_Tip
add R30,R24
adc R31,R25
lpm R0,Z+
lpm R1,Z
movw R30,R0
ldd R16,z+10
ldd R17,z+11
xcall _GUI_DispStringAt
L2:
adiw R28,5
.dbline 0 ; func end
ret
.even
_DispMenuTopUp::
; }
; //待机界面下Up键的处理
; void DispMenuTopUp(void)
; {
; //-------------------
; KeyPressCount=0 ;
clr R2
sts _KeyPressCount,R2
; //-------------------
; GUI_Clear();
xcall _GUI_Clear
; //-------------------
; //这里是顶层菜单,因此在进入子菜单前需要初始化变量
; InitMenuVal();
xcall _InitMenuVal
; //--------------------------
; //状态跳转,进入子菜单
; //jump to Menu index
; Jump2Menu(MenuIndex,FlashMode_AutoInit);
ldi R18,1
ldi R16,5
xcall _Jump2Menu
; return ;
L4:
.dbline 0 ; func end
ret
.even
_DispMenuTopDown::
; }
; //待机界面下Down键的处理
; void DispMenuTopDown(void)
; {
; if((KeyPressCount++)==0x01)
lds R2,_KeyPressCount
clr R3
mov R24,R2
subi R24,255 ; addi 1
sts _KeyPressCount,R24
mov R24,R2
cpi R24,1
brne L6
; {
; KeyPressCount=0 ;
clr R2
sts _KeyPressCount,R2
; GUI_Clear();
xcall _GUI_Clear
; Jump2Menu(MenuSetupIndex,FlashMode_AutoInit);
ldi R18,1
ldi R16,30
xcall _Jump2Menu
; return ;
xjmp L5
L6:
; }
; //return to MenuTop index
; Jump2Menu(MenuTopIndex,FlashMode_NoAction);
clr R18
clr R16
xcall _Jump2Menu
; return ;
L5:
.dbline 0 ; func end
ret
.even
_DispMenuTopLeft::
; }
; //待机界面下Left键的处理
; void DispMenuTopLeft(void)
; {
; KeyPressCount=0 ;
clr R2
sts _KeyPressCount,R2
; /** 这里可以做这个按键的功能定义,因为这是在待机界面下
; 比如,做某个子菜单的快捷链接--按下该按键就直接跳转到某个子菜单
; */
; //-------------------
; //这里是顶层菜单,因此在进入子菜单前需要初始化变量
; // InitMenuVal();
; //--------------------------
; //状态跳转,进入子菜单
; Jump2Menu(MenuTopIndex,FlashMode_NoAction);
clr R18
clr R16
xcall _Jump2Menu
; return ;
L8:
.dbline 0 ; func end
ret
.even
_DispMenuTopRight::
; }
; //待机界面下Right键的处理
; void DispMenuTopRight(void)
; {
; KeyPressCount=0 ;
clr R2
sts _KeyPressCount,R2
;
; //功能函数执行完毕后重新回到待机界面
; Jump2Menu(MenuTopIndex,FlashMode_NoAction);
clr R18
clr R16
xcall _Jump2Menu
; return ;
L9:
.dbline 0 ; func end
ret
.even
_PUSH::
; }
;
;
; //菜单备份函数,备份当前菜单的各个参数
; void PUSH(void)
; {
; WhereBackup[WhereBackup_i++]=Where ;//备份Where--->高亮显示的位置
lds R2,_WhereBackup_i
clr R3
mov R24,R2
subi R24,255 ; addi 1
sts _WhereBackup_i,R24
ldi R24,<_WhereBackup
ldi R25,>_WhereBackup
mov R30,R2
clr R31
add R30,R24
adc R31,R25
lds R2,_Where
std z+0,R2
; ItemBackup[ItemBackup_i++]=Item ; //备份Item--->当前项的位置
lds R2,_ItemBackup_i
clr R3
mov R24,R2
subi R24,255 ; addi 1
sts _ItemBackup_i,R24
ldi R24,<_ItemBackup
ldi R25,>_ItemBackup
mov R30,R2
clr R31
add R30,R24
adc R31,R25
lds R2,_Item
std z+0,R2
; FatherIndex[Layer++]=KeyFuncIndex ; //备份KeyFuncIndex--->状态机的状态
lds R2,_Layer
clr R3
mov R24,R2
subi R24,255 ; addi 1
sts _Layer,R24
ldi R24,<_FatherIndex
ldi R25,>_FatherIndex
mov R30,R2
clr R31
add R30,R24
adc R31,R25
lds R2,_KeyFuncIndex
std z+0,R2
L10:
.dbline 0 ; func end
ret
.even
_POP::
; }
;
; //菜单还原函数
; void POP(void)
; {
; Layer--;//先弹出一层,因为使用的是++,因此当前Layer指向下一个数组位置
lds R24,_Layer
subi R24,1
sts _Layer,R24
; KeyFuncIndex=FatherIndex[Layer-1]; //恢复KeyFuncIndex
ldi R24,<_FatherIndex-1
ldi R25,>_FatherIndex-1
lds R30,_Layer
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
sts _KeyFuncIndex,R2
; Where=WhereBackup[--WhereBackup_i];//恢复高亮显示位置Where
lds R24,_WhereBackup_i
subi R24,1
mov R2,R24
sts _WhereBackup_i,R2
ldi R24,<_WhereBackup
ldi R25,>_WhereBackup
mov R30,R2
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
sts _Where,R2
; Item=ItemBackup[--ItemBackup_i]; //恢复项位置Item
lds R24,_ItemBackup_i
subi R24,1
mov R2,R24
sts _ItemBackup_i,R2
ldi R24,<_ItemBackup
ldi R25,>_ItemBackup
mov R30,R2
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
sts _Item,R2
; Flash=FlashMode_ReFlash ; //子项返回,请求刷新
ldi R24,3
sts _Flash,R24
L11:
.dbline 0 ; func end
ret
; HighLight -> y+13
; Y -> R10
; X -> R22
; s -> R20,R21
.even
_BarDisp::
xcall push_gset3
mov R22,R18
movw R20,R16
sbiw R28,5
ldd R10,y+11
; }
;
; /*
; *****************************************************************************
; * BarDisp - Bar型菜单显示
; * @Para s:BAR显示的文字内容
; * @Para X:X轴坐标
; * @Para Y:Y轴坐标
; * @Para HighLight:1--->高亮显示当前项 0--->普通显示当前项
; //HightLight = 1--->HightLight Disp
; //HightLight = 0--->Normal Disp
; *****************************************************************************
; */
; //void BarDisp(INT8U _CONST_ *s,INT8U X,INT8U Y,INT8U HighLight)
; void BarDisp(INT8U *s,INT8U X,INT8U Y,INT8U HighLight)
; {
; Y++;//主要是在第一行不显示,美观些
inc R10
; if(LessCPUUseage==TRUE)
lds R24,_LessCPUUseage
cpi R24,1
brne L14
; {
; if(HighLight==1)
ldd R24,y+13
cpi R24,1
brne L16
; {
; //高亮显示
; GUI_DispStringAtBar(s,X+8,Y,LCD_XSIZE,GUI_TA_LEFT);
clr R2
std y+4,R2
ldi R24,97
std y+2,R24
std y+0,R10
mov R18,R22
subi R18,248 ; addi 8
movw R16,R20
xcall _GUI_DispStringAtBar
; GUI_SetEnFont(En_6x12);
clr R16
xcall _GUI_SetEnFont
; GUI_DispCharAt('>',X,Y);
std y+0,R10
mov R18,R22
ldi R16,62
xcall _GUI_DispCharAt
; }
xjmp L15
L16:
; else
; {
; //通常显示
; //显示Bar的Text
; GUI_DispStringAtBar(s,X+8,Y,LCD_XSIZE,GUI_TA_LEFT);
clr R2
std y+4,R2
ldi R24,97
std y+2,R24
std y+0,R10
mov R18,R22
subi R18,248 ; addi 8
movw R16,R20
xcall _GUI_DispStringAtBar
; GUI_SetEnFont(En_6x12);
clr R16
xcall _GUI_SetEnFont
; GUI_DispCharAt(' ',X,Y);
std y+0,R10
mov R18,R22
ldi R16,32
xcall _GUI_DispCharAt
; }
; }
xjmp L15
L14:
; else
; {
; if(HighLight==1)
ldd R24,y+13
cpi R24,1
brne L18
; {
; //高亮显示
; GUI_SetTextMode(GUI_TEXTMODE_REVERSE);//更改字体颜色来突出显示
ldi R16,1
xcall _GUI_SetTextMode
; GUI_DispStringAtBar(s,X,Y,LCD_XSIZE,GUI_TA_LEFT);
clr R2
std y+4,R2
ldi R24,97
std y+2,R24
std y+0,R10
mov R18,R22
movw R16,R20
xcall _GUI_DispStringAtBar
; GUI_SetTextMode(GUI_TEXTMODE_NORMAL);
clr R16
xcall _GUI_SetTextMode
; //恢复原有字体颜色和背景颜色
; }
xjmp L19
L18:
; else
; {
; //通常显示
; //显示Bar的Text
; GUI_SetTextMode(GUI_TEXTMODE_NORMAL);
clr R16
xcall _GUI_SetTextMode
; GUI_DispStringAtBar(s,X,Y,LCD_XSIZE,GUI_TA_LEFT);
clr R2
std y+4,R2
ldi R24,97
std y+2,R24
std y+0,R10
mov R18,R22
movw R16,R20
xcall _GUI_DispStringAtBar
; }
L19:
; }
L15:
L13:
adiw R28,5
xcall pop_gset3
.dbline 0 ; func end
ret
; Menu_i -> R20
; Menu_j -> R22
.even
_BarMenuInit::
xcall push_gset2
sbiw R28,3
; }
;
;
; /*FIXME!!!
; 如何修改BarMenuInit和如何处理Item Where的初始化来达到如此一个目的?
; 当前系统语言设定是英语,而英语这个项在第2项位置,因此如何能做到当菜单进入语言选择时,反显位置就在英语那里?
; 1。修改BarMenuInit代码,处理第一次进入时的处理方式,也许就可以仅仅使用从子菜单退出时的处理方法*/
; //Bar型菜单初始化 公共部分
; void BarMenuInit(void)
; {
; INT8U Menu_i ;//计数变量 在菜单函数中用到
; INT8U Menu_j ;//计数变量
;
; //比较"显示屏可以显示的项的数目(DispMax)"跟"需要显示的数目(ItemNum)"
; //找出小者,以小者为显示上限
; //例如显示屏可以显示3项,需要显示的项有2项,那么显示2项,有3项,显示3项,有4项的话,显示3项
; if(ItemNum>DispMax)
ldi R24,3
lds R2,_ItemNum
cp R24,R2
brsh L21
; {
; DispMin=DispMax ;
sts _DispMin,R24
; }
xjmp L22
L21:
; else
; {
; DispMin=ItemNum ;
lds R2,_ItemNum
sts _DispMin,R2
; }
L22:
; //--------------------
; // if (Flash) {//从父菜单进入 初始化
; if(Flash==FlashMode_AutoInit)
lds R24,_Flash
cpi R24,1
brne L23
; {
; //常规进入 做备份
; PUSH();
xcall _PUSH
; //在修改Item Where之前备份这些参数数据!!
; Item=0 ;
clr R2
sts _Item,R2
; Where=0 ;
sts _Where,R2
; }
xjmp L24
L23:
; else if(Flash==FlashMode_ManualInit)
lds R24,_Flash
cpi R24,2
brne L25
; {
; //非常规进入 在之前已经备份了,这里做边界检查
; if(Where>DispMin-1)
lds R24,_DispMin
subi R24,1
lds R2,_Where
cp R24,R2
brsh L27
; {
; //检查是否出界
; //Where = DispMin-1;//A.最底部的显示位置
; Where=0 ;
clr R2
sts _Where,R2
; //B.最顶部的显示位置
; }
L27:
; if(Item>ItemNum-1)
lds R24,_ItemNum
subi R24,1
lds R2,_Item
cp R24,R2
brsh L29
; {
; //检查是否出界
; //Item = ItemNum-1;//A.最后的一个项
; Item=0 ;
clr R2
sts _Item,R2
; //B.最开始的一个项
; }
L29:
; }
L25:
L24:
; //既然Item Where均是未定的,那么我们使用从子菜单退出的方法来找到应该再Where=0位置显示的Item项
;
; //方法2
; if(Item>=Where)
lds R2,_Where
lds R3,_Item
cp R3,R2
brlo L31
; {
; //未跨越零点
; Menu_j=Item-Where ;
mov R22,R3
sub R22,R2
; }
xjmp L32
L31:
; else
; {
; //跨越零点
; Menu_j=ItemNum-(Where-Item);
lds R2,_Item
lds R3,_Where
sub R3,R2
lds R22,_ItemNum
sub R22,R3
; }
L32:
; //此时Menu_J的值就是顶部(Where=0)显示的Item值
; //显示全部的子菜单项
; for(Menu_i=0;Menu_i<DispMin;Menu_i++)
clr R20
xjmp L36
L33:
; {
; if(Menu_j==Item)
lds R2,_Item
cp R22,R2
brne L37
; {
; //反显第Item项,位置是Where
; BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);
ldi R24,1
std y+2,R24
lds R2,_Where
ldi R24,16
mul R24,R2
std y+0,R0
clr R18
lds R2,_Item
ldi R24,2
mul R24,R2
movw R30,R0
lds R2,_DispItem
lds R3,_DispItem+1
add R30,R2
adc R31,R3
ldd R16,z+0
ldd R17,z+1
xcall _BarDisp
; }
xjmp L38
L37:
; else
; {
; //其它项 正常显示
; BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,0);
clr R2
std y+2,R2
ldi R24,16
mul R24,R20
std y+0,R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -