📄 menutop.s
字号:
clr R18
ldi R24,2
mul R24,R22
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
; }
L38:
; if(Menu_j==(ItemNum-1))
lds R24,_ItemNum
subi R24,1
cp R22,R24
brne L39
; {
; //到了最后一项,回环到最开始的一项
; Menu_j=0 ;
clr R22
; }
xjmp L40
L39:
; else
; {
; //下一项
; Menu_j++;
inc R22
; }
L40:
L34:
inc R20
L36:
lds R2,_DispMin
cp R20,R2
brsh X0
xjmp L33
X0:
; }
; Bar(Item,ItemNum,MenuBarPosX,MenuBarNumPosX); // jjx //维护滚动条
ldi R24,88
std y+2,R24
ldi R24,94
std y+0,R24
lds R18,_ItemNum
lds R16,_Item
xcall _Bar
L20:
adiw R28,3
xcall pop_gset2
.dbline 0 ; func end
ret
; ItemBack -> R20
; Menu_i -> R22
; Menu_j -> R10
.even
_BarMenuLeft::
xcall push_gset3
sbiw R28,3
; }
;
;
; //Bar项菜单向左按键的行为
; /*
; 可能的几种情况:
; A.原有Bar的顶部,按键是向上,那么就需要刷新全部的显示
; A1.若是需要显示的Bar多于单屏可以显示的Bar,那么重新显示全部
; A2.若是需要显示的Bar不多于单屏可以显示的Bar,取消顶部高亮显示,高亮显示最后一项Bar
; B.原有Bar不是在顶部,按键向上,那么取消原有Bar的高亮,高亮显示上一个Bar项
; 当然还需要维护:高亮显示的位置where/高亮显示Bar项的Item
; */
;
; //维护Bar显示
; void BarMenuLeft(void)
; {
; INT8U Menu_i ; //计数变量 在菜单函数中用到
; INT8U Menu_j ;//计数变量
; INT8U ItemBack ;
;
; ItemBack=Item ;//备份原有的Item,取消原有反显时需要使用
lds R20,_Item
;
; if(Item==0) //维护Item,得到需要反显的Item
tst R20
brne L42
; {
; Item=ItemNum-1 ;
lds R24,_ItemNum
subi R24,1
sts _Item,R24
; }
xjmp L43
L42:
; else
; {
; Item--;
lds R24,_Item
subi R24,1
sts _Item,R24
; }
L43:
; //维护显示
; if(Where)
lds R2,_Where
tst R2
brne X1
xjmp L44
X1:
; {
; //当前位置不为0,就是说不是在顶部,两次反显
; if (LessCPUUseage==TRUE)
lds R24,_LessCPUUseage
cpi R24,1
brne L46
; {
; GUI_SetEnFont(En_6x12);
clr R16
xcall _GUI_SetEnFont
; GUI_DispCharAt(' ',BarXOffset,(Where--)*BarYSize+BarYOffset);
lds R2,_Where
clr R3
mov R24,R2
subi R24,1
sts _Where,R24
ldi R16,16
ldi R17,0
movw R18,R2
xcall empy16s
std y+0,R16
clr R18
ldi R16,32
xcall _GUI_DispCharAt
; GUI_DispCharAt('>',BarXOffset,Where*BarYSize+BarYOffset);
lds R2,_Where
ldi R24,16
mul R24,R2
std y+0,R0
clr R18
ldi R16,62
xcall _GUI_DispCharAt
; }
xjmp L45
L46:
; else
; {
; //原来位置取消反显 项是ItemBack 位置Where
; BarDisp(*(DispItem+ItemBack),BarXOffset,(Where--)*BarYSize+BarYOffset,0);
clr R2
std y+2,R2
lds R2,_Where
clr R3
mov R24,R2
subi R24,1
sts _Where,R24
ldi R16,16
ldi R17,0
movw R18,R2
xcall empy16s
std y+0,R16
clr R18
ldi R24,2
mul R24,R20
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
; //上移后的位置反显 项是Item 位置Where-1 (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
; //高亮显示
; }
;
; #ifdef RockBack
; }
xjmp L45
L44:
; else
; {
; //当前位置为0, 顶部 上移 需要刷新全部子菜单项显示 //1.回滚方式,到了顶部后回滚到底部
; #ifdef DynamicBar
; if((ItemNum>DispMax)||(BarDataMode==DynamicData))
; {
; //需要显示的Bar多于单屏可以显示的Bar,那么重新显示//08/29
; #else
; if(ItemNum>DispMax)
ldi R24,3
lds R2,_ItemNum
cp R24,R2
brlo X2
xjmp L48
X2:
; {
; //需要显示的Bar多于单屏可以显示的Bar,那么重新显示
; #endif
; #else
; }
; else if(ItemBack!=0)
; {
; if(ItemNum>DispMax)
; {
; //需要显示的Bar多于单屏可以显示的Bar,那么重新显示全部
; #endif
;
; Menu_j=Item ;
lds R10,_Item
; Menu_i=0 ;
clr R22
; //项是 Item 位置 0
; BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,1);
ldi R24,1
std y+2,R24
ldi R24,16
mul R24,R22
std y+0,R0
clr R18
ldi R24,2
mul R24,R10
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
; if(Menu_j==(ItemNum-1))
lds R24,_ItemNum
subi R24,1
cp R10,R24
brne L50
; {
; //维护Menu_j
; Menu_j=0 ;
clr R10
; }
xjmp L51
L50:
; else
; {
; Menu_j++;
inc R10
; }
L51:
; //显示其他项
; for(Menu_i=1;Menu_i<DispMax;Menu_i++)
ldi R22,1
xjmp L55
L52:
; {
; BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,0);
clr R2
std y+2,R2
ldi R24,16
mul R24,R22
std y+0,R0
clr R18
ldi R24,2
mul R24,R10
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
; if(Menu_j==(ItemNum-1))
lds R24,_ItemNum
subi R24,1
cp R10,R24
brne L56
; {
; Menu_j=0 ;
clr R10
; }
xjmp L57
L56:
; else
; {
; Menu_j++;
inc R10
; }
L57:
L53:
inc R22
L55:
cpi R22,3
brlo L52
; }
; Where=0 ;
clr R2
sts _Where,R2
; //当前位置依然在开头的0位置
; }
xjmp L49
L48:
; else
; {
; //单屏能显示完全部菜单项,"顶部 上移"应当跳转到底部(或者什么都不做)
; //当仅仅只有一项的时候,应当一直在Where=0的地方反显的!!!这里也能实现,因为最后是反显的函数
; Where=ItemNum-1 ;
lds R24,_ItemNum
subi R24,1
sts _Where,R24
; //取消顶部的原有的反显 项ItemBack 位置0
; BarDisp(*(DispItem+ItemBack),BarXOffset,0*BarYSize+BarYOffset,0);
clr R2
std y+2,R2
std y+0,R2
clr R18
ldi R24,2
mul R24,R20
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
; //反显根部 项Item 位置ItemNum-1
; 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
; //反显
; }
L49:
; #ifdef RockBack
; }
L45:
; #else
; }
; else
; {
; Item=ItemBack ;
; //Restore
; }
;
; #endif
;
; Bar(Item,ItemNum,125,120); //jjx //维护滚动条
ldi R24,120
std y+2,R24
ldi R24,125
std y+0,R24
lds R18,_ItemNum
lds R16,_Item
xcall _Bar
; Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
clr R18
ldi R24,<_FatherIndex-1
ldi R25,>_FatherIndex-1
lds R30,_Layer
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _Jump2Menu
L41:
adiw R28,3
xcall pop_gset3
.dbline 0 ; func end
ret
; ItemBack -> R20
; Menu_i -> R22
; Menu_j -> R10
.even
_BarMenuRight::
xcall push_gset3
sbiw R28,3
; }
;
;
; //Bar项菜单向右按键的行为
; //维护Bar显示
; void BarMenuRight(void)
; {
; INT8U Menu_i ;//计数变量 在菜单函数中用到
; INT8U Menu_j ;//计数变量
; INT8U ItemBack ;
;
; ItemBack=Item ;//---维护Item
lds R20,_Item
; if(Item==(ItemNum-1))
lds R24,_ItemNum
subi R24,1
cp R20,R24
brne L60
; {
; Item=0 ;
clr R2
sts _Item,R2
; }
xjmp L61
L60:
; else
; {
; Item++;
lds R24,_Item
subi R24,255 ; addi 1
sts _Item,R24
; }
L61:
;
; //---维护显示
; if(Where!=(DispMin-1))
lds R24,_DispMin
subi R24,1
lds R2,_Where
cp R2,R24
brne X3
xjmp L62
X3:
; {
; //当前位置不为最末,两次反显
; if (LessCPUUseage==TRUE)
lds R24,_LessCPUUseage
cpi R24,1
brne L64
; {
; GUI_SetEnFont(En_6x12);
clr R16
xcall _GUI_SetEnFont
; GUI_DispCharAt(' ',BarXOffset,(Where++)*BarYSize+BarYOffset);
lds R2,_Where
clr R3
mov R24,R2
subi R24,255 ; addi 1
sts _Where,R24
ldi R16,16
ldi R17,0
movw R18,R2
xcall empy16s
std y+0,R16
clr R18
ldi R16,32
xcall _GUI_DispCharAt
; GUI_DispCharAt('>',BarXOffset,Where*BarYSize+BarYOffset);
lds R2,_Where
ldi R24,16
mul R24,R2
std y+0,R0
clr R18
ldi R16,62
xcall _GUI_DispCharAt
; }
xjmp L63
L64:
; else
; {
; //原来位置取消反显 项是ItemBack 位置Where
; BarDisp(*(DispItem+ItemBack),BarXOffset,(Where++)*BarYSize+BarYOffset,0);
clr R2
std y+2,R2
lds R2,_Where
clr R3
mov R24,R2
subi R24,255 ; addi 1
sts _Where,R24
ldi R16,16
ldi R17,0
movw R18,R2
xcall empy16s
std y+0,R16
clr R18
ldi R24,2
mul R24,R20
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
; //下移后的位置反显 项是Item 位置Where+1(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
; //反显
; }
;
; #ifdef RockBack
; }
xjmp L63
L62:
; else
; {
; //当前位置为DispMax 底部 下移
; #ifdef DynamicBar
; if((ItemNum>DispMax)||(BarDataMode==DynamicData))
; {
; //需要显示的Bar多于单屏可以显示的Bar,那么重新显示//08/29
; #else
; if(ItemNum>DispMax)
ldi R24,3
lds R2,_ItemNum
cp R24,R2
brlo X4
xjmp L66
X4:
; {
; //需要显示的Bar多于单屏可以显示的Bar,那么重新显示
; #endif
; #else
; }
; else if(ItemBack!=(ItemNum-1))
; {
; //当前位置为DispMax 如果原来显示位置不是最后一项,则 底部 下移
; if(ItemNum>DispMax)
; {
; //需要显示的Bar多于单屏可以显示的Bar,那么重新显示
; #endif
; Menu_j=Item ;
lds R10,_Item
; Menu_i=DispMax ;
ldi R22,3
; //项是 Item 位置是 DispMax
; BarDisp(*(DispItem+Menu_j),BarXOffset,(Menu_i-1)*BarYSize+BarYOffset,1);
ldi R24,1
std y+2,R24
ldi R24,16
mul R24,R22
mov R24,R0
subi R24,16
std y+0,R24
clr R18
ldi R24,2
mul R24,R10
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
; if(Menu_j==0)
tst R10
brne L68
; {
; Menu_j=ItemNum-1 ;
lds R24,_ItemNum
subi R24,1
mov R10,R24
; }
xjmp L69
L68:
; else
; {
; Menu_j--;
dec R10
; }
L69:
; //显示其他项
; for(Menu_i=DispMax-1;Menu_i>0;Menu_i--)
ldi R22,2
xjmp L73
L70:
; {
; BarDisp(*(DispItem+Menu_j),BarXOffset,(Menu_i-1)*BarYSize+BarYOffset,0);
clr R2
std y+2,R2
ldi R24,16
mul R24,R22
mov R24,R0
subi R24,16
std y+0,R24
clr R18
ldi R24,2
mul R24,R10
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
; if(Menu_j==0)
tst R10
brne L74
; {
; Menu_j=ItemNum-1 ;
lds R24,_ItemNum
subi R24,1
mov R10,R24
; }
xjmp L75
L74:
; else
; {
; Menu_j--;
dec R10
; }
L75:
L71:
dec R22
L73:
clr R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -