📄 menu.s
字号:
.module menu.c
.area text(rom, con, rel)
.dbfile G:\IccPro\mega128_lcd\ZLG_GUI\menu.c
.dbfunc e GUI_MMenuDraw _GUI_MMenuDraw fc
; i -> R20
; xx -> R22
; mwin -> R10,R11
; men -> R12,R13
.even
_GUI_MMenuDraw::
xcall push_gset4
movw R12,R16
sbiw R28,3
.dbline -1
.dbline 19
; /****************************************************************************************
; * 文件名:MENU.C
; * 功能:菜单显示及操作(下拉式菜单)。
; * 作者:黄绍斌
; * 日期:2004.02.26
; * 备注:使用GUI_SetBackColor()函数设置显示颜色及背景色。
; ****************************************************************************************/
; #include "config.h"
;
;
; #if GUI_MenuDown_EN==1
; /****************************************************************************
; * 名称:GUI_MMenuDraw()
; * 功能:显示主菜单,加上边框。
; * 入口参数:men 主菜单句柄
; * 出口参数:返回0表示操作失败,返回1表示操作成功
; ****************************************************************************/
; uint8 GUI_MMenuDraw(MMENU *men)
; { WINDOWS *mwin;
.dbline 24
; uint8 i;
; uint8 xx;
;
; /* 参数过滤 */
; if( (men->no)==0 ) return(0);
movw R30,R12
ldd R2,z+2
tst R2
brne L8
.dbline 24
clr R16
xjmp L7
L8:
.dbline 26
;
; mwin = men->win; // 取得窗口句柄
movw R30,R12
ldd R10,z+0
ldd R11,z+1
.dbline 28
; /* 判断是否可以显示主菜单 */
; if( (mwin->hight)<50 ) return(0);
movw R30,R10
ldd R24,z+6
ldd R25,z+7
cpi R24,50
ldi R30,0
cpc R25,R30
brsh L10
.dbline 28
clr R16
xjmp L7
L10:
.dbline 29
; if( (mwin->with)<50 ) return(0);
movw R30,R10
ldd R24,z+4
ldd R25,z+5
cpi R24,50
ldi R30,0
cpc R25,R30
brsh L12
.dbline 29
clr R16
xjmp L7
L12:
.dbline 32
;
; /* 画菜单条,并显示菜主单 */
; GUI_HLine(mwin->x, mwin->y + 22, mwin->x + mwin->with - 1, disp_color);
lds R2,_disp_color
std y+2,R2
movw R30,R10
ldd R2,z+0
ldd R3,z+1
ldd R4,z+4
ldd R5,z+5
movw R24,R2
add R24,R4
adc R25,R5
sbiw R24,1
std y+1,R25
std y+0,R24
movw R30,R10
ldd R18,z+2
ldd R19,z+3
subi R18,234 ; offset = 22
sbci R19,255
movw R16,R2
xcall _GUI_HLine
.dbline 34
;
; xx = mwin->x;
movw R30,R10
ldd R22,z+0
.dbline 35
; for(i=0; i<(men->no); i++)
clr R20
xjmp L17
L14:
.dbline 36
; { if( (xx+MMENU_WIDTH) > (mwin->x + mwin->with) ) return(0);
.dbline 36
movw R30,R10
ldd R2,z+4
ldd R3,z+5
movw R30,R10
ldd R4,z+0
ldd R5,z+1
add R4,R2
adc R5,R3
mov R24,R22
clr R25
adiw R24,34
cp R4,R24
cpc R5,R25
brsh L18
.dbline 36
clr R16
xjmp L7
L18:
.dbline 38
ldi R24,4
std y+2,R24
ldi R24,2
mul R24,R20
movw R30,R0
movw R24,R12
adiw R24,3
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
std y+1,R3
std y+0,R2
movw R30,R10
ldd R18,z+2
ldd R19,z+3
subi R18,242 ; offset = 14
sbci R19,255
mov R16,R22
clr R17
subi R16,254 ; offset = 2
sbci R17,255
xcall _GUI_PutNoStr
.dbline 39
subi R22,222 ; addi 34
.dbline 40
lds R2,_disp_color
std y+2,R2
movw R30,R10
ldd R2,z+2
ldd R3,z+3
movw R24,R2
adiw R24,22
std y+1,R25
std y+0,R24
movw R18,R2
subi R18,244 ; offset = 12
sbci R19,255
mov R16,R22
clr R17
xcall _GUI_RLine
.dbline 41
L15:
.dbline 35
inc R20
L17:
.dbline 35
movw R30,R12
ldd R2,z+2
cp R20,R2
brsh X0
xjmp L14
X0:
.dbline 43
;
; GUI_PutNoStr(xx+2, mwin->y + 14, men->str[i], 4); // 书写主菜单文字
; xx += MMENU_WIDTH;
; GUI_RLine(xx, mwin->y + 12, mwin->y + 22, disp_color); // 显示主菜单分界线
; }
;
; return(1);
ldi R16,1
.dbline -2
L7:
adiw R28,3
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r xx 22 c
.dbsym r mwin 10 pX
.dbsym r men 12 pX
.dbend
.dbfunc e GUI_MMenuSelect _GUI_MMenuSelect fV
; xx -> R20
; mwin -> R22,R23
; no -> R20
; men -> R22,R23
.even
_GUI_MMenuSelect::
xcall push_gset2
mov R20,R18
movw R22,R16
sbiw R28,3
.dbline -1
.dbline 55
; }
;
;
; /****************************************************************************
; * 名称:GUI_MMenuSelect()
; * 功能:当前主菜单,加下划线,表示当前主菜单。
; * 入口参数:men 主菜单句柄
; * no 所选的主菜单项
; * 出口参数:无
; ****************************************************************************/
; void GUI_MMenuSelect(MMENU *men, uint8 no)
; { WINDOWS *mwin;
.dbline 59
; uint8 xx;
;
; /* 参数过滤 */
; if( (men->no)==0 ) return;
movw R30,R22
ldd R2,z+2
tst R2
brne L21
.dbline 59
xjmp L20
L21:
.dbline 60
; if( no>(men->no) ) return;
movw R30,R22
ldd R2,z+2
cp R2,R20
brsh L23
.dbline 60
xjmp L20
L23:
.dbline 62
;
; mwin = men->win; // 取得窗口句柄
movw R30,R22
ldd R22,z+0
ldd R23,z+1
.dbline 64
; /* 判断是否可以显示主菜单 */
; if( (mwin->hight)<50 ) return;
movw R30,R22
ldd R24,z+6
ldd R25,z+7
cpi R24,50
ldi R30,0
cpc R25,R30
brsh L25
.dbline 64
xjmp L20
L25:
.dbline 65
; if( (mwin->with)<50 ) return;
movw R30,R22
ldd R24,z+4
ldd R25,z+5
cpi R24,50
ldi R30,0
cpc R25,R30
brsh L27
.dbline 65
xjmp L20
L27:
.dbline 68
;
; /* 显示下划线 */
; xx = mwin->x + no*MMENU_WIDTH;
ldi R24,34
mul R24,R20
movw R30,R22
ldd R20,z+0
add R20,R0
adc R21,R1
.dbline 69
; GUI_HLine(xx+1, mwin->y + 22-1, xx+MMENU_WIDTH- 1, disp_color);
lds R2,_disp_color
std y+2,R2
mov R24,R20
clr R25
adiw R24,34
sbiw R24,1
std y+1,R25
std y+0,R24
ldd R18,z+2
ldd R19,z+3
subi R18,234 ; offset = 22
sbci R19,255
subi R18,1
sbci R19,0
mov R16,R20
clr R17
subi R16,255 ; offset = 1
sbci R17,255
xcall _GUI_HLine
.dbline -2
L20:
adiw R28,3
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r xx 20 c
.dbsym r mwin 22 pX
.dbsym r no 20 c
.dbsym r men 22 pX
.dbend
.dbfunc e GUI_MMenuNSelect _GUI_MMenuNSelect fV
; xx -> R20
; mwin -> R22,R23
; no -> R20
; men -> R22,R23
.even
_GUI_MMenuNSelect::
xcall push_gset2
mov R20,R18
movw R22,R16
sbiw R28,3
.dbline -1
.dbline 81
; }
;
;
; /****************************************************************************
; * 名称:GUI_MMenuNSelect()
; * 功能:取消当前主菜单,去除下划线。
; * 入口参数:men 主菜单句柄
; * no 所选的主菜单项
; * 出口参数:无
; ****************************************************************************/
; void GUI_MMenuNSelect(MMENU *men, uint8 no)
; { WINDOWS *mwin;
.dbline 85
; uint8 xx;
;
; /* 参数过滤 */
; if( (men->no)==0 ) return;
movw R30,R22
ldd R2,z+2
tst R2
brne L30
.dbline 85
xjmp L29
L30:
.dbline 86
; if( no>(men->no) ) return;
movw R30,R22
ldd R2,z+2
cp R2,R20
brsh L32
.dbline 86
xjmp L29
L32:
.dbline 88
;
; mwin = men->win; // 取得窗口句柄
movw R30,R22
ldd R22,z+0
ldd R23,z+1
.dbline 90
; /* 判断是否可以显示主菜单 */
; if( (mwin->hight)<50 ) return;
movw R30,R22
ldd R24,z+6
ldd R25,z+7
cpi R24,50
ldi R30,0
cpc R25,R30
brsh L34
.dbline 90
xjmp L29
L34:
.dbline 91
; if( (mwin->with)<50 ) return;
movw R30,R22
ldd R24,z+4
ldd R25,z+5
cpi R24,50
ldi R30,0
cpc R25,R30
brsh L36
.dbline 91
xjmp L29
L36:
.dbline 94
;
; /* 显示下划线 */
; xx = mwin->x + no*MMENU_WIDTH;
ldi R24,34
mul R24,R20
movw R30,R22
ldd R20,z+0
add R20,R0
adc R21,R1
.dbline 95
; GUI_HLine(xx+1, mwin->y + 22-1, xx+MMENU_WIDTH- 1, back_color);
lds R2,_back_color
std y+2,R2
mov R24,R20
clr R25
adiw R24,34
sbiw R24,1
std y+1,R25
std y+0,R24
ldd R18,z+2
ldd R19,z+3
subi R18,234 ; offset = 22
sbci R19,255
subi R18,1
sbci R19,0
mov R16,R20
clr R17
subi R16,255 ; offset = 1
sbci R17,255
xcall _GUI_HLine
.dbline -2
L29:
adiw R28,3
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r xx 20 c
.dbsym r mwin 22 pX
.dbsym r no 20 c
.dbsym r men 22 pX
.dbend
.dbfunc e GUI_SMenuDraw _GUI_SMenuDraw fc
; mwin -> R22,R23
; xx -> R20,R21
; i -> R22
; yy -> R10,R11
; men -> R12,R13
.even
_GUI_SMenuDraw::
xcall push_gset4
movw R12,R16
sbiw R28,5
.dbline -1
.dbline 107
; }
;
;
;
; /****************************************************************************
; * 名称:GUI_SMenuDraw()
; * 功能:显示子菜单,加上边框。
; * 入口参数:men 子菜单句柄
; * 出口参数:返回0表示操作失败,返回1表示操作成功
; ****************************************************************************/
; uint8 GUI_SMenuDraw(SMENU *men)
; { WINDOWS *mwin;
.dbline 111
; uint32 xx, yy;
; uint8 i;
;
; mwin = men->win;
movw R30,R12
ldd R22,z+0
ldd R23,z+1
.dbline 113
; /* 判断是否可以显示主菜单 */
; if( (mwin->hight)<50 ) return(0);
movw R30,R22
ldd R24,z+6
ldd R25,z+7
cpi R24,50
ldi R30,0
cpc R25,R30
brsh L39
.dbline 113
clr R16
xjmp L38
L39:
.dbline 114
; if( (mwin->with)<50 ) return(0);
movw R30,R22
ldd R24,z+4
ldd R25,z+5
cpi R24,50
ldi R30,0
cpc R25,R30
brsh L41
.dbline 114
clr R16
xjmp L38
L41:
.dbline 117
;
; /* 画菜子单项。下拉子菜单,以向左下拉为原则,若右边溢出则以右下拉显示 */
; xx = mwin->x;
movw R30,R22
ldd R20,z+0
ldd R21,z+1
.dbline 118
; xx += (men->mmenu_no)*MMENU_WIDTH;
movw R30,R12
ldd R2,z+2
ldi R24,34
mul R24,R2
add R20,R0
adc R21,R1
.dbline 119
; yy = mwin->y + 22;
movw R30,R22
ldd R24,z+2
ldd R25,z+3
adiw R24,22
movw R10,R24
.dbline 120
; yy += (men->no) * 11 + 2;
movw R30,R12
ldd R2,z+3
ldi R24,11
mul R24,R2
movw R24,R0
adiw R24,2
add R10,R24
adc R11,R25
.dbline 121
; if( (xx+SMENU_WIDTH) <= (mwin->x + mwin->with - 1) )
movw R30,R22
ldd R2,z+4
ldd R3,z+5
movw R30,R22
ldd R24,z+0
ldd R25,z+1
add R24,R2
adc R25,R3
sbiw R24,1
movw R30,R20
subi R30,190 ; offset = 66
sbci R31,255
cp R24,R30
cpc R25,R31
brsh X1
xjmp L43
X1:
.dbline 122
; { /* 以左下拉为原则显示子菜单 */
.dbline 123
; if( (men->mmenu_no) == 0 )
movw R30,R12
ldd R2,z+2
tst R2
brne L45
.dbline 124
; { GUI_RLine(xx+SMENU_WIDTH, mwin->y + 22, yy, disp_color);
.dbline 124
lds R2,_disp_color
std y+2,R2
std y+1,R11
std y+0,R10
movw R30,R22
ldd R18,z+2
ldd R19,z+3
subi R18,234 ; offset = 22
sbci R19,255
movw R16,R20
subi R16,190 ; offset = 66
sbci R17,255
xcall _GUI_RLine
.dbline 125
; GUI_HLine(xx, yy, xx+SMENU_WIDTH, disp_color);
lds R2,_disp_color
std y+2,R2
movw R24,R20
subi R24,190 ; offset = 66
sbci R25,255
std y+1,R25
std y+0,R24
movw R18,R10
movw R16,R20
xcall _GUI_HLine
.dbline 126
; }
xjmp L46
L45:
.dbline 128
; else
; { GUI_Rectangle(xx, mwin->y + 22, xx+SMENU_WIDTH, yy, disp_color);
.dbline 128
lds R2,_disp_color
std y+4,R2
std y+3,R11
std y+2,R10
movw R24,R20
subi R24,190 ; offset = 66
sbci R25,255
std y+1,R25
std y+0,R24
movw R30,R22
ldd R18,z+2
ldd R19,z+3
subi R18,234 ; offset = 22
sbci R19,255
movw R16,R20
xcall _GUI_Rectangle
.dbline 129
; }
L46:
.dbline 130
; GUI_HLine(xx+1, mwin->y + 22, xx+MMENU_WIDTH-1, back_color);
lds R2,_back_color
std y+2,R2
movw R24,R20
adiw R24,34
sbiw R24,1
std y+1,R25
std y+0,R24
movw R30,R22
ldd R18,z+2
ldd R19,z+3
subi R18,234 ; offset = 22
sbci R19,255
movw R16,R20
subi R16,255 ; offset = 1
sbci R17,255
xcall _GUI_HLine
.dbline 132
;
; }
xjmp L44
L43:
.dbline 134
; else
; { /* 以右下拉为原则 */
.dbline 135
; if( (xx+MMENU_WIDTH) == (mwin->x + mwin->with - 1) )
movw R30,R22
ldd R2,z+4
ldd R3,z+5
movw R30,R22
ldd R24,z+0
ldd R25,z+1
add R24,R2
adc R25,R3
sbiw R24,1
movw R30,R20
adiw R30,34
cp R30,R24
cpc R31,R25
brne L47
.dbline 136
; { GUI_RLine(xx-(SMENU_WIDTH-MMENU_WIDTH), mwin->y + 22, yy, disp_color);
.dbline 136
lds R2,_disp_color
std y+2,R2
std y+1,R11
std y+0,R10
movw R30,R22
ldd R18,z+2
ldd R19,z+3
subi R18,234 ; offset = 22
sbci R19,255
movw R16,R20
subi R16,32
sbci R17,0
xcall _GUI_RLine
.dbline 137
; GUI_HLine(xx-(SMENU_WIDTH-MMENU_WIDTH), yy, xx+MMENU_WIDTH, disp_color);
lds R2,_disp_color
std y+2,R2
movw R24,R20
adiw R24,34
std y+1,R25
std y+0,R24
movw R18,R10
movw R16,R20
subi R16,32
sbci R17,0
xcall _GUI_HLine
.dbline 139
;
; }
xjmp L48
L47:
.dbline 141
; else
; { GUI_Rectangle(xx-(SMENU_WIDTH-MMENU_WIDTH), mwin->y + 22, xx+MMENU_WIDTH, yy, disp_color);
.dbline 141
lds R2,_disp_color
std y+4,R2
std y+3,R11
std y+2,R10
movw R24,R20
adiw R24,34
std y+1,R25
std y+0,R24
movw R30,R22
ldd R18,z+2
ldd R19,z+3
subi R18,234 ; offset = 22
sbci R19,255
movw R16,R20
subi R16,32
sbci R17,0
xcall _GUI_Rectangle
.dbline 142
; }
L48:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -