📄 windows.s
字号:
.module windows.c
.area text(rom, con, rel)
.dbfile G:\IccPro\mega128_lcd\ZLG_GUI\windows.c
.dbfunc e GUI_WindowsDraw _GUI_WindowsDraw fc
; bak2 -> R20,R21
; bak1 -> R22,R23
; str -> R10,R11
; bak -> R12,R13
; win -> R14,R15
.even
_GUI_WindowsDraw::
xcall push_gset5
movw R14,R16
sbiw R28,5
.dbline -1
.dbline 18
; /****************************************************************************************
; * 文件名:WINDOW.C
; * 功能:窗口管理。将进行各种窗口的给制及窗口内部控制。
; * 作者:黄绍斌
; * 日期:2004.02.26
; * 备注:
; ****************************************************************************************/
; #include "config.h"
;
; #if GUI_WINDOW_EN==1
; /****************************************************************************
; * 名称:GUI_WindowsDraw()
; * 功能:显示窗口。根据提供的窗口参数进行画窗口。
; * 入口参数:win 窗口句柄
; * 出口参数:返回0表示操作失败,返回1表示操作成功
; ****************************************************************************/
; uint8 GUI_WindowsDraw(WINDOWS *win)
; { uint8 *str;
.dbline 22
movw R30,R14
ldd R24,z+4
ldd R25,z+5
cpi R24,20
ldi R30,0
cpc R25,R30
brlo L10
movw R30,R14
ldd R24,z+6
ldd R25,z+7
cpi R24,20
ldi R30,0
cpc R25,R30
brsh L8
L10:
.dbline 22
; int32 bak, bak1, bak2;
;
; /* 参数过滤,若窗口起出范围,则返回0 */
; if( ( (win->with)<20 ) || ( (win->hight)<20 ) ) return(0); // 宽度、高度检查,限制最小窗口
clr R16
xjmp L7
L8:
.dbline 23
; if( (win->x + win->with ) > GUI_LCM_XMAX ) return(0); // 窗口宽度是否溢出
movw R30,R14
ldd R2,z+4
ldd R3,z+5
movw R30,R14
ldd R4,z+0
ldd R5,z+1
add R4,R2
adc R5,R3
ldi R24,240
ldi R25,0
cp R24,R4
cpc R25,R5
brsh L11
.dbline 23
clr R16
xjmp L7
L11:
.dbline 24
; if( (win->y + win->hight ) > GUI_LCM_YMAX ) return(0); // 窗口高度是否溢出
movw R30,R14
ldd R2,z+6
ldd R3,z+7
movw R30,R14
ldd R4,z+2
ldd R5,z+3
add R4,R2
adc R5,R3
ldi R24,128
ldi R25,0
cp R24,R4
cpc R25,R5
brsh L13
.dbline 24
clr R16
xjmp L7
L13:
.dbline 27
;
; /* 开始画窗口 */
; GUI_RectangleFill(win->x, win->y, win->x + win->with - 1, win->y + win->hight - 1, back_color);
lds R2,_back_color
std y+4,R2
movw R30,R14
ldd R2,z+2
ldd R3,z+3
movw R30,R14
ldd R4,z+6
ldd R5,z+7
movw R24,R2
add R24,R4
adc R25,R5
sbiw R24,1
std y+3,R25
std y+2,R24
movw R30,R14
ldd R4,z+0
ldd R5,z+1
ldd R6,z+4
ldd R7,z+5
movw R24,R4
add R24,R6
adc R25,R7
sbiw R24,1
std y+1,R25
std y+0,R24
movw R18,R2
movw R16,R4
xcall _GUI_RectangleFill
.dbline 28
; GUI_Rectangle(win->x, win->y, win->x + win->with - 1, win->y + win->hight - 1, disp_color); // 画窗口
lds R2,_disp_color
std y+4,R2
movw R30,R14
ldd R2,z+2
ldd R3,z+3
movw R30,R14
ldd R4,z+6
ldd R5,z+7
movw R24,R2
add R24,R4
adc R25,R5
sbiw R24,1
std y+3,R25
std y+2,R24
movw R30,R14
ldd R4,z+0
ldd R5,z+1
ldd R6,z+4
ldd R7,z+5
movw R24,R4
add R24,R6
adc R25,R7
sbiw R24,1
std y+1,R25
std y+0,R24
movw R18,R2
movw R16,R4
xcall _GUI_Rectangle
.dbline 29
; GUI_HLine(win->x, win->y + 12, win->x + win->with - 1, disp_color); // 画标题目栏
lds R2,_disp_color
std y+2,R2
movw R30,R14
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,R14
ldd R18,z+2
ldd R19,z+3
subi R18,244 ; offset = 12
sbci R19,255
movw R16,R2
xcall _GUI_HLine
.dbline 30
; GUI_RLine(win->x + 12, win->y, win->y + 12, disp_color); // 画关闭窗号按钮
lds R2,_disp_color
std y+2,R2
movw R30,R14
ldd R2,z+2
ldd R3,z+3
movw R24,R2
adiw R24,12
std y+1,R25
std y+0,R24
movw R18,R2
movw R30,R14
ldd R16,z+0
ldd R17,z+1
subi R16,244 ; offset = 12
sbci R17,255
xcall _GUI_RLine
.dbline 31
; GUI_Line(win->x, win->y, win->x + 12, win->y + 12, disp_color);
lds R2,_disp_color
std y+4,R2
movw R30,R14
ldd R2,z+2
ldd R3,z+3
movw R24,R2
adiw R24,12
std y+3,R25
std y+2,R24
movw R30,R14
ldd R4,z+0
ldd R5,z+1
movw R24,R4
adiw R24,12
std y+1,R25
std y+0,R24
movw R18,R2
movw R16,R4
xcall _GUI_Line
.dbline 32
; GUI_Line(win->x + 12, win->y, win->x, win->y + 12, disp_color);
lds R2,_disp_color
std y+4,R2
movw R30,R14
ldd R2,z+2
ldd R3,z+3
movw R24,R2
adiw R24,12
std y+3,R25
std y+2,R24
movw R30,R14
ldd R4,z+0
ldd R5,z+1
std y+1,R5
std y+0,R4
movw R18,R2
movw R16,R4
subi R16,244 ; offset = 12
sbci R17,255
xcall _GUI_Line
.dbline 36
;
;
; /* 写标题 */
; if( win->title != NULL )
movw R30,R14
ldd R2,z+8
ldd R3,z+9
tst R2
brne X0
tst R3
brne X2
xjmp L15
X2:
X0:
.dbline 37
; { str = win->title;
.dbline 37
movw R30,R14
ldd R10,z+8
ldd R11,z+9
.dbline 38
; bak = win->x + 15;
movw R30,R14
ldd R24,z+0
ldd R25,z+1
adiw R24,15
movw R12,R24
.dbline 39
; bak1 = win->y + 3;
ldd R22,z+2
ldd R23,z+3
subi R22,253 ; offset = 3
sbci R23,255
.dbline 40
; bak2 = win->x + win->with -1;
movw R30,R14
ldd R2,z+4
ldd R3,z+5
movw R30,R14
ldd R20,z+0
ldd R21,z+1
add R20,R2
adc R21,R3
subi R20,1
sbci R21,0
xjmp L18
L17:
.dbline 43
;
; while(1)
; { if( (bak+8) > bak2 ) break; // 判断标题是否溢出
.dbline 43
movw R24,R12
adiw R24,8
cp R20,R24
cpc R21,R25
brge L20
.dbline 43
xjmp L19
L20:
.dbline 44
; if(*str=='\0') break; // 判断字符串是否结束
movw R30,R10
ldd R2,z+0
tst R2
brne L22
.dbline 44
xjmp L19
L22:
.dbline 46
movw R30,R10
ld R2,Z+
movw R10,R30
std y+0,R2
movw R18,R22
movw R16,R12
xcall _GUI_PutChar
.dbline 47
movw R24,R12
adiw R24,6
movw R12,R24
.dbline 48
L18:
.dbline 42
xjmp L17
L19:
.dbline 49
;
; GUI_PutChar(bak, bak1, *str++); // 显示标题
; bak += 6;
; }
; }
L15:
.dbline 53
;
;
; /* 写状态栏 */
; if( win->state != NULL )
movw R30,R14
ldd R2,z+10
ldd R3,z+11
tst R2
brne X1
tst R3
brne X3
xjmp L24
X3:
X1:
.dbline 54
; { if( win->hight < 60) return(0); // 判断是否可以画状态栏
.dbline 54
movw R30,R14
ldd R24,z+6
ldd R25,z+7
cpi R24,60
ldi R30,0
cpc R25,R30
brsh L26
.dbline 54
clr R16
xjmp L7
L26:
.dbline 56
; /* 画状态栏 */
; GUI_HLine(win->x, win->y + win->hight - 11, win->x + win->with - 1, disp_color);
lds R2,_disp_color
std y+2,R2
movw R30,R14
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,R14
ldd R4,z+6
ldd R5,z+7
movw R30,R14
ldd R18,z+2
ldd R19,z+3
add R18,R4
adc R19,R5
subi R18,11
sbci R19,0
movw R16,R2
xcall _GUI_HLine
.dbline 58
;
; str = win->state;
movw R30,R14
ldd R10,z+10
ldd R11,z+11
.dbline 59
; bak = win->x + 3;
movw R30,R14
ldd R24,z+0
ldd R25,z+1
adiw R24,3
movw R12,R24
.dbline 60
; bak1 = win->y + win->hight - 9;
ldd R2,z+6
ldd R3,z+7
movw R30,R14
ldd R22,z+2
ldd R23,z+3
add R22,R2
adc R23,R3
subi R22,9
sbci R23,0
.dbline 61
; bak2 = win->x + win->with -1;
movw R30,R14
ldd R2,z+4
ldd R3,z+5
movw R30,R14
ldd R20,z+0
ldd R21,z+1
add R20,R2
adc R21,R3
subi R20,1
sbci R21,0
xjmp L29
L28:
.dbline 64
;
; while(1)
; { if( (bak+8) > bak2 ) break; // 判断标题是否溢出
.dbline 64
movw R24,R12
adiw R24,8
cp R20,R24
cpc R21,R25
brge L31
.dbline 64
xjmp L30
L31:
.dbline 65
; if(*str=='\0') break; // 判断字符串是否结束
movw R30,R10
ldd R2,z+0
tst R2
brne L33
.dbline 65
xjmp L30
L33:
.dbline 67
movw R30,R10
ld R2,Z+
movw R10,R30
std y+0,R2
movw R18,R22
movw R16,R12
xcall _GUI_PutChar
.dbline 68
movw R24,R12
adiw R24,6
movw R12,R24
.dbline 69
L29:
.dbline 63
xjmp L28
L30:
.dbline 70
;
; GUI_PutChar(bak, bak1, *str++); // 显示标题
; bak += 6;
; }
; }
L24:
.dbline 72
;
; return(1);
ldi R16,1
.dbline -2
L7:
adiw R28,5
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r bak2 20 I
.dbsym r bak1 22 I
.dbsym r str 10 pc
.dbsym r bak 12 I
.dbsym r win 14 pX
.dbend
.dbfunc e GUI_WindowsHide _GUI_WindowsHide fc
; win -> R20,R21
.even
_GUI_WindowsHide::
xcall push_gset1
movw R20,R16
sbiw R28,5
.dbline -1
.dbline 84
;
; }
;
;
; /****************************************************************************
; * 名称:GUI_WindowsHide()
; * 功能:消隐窗口。
; * 入口参数:win 窗口句柄
; * 出口参数:返回0表示操作失败,返回1表示操作成功
; ****************************************************************************/
; uint8 GUI_WindowsHide(WINDOWS *win)
; { /* 参数过滤,若窗口起出范围,则返回0 */
.dbline 85
movw R30,R20
ldd R24,z+4
ldd R25,z+5
cpi R24,20
ldi R30,0
cpc R25,R30
brlo L38
movw R30,R20
ldd R24,z+6
ldd R25,z+7
cpi R24,20
ldi R30,0
cpc R25,R30
brsh L36
L38:
.dbline 85
; if( ( (win->with)<20 ) || ( (win->hight)<20 ) ) return(0); // 宽度、高度检查,限制最小窗口
clr R16
xjmp L35
L36:
.dbline 86
; if( (win->x + win->with ) > GUI_LCM_XMAX ) return(0); // 窗口宽度是否溢出
movw R30,R20
ldd R2,z+4
ldd R3,z+5
movw R30,R20
ldd R4,z+0
ldd R5,z+1
add R4,R2
adc R5,R3
ldi R24,240
ldi R25,0
cp R24,R4
cpc R25,R5
brsh L39
.dbline 86
clr R16
xjmp L35
L39:
.dbline 87
; if( (win->y + win->hight ) > GUI_LCM_YMAX ) return(0); // 窗口高度是否溢出
movw R30,R20
ldd R2,z+6
ldd R3,z+7
movw R30,R20
ldd R4,z+2
ldd R5,z+3
add R4,R2
adc R5,R3
ldi R24,128
ldi R25,0
cp R24,R4
cpc R25,R5
brsh L41
.dbline 87
clr R16
xjmp L35
L41:
.dbline 90
;
; /* 消隐窗口 */
; GUI_RectangleFill(win->x, win->y, win->x + win->with - 1, win->y + win->hight - 1, back_color);
lds R2,_back_color
std y+4,R2
movw R30,R20
ldd R2,z+2
ldd R3,z+3
movw R30,R20
ldd R4,z+6
ldd R5,z+7
movw R24,R2
add R24,R4
adc R25,R5
sbiw R24,1
std y+3,R25
std y+2,R24
movw R30,R20
ldd R4,z+0
ldd R5,z+1
ldd R6,z+4
ldd R7,z+5
movw R24,R4
add R24,R6
adc R25,R7
sbiw R24,1
std y+1,R25
std y+0,R24
movw R18,R2
movw R16,R4
xcall _GUI_RectangleFill
.dbline 91
; return(1);
ldi R16,1
.dbline -2
L35:
adiw R28,5
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r win 20 pX
.dbend
.dbfunc e GUI_WindowsClr _GUI_WindowsClr fV
; x1 -> R10
; y0 -> R22
; x0 -> R20
; y1 -> R12
; win -> R14,R15
.even
_GUI_WindowsClr::
xcall push_gset5
movw R14,R16
sbiw R28,5
.dbline -1
.dbline 104
; }
;
;
;
; /****************************************************************************
; * 名称:GUI_WindowsClr()
; * 功能:清屏窗口。
; * 入口参数:win 窗口句柄
; * 出口参数:无
; * 说明:使用此函数前要先使用GUI_WindowsDraw()将窗口画出。
; ****************************************************************************/
; void GUI_WindowsClr(WINDOWS *win)
; { uint8 x0, y0;
.dbline 108
; uint8 x1, y1;
;
; /* 设置要清屏的区域 */
; x0 = win->x + 1;
movw R30,R14
ldd R20,z+0
subi R20,255 ; offset = 1
sbci R21,255
.dbline 109
; x1 = win->x + win->with - 2;
ldd R2,z+4
ldd R3,z+5
movw R30,R14
ldd R24,z+0
ldd R25,z+1
add R24,R2
adc R25,R3
sbiw R24,2
mov R10,R24
.dbline 110
; y0 = win->y + 13;
ldd R22,z+2
subi R22,243 ; offset = 13
sbci R23,255
.dbline 111
; y1 = win->y + win->hight - 2;
movw R30,R14
ldd R2,z+6
ldd R3,z+7
movw R30,R14
ldd R24,z+2
ldd R25,z+3
add R24,R2
adc R25,R3
sbiw R24,2
mov R12,R24
.dbline 112
; if( win->state != NULL ) // 判断是否有状态栏
movw R30,R14
ldd R2,z+10
ldd R3,z+11
tst R2
brne X4
tst R3
breq L44
X4:
.dbline 113
; { if( win->hight >= 60)
.dbline 113
movw R30,R14
ldd R24,z+6
ldd R25,z+7
cpi R24,60
ldi R30,0
cpc R25,R30
brlo L46
.dbline 114
; { y1 = win->y + win->hight - 12;
.dbline 114
movw R30,R14
ldd R2,z+6
ldd R3,z+7
movw R30,R14
ldd R24,z+2
ldd R25,z+3
add R24,R2
adc R25,R3
sbiw R24,12
mov R12,R24
.dbline 115
; }
L46:
.dbline 116
; }
L44:
.dbline 119
;
; /* 使用填充矩形实现清屏 */
; GUI_RectangleFill(x0, y0, x1, y1, back_color);
lds R2,_back_color
std y+4,R2
mov R2,R12
clr R3
std y+3,R3
std y+2,R2
mov R2,R10
clr R3
std y+1,R3
std y+0,R2
mov R18,R22
clr R19
mov R16,R20
clr R17
xcall _GUI_RectangleFill
.dbline -2
L43:
adiw R28,5
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r x1 10 c
.dbsym r y0 22 c
.dbsym r x0 20 c
.dbsym r y1 12 c
.dbsym r win 14 pX
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -