⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 windows.s

📁 ssd1325控制器液晶的驱动程序
💻 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 + -