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

📄 gui.s

📁 ICCAVR编写128*64液晶程序测试已经通过
💻 S
📖 第 1 页 / 共 5 页
字号:
	.module gui.c
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\12864-ICC\gui.c
	.dbfunc e GUI_HLine _GUI_HLine fV
;            bak -> R14
;          color -> R20
;             x1 -> R22,R23
;             y0 -> R10
;             x0 -> R12,R13
	.even
_GUI_HLine::
	xcall push_gset5
	mov R10,R18
	movw R12,R16
	sbiw R28,1
	ldd R22,y+11
	ldd R23,y+12
	ldd R20,y+13
	.dbline -1
	.dbline 23
; /****************************************************************************************
; * 文件名:GUI.C
; * 功能:GUI基本绘图函数。进行基本绘图运算,并调用相应的刷新程序更新LCD显示。
; * 作者:黄绍斌
; * 修改:冯建辉
; * 日期:2006.09.13
; * 备注:图形操作层,进行各种图形运算操作。
; ****************************************************************************************/
; #include "gui.h"
; #include <math.h>
; 
; /****************************************************************************
; * 名称:GUI_HLine()
; * 功能:画水平线。
; * 入口参数:x0		水平线起点所在列的位置
; *           y0		水平线起点所在行的位置
; *           x1          水平线终点所在列的位置
; *           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出缓冲区范围。
; ****************************************************************************/
; void  GUI_HLine(unsigned int x0, unsigned char y0, unsigned int x1, TCOLOR color)
; {
	.dbline 25
;     unsigned char  bak;
;     if(x0>x1) 				// 对x0、x1大小进行排列,以便画图
	cp R22,R12
	cpc R23,R13
	brsh L3
	.dbline 26
;     {
	.dbline 27
;         bak = x1;
	mov R14,R22
	.dbline 28
;         x1 = x0;
	movw R22,R12
	.dbline 29
;         x0 = bak;
	mov R12,R14
	clr R13
	.dbline 30
;     }   
L3:
L5:
	.dbline 32
;     do
;     {
	.dbline 33
;         GUI_Point(x0, y0, color);	// 逐点显示,描出垂直线
	std y+0,R20
	mov R18,R10
	mov R16,R12
	xcall _GUI_Point
	.dbline 34
;         x0++;
	movw R24,R12
	adiw R24,1
	movw R12,R24
	.dbline 35
;     }
L6:
	.dbline 36
;     while(x1>=x0);
	cp R22,R12
	cpc R23,R13
	brsh L5
	.dbline -2
L2:
	adiw R28,1
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r bak 14 c
	.dbsym r color 20 c
	.dbsym r x1 22 i
	.dbsym r y0 10 c
	.dbsym r x0 12 i
	.dbend
	.dbfunc e GUI_RLine _GUI_RLine fV
;            bak -> R14
;          color -> R20
;             y1 -> R22
;             y0 -> R10
;             x0 -> R12,R13
	.even
_GUI_RLine::
	xcall push_gset5
	mov R10,R18
	movw R12,R16
	sbiw R28,1
	ldd R22,y+11
	ldd R20,y+13
	.dbline -1
	.dbline 50
; }
; 
; /***********************************************************************
; * 名称:GUI_RLine()
; * 功能:画竖直线。根据硬件特点,实现加速。
; * 入口参数:x0		垂直线起点所在列的位置
; *           y0		垂直线起点所在行的位置
; *           y1          垂直线终点所在行的位置
; *           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
; * 出口参数:	无
; * 说明:操作失败原因是指定地址超出缓冲区范围。
; ***********************************************************************/
; void  GUI_RLine(unsigned int x0, unsigned char y0, unsigned char y1, TCOLOR color)
; {
	.dbline 52
;     unsigned char  bak;
;     if(y0>y1)                           // 对y0、y1大小进行排列,以便画图
	cp R22,R10
	brsh L9
	.dbline 53
;     {
	.dbline 54
;         bak = y1;
	mov R14,R22
	.dbline 55
;         y1 = y0;
	mov R22,R10
	.dbline 56
;         y0 = bak;
	mov R10,R14
	.dbline 57
;     }
L9:
L11:
	.dbline 59
;     do
;     {
	.dbline 60
;         GUI_Point(x0, y0, color);	// 逐点显示,描出垂直线
	std y+0,R20
	mov R18,R10
	mov R16,R12
	xcall _GUI_Point
	.dbline 61
;         y0++;
	inc R10
	.dbline 62
;     }
L12:
	.dbline 63
;     while(y1>=y0);
	cp R22,R10
	brsh L11
	.dbline -2
L8:
	adiw R28,1
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r bak 14 c
	.dbsym r color 20 c
	.dbsym r y1 22 c
	.dbsym r y0 10 c
	.dbsym r x0 12 i
	.dbend
	.dbfunc e GUI_Rectangle _GUI_Rectangle fV
;          color -> R22
;             y1 -> y+11
;             x1 -> y+9
;             y0 -> R20
;             x0 -> R10,R11
	.even
_GUI_Rectangle::
	xcall push_gset3
	mov R20,R18
	movw R10,R16
	sbiw R28,3
	ldd R22,y+13
	.dbline -1
	.dbline 78
; }
; 
; /****************************************************************************
; * 名称:GUI_Rectangle()
; * 功能:画矩形。
; * 入口参数:x0		矩形左上角的x坐标值
; *           y0		矩形左上角的y坐标值
; *           x1          矩形右下角的x坐标值
; *           y1          矩形右下角的y坐标值
; *           color	显示颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void  GUI_Rectangle(uint16 x0, uint8 y0, uint16 x1, uint8 y1, TCOLOR color)
; {
	.dbline 79
;    GUI_HLine(x0, y0, x1, color);
	std y+2,R22
	ldd R0,y+9
	ldd R1,y+10
	std y+1,R1
	std y+0,R0
	mov R18,R20
	movw R16,R10
	xcall _GUI_HLine
	.dbline 80
;    GUI_HLine(x0, y1, x1, color);
	std y+2,R22
	ldd R0,y+9
	ldd R1,y+10
	std y+1,R1
	std y+0,R0
	ldd R18,y+11
	movw R16,R10
	xcall _GUI_HLine
	.dbline 81
;    GUI_RLine(x0, y0, y1, color);
	std y+2,R22
	ldd R0,y+11
	std y+0,R0
	mov R18,R20
	movw R16,R10
	xcall _GUI_RLine
	.dbline 82
;    GUI_RLine(x1, y0, y1, color);
	std y+2,R22
	ldd R0,y+11
	std y+0,R0
	mov R18,R20
	ldd R16,y+9
	ldd R17,y+10
	xcall _GUI_RLine
	.dbline -2
L14:
	adiw R28,3
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r color 22 c
	.dbsym l y1 11 c
	.dbsym l x1 9 i
	.dbsym r y0 20 c
	.dbsym r x0 10 i
	.dbend
	.dbfunc e GUI_RectangleFill _GUI_RectangleFill fV
;              i -> y+3
;          color -> R20
;             y1 -> R22
;             x1 -> R10,R11
;             y0 -> R12
;             x0 -> R14,R15
	.even
_GUI_RectangleFill::
	xcall push_gset5
	mov R12,R18
	movw R14,R16
	sbiw R28,7
	ldd R10,y+17
	ldd R11,y+18
	ldd R22,y+19
	ldd R20,y+21
	.dbline -1
	.dbline 97
; }
; 
; /****************************************************************************
; * 名称:GUI_RectangleFill()
; * 功能:填充矩形。画一个填充的矩形,填充色与边框色一样。
; * 入口参数:x0		矩形左上角的x坐标值
; *           y0		矩形左上角的y坐标值
; *           x1          矩形右下角的x坐标值
; *           y1          矩形右下角的y坐标值
; *           color	填充颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void  GUI_RectangleFill(uint16 x0, uint8 y0, uint16 x1, uint8 y1, TCOLOR color)
; {
	.dbline 101
;    uint32  i;
; 
;    /* 先找出矩形左上角与右下角的两个点,保存在(x0,y0),(x1,y1) */
;    if(x0>x1) 						// 若x0>x1,则x0与x1交换
	cp R10,R14
	cpc R11,R15
	brsh L16
	.dbline 102
;    {
	.dbline 103
;       i = x0;
	movw R2,R14
	clr R4
	clr R5
	movw R30,R28
	std z+3,R2
	std z+4,R3
	std z+5,R4
	std z+6,R5
	.dbline 104
;       x0 = x1;
	movw R14,R10
	.dbline 105
;       x1 = i;
	movw R30,R28
	ldd R10,z+3
	ldd R11,z+4
	.dbline 106
;    }
L16:
	.dbline 107
;    if(y0>y1)						// 若y0>y1,则y0与y1交换
	cp R22,R12
	brsh L18
	.dbline 108
;    {
	.dbline 109
;       i = y0;
	mov R2,R12
	clr R3
	clr R4
	clr R5
	movw R30,R28
	std z+3,R2
	std z+4,R3
	std z+5,R4
	std z+6,R5
	.dbline 110
;       y0 = y1;
	mov R12,R22
	.dbline 111
;       y1 = i;
	movw R30,R28
	ldd R2,z+3
	ldd R3,z+4
	ldd R4,z+5
	ldd R5,z+6
	mov R22,R2
	.dbline 112
;    }
L18:
	.dbline 115
;    
;    /* 判断是否只是直线 */
;    if(y0==y1) 
	cp R12,R22
	brne L20
	.dbline 116
;    {
	.dbline 117
;       GUI_HLine(x0, y0, x1, color);
	std y+2,R20
	std y+1,R11
	std y+0,R10
	mov R18,R12
	movw R16,R14
	xcall _GUI_HLine
	.dbline 118
;       return;
	xjmp L15
L20:
	.dbline 120
;    }
;    if(x0==x1) 
	cp R14,R10
	cpc R15,R11
	brne L25
	.dbline 121
;    {
	.dbline 122
;       GUI_RLine(x0, y0, y1, color);
	std y+2,R20
	std y+0,R22
	mov R18,R12
	movw R16,R14
	xcall _GUI_RLine
	.dbline 123
;       return;
	xjmp L15
L24:
	.dbline 127
	.dbline 128
	std y+2,R20
	std y+1,R11
	std y+0,R10
	mov R18,R12
	movw R16,R14
	xcall _GUI_HLine
	.dbline 129
	inc R12
	.dbline 130
L25:
	.dbline 126
;    }
; 
;    while(y0<=y1)						
	cp R22,R12
	brsh L24
	.dbline -2
L15:
	adiw R28,7
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym l i 3 l
	.dbsym r color 20 c
	.dbsym r y1 22 c
	.dbsym r x1 10 i
	.dbsym r y0 12 c
	.dbsym r x0 14 i
	.dbend
	.dbfunc e GUI_Square _GUI_Square fV
;          color -> y+21
;           with -> y+17
;             y0 -> y+13
;             x0 -> y+9
	.even
_GUI_Square::
	xcall push_arg4
	xcall push_gset2
	sbiw R28,5
	.dbline -1
	.dbline 144
;    {
;       GUI_HLine(x0, y0, x1, color);	                        // 当前画水平线
;       y0++;							// 下一行
;    }
; }
; 
; /****************************************************************************
; * 名称:GUI_Square()
; * 功能:画正方形。
; * 入口参数:x0		正方形左上角的x坐标值
; *           y0		正方形左上角的y坐标值
; *           with        正方形的边长
; *           color	显示颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void  GUI_Square(uint32 x0, uint32 y0, uint32  with, TCOLOR  color)
; {
	.dbline 145
;    if(with==0)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+17
	ldd R3,z+18
	ldd R4,z+19
	ldd R5,z+20
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brne L28
	.dbline 146
;       return;
	xjmp L27
L28:
	.dbline 147
;    if( (x0+with) > GUI_LCM_XMAX )
	movw R30,R28
	ldd R2,z+17
	ldd R3,z+18
	ldd R4,z+19
	ldd R5,z+20
	movw R30,R28
	ldd R6,z+9
	ldd R7,z+10
	ldd R8,z+11
	ldd R9,z+12
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	ldi R20,128
	ldi R21,0
	ldi R22,0
	ldi R23,0
	cp R20,R6
	cpc R21,R7
	cpc R22,R8
	cpc R23,R9
	brsh L30
	.dbline 148
;       return;
	xjmp L27
L30:
	.dbline 149
;    if( (y0+with) > GUI_LCM_YMAX )
	movw R30,R28
	ldd R2,z+17
	ldd R3,z+18
	ldd R4,z+19
	ldd R5,z+20
	movw R30,R28
	ldd R6,z+13
	ldd R7,z+14
	ldd R8,z+15
	ldd R9,z+16
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	ldi R20,64
	ldi R21,0
	ldi R22,0
	ldi R23,0
	cp R20,R6
	cpc R21,R7
	cpc R22,R8
	cpc R23,R9
	brsh L32
	.dbline 150
;       return;
	xjmp L27
L32:
	.dbline 151
;    GUI_Rectangle(x0, y0, x0+with, y0+with, color);
	ldd R0,y+21
	std y+4,R0
	movw R30,R28
	ldd R2,z+17
	ldd R3,z+18
	ldd R4,z+19
	ldd R5,z+20
	movw R30,R28
	ldd R6,z+13
	ldd R7,z+14
	ldd R8,z+15
	ldd R9,z+16
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	std y+2,R6
	movw R30,R28
	ldd R2,z+17
	ldd R3,z+18
	movw R30,R28
	ldd R4,z+9
	ldd R5,z+10
	add R4,R2
	adc R5,R3
	std y+1,R5
	std y+0,R4
	movw R30,R28
	ldd R2,z+13
	ldd R3,z+14
	ldd R4,z+15
	ldd R5,z+16
	mov R18,R2
	movw R30,R28
	ldd R16,z+9
	ldd R17,z+10
	xcall _GUI_Rectangle
	.dbline -2
L27:
	adiw R28,5
	xcall pop_gset2
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l color 21 c
	.dbsym l with 17 l
	.dbsym l y0 13 l
	.dbsym l x0 9 l
	.dbend
	.dbfunc e GUI_Line _GUI_Line fV
;             dy -> y+19
;             dx -> y+15
;          dy_x2 -> y+11
;          dx_x2 -> y+7
;         dy_sym -> R10
;         dx_sym -> R12
;             di -> y+3
;          color -> R14
;             y1 -> y+45
;             x1 -> y+41
;             y0 -> y+37
;             x0 -> y+33
	.even
_GUI_Line::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,23
	ldd R14,y+49
	.dbline -1
	.dbline 168
; }
; 
; 
; 
; /****************************************************************************
; * 名称:GUI_Line()
; * 功能:画任意两点之间的直线。
; * 入口参数:x0		直线起点的x坐标值
; *           y0		直线起点的y坐标值
; *           x1          直线终点的x坐标值
; *           y1          直线终点的y坐标值
; *           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void  GUI_Line(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
; {
	.dbline 177
;    int32   dx;						// 直线x轴差值变量
;    int32   dy;          			        // 直线y轴差值变量
;    int8    dx_sym;					// x轴增长方向,为-1时减值方向,为1时增值方向
;    int8    dy_sym;					// y轴增长方向,为-1时减值方向,为1时增值方向
;    int32   dx_x2;					// dx*2值变量,用于加快运算速度
;    int32   dy_x2;					// dy*2值变量,用于加快运算速度
;    int32   di;						// 决策变量
; 
;    dx = x1-x0;						// 求取两点之间的差值
	movw R30,R28
	ldd R2,z+33
	ldd R3,z+34
	ldd R4,z+35
	ldd R5,z+36
	movw R30,R28
	ldd R6,z+41
	ldd R7,z+42
	ldd R8,z+43
	ldd R9,z+44
	sub R6,R2
	sbc R7,R3
	sbc R8,R4
	sbc R9,R5
	movw R30,R28
	std z+15,R6
	std z+16,R7
	std z+17,R8
	std z+18,R9
	.dbline 178
;    dy = y1-y0;
	movw R30,R28
	ldd R2,z+37
	ldd R3,z+38
	ldd R4,z+39
	ldd R5,z+40
	movw R30,R28
	ldd R6,z+45
	ldd R7,z+46
	ldd R8,z+47
	ldd R9,z+48
	sub R6,R2
	sbc R7,R3
	sbc R8,R4
	sbc R9,R5
	movw R30,R28
	std z+19,R6
	std z+20,R7
	std z+21,R8
	std z+22,R9
	.dbline 181
;    
;    /* 判断增长方向,或是否为水平线、垂直线、点 */
;    if(dx>0)						// 判断x轴方向
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+15
	ldd R3,z+16
	ldd R4,z+17
	ldd R5,z+18
	cp R20,R2
	cpc R21,R3
	cpc R22,R4
	cpc R23,R5
	brge L35
	.dbline 182
;    {
	.dbline 183
;       dx_sym = 1;					// dx>0,设置dx_sym=1
	clr R12
	inc R12
	.dbline 184
;    }
	xjmp L36
L35:
	.dbline 186
;    else
;    {
	.dbline 187
;       if(dx<0)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+15
	ldd R3,z+16
	ldd R4,z+17
	ldd R5,z+18
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brge L37
	.dbline 188
;       {
	.dbline 189
;          dx_sym = -1;				        // dx<0,设置dx_sym=-1
	ldi R24,255
	mov R12,R24
	.dbline 190
;       }
	xjmp L38
L37:
	.dbline 192
;       else
;       {  // dx==0,画垂直线,或一点
	.dbline 193
;          GUI_RLine(x0, y0, y1, color);
	std y+2,R14
	movw R30,R28
	ldd R2,z+45
	ldd R3,z+46
	ldd R4,z+47
	ldd R5,z+48
	std y+0,R2
	movw R30,R28
	ldd R2,z+37
	ldd R3,z+38
	ldd R4,z+39
	ldd R5,z+40
	mov R18,R2
	movw R30,R28
	ldd R16,z+33
	ldd R17,z+34
	xcall _GUI_RLine
	.dbline 194
;       	 return;
	xjmp L34
L38:
	.dbline 196
;       }
;    }
L36:
	.dbline 198
;    
;    if(dy>0)						// 判断y轴方向
	ldi R20,0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -