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

📄 gui_basic.s

📁 ssd1325控制器液晶的驱动程序
💻 S
📖 第 1 页 / 共 5 页
字号:
	.module GUI_BASIC.C
	.area text(rom, con, rel)
	.dbfile G:\IccPro\mega128_lcd\ZLG_GUI\GUI_BASIC.C
	.dbfunc e GUI_Rectangle _GUI_Rectangle fV
;          color -> R22
;             y1 -> y+11
;             x1 -> y+9
;             y0 -> R20,R21
;             x0 -> R10,R11
	.even
_GUI_Rectangle::
	xcall push_gset3
	movw R20,R18
	movw R10,R16
	sbiw R28,3
	ldd R22,y+13
	.dbline -1
	.dbline 24
; /****************************************************************************************
; * 文件名:GUI_BASIC.C
; * 功能:GUI基本绘图函数。进行基本绘图运算,并调用相应的刷新程序更新LCD显示。
; * 作者:黄绍斌
; * 日期:2004.02.26
; * 备注:图形操作层,进行各种图形运算操作。
; ****************************************************************************************/
; #include "config.h"
; #include <math.h>
; 
; 
; /****************************************************************************
; * 名称:GUI_Rectangle()
; * 功能:画矩形。
; * 入口参数: x0		矩形左上角的x坐标值
; *           y0		矩形左上角的y坐标值
; *           x1      矩形右下角的x坐标值
; *           y1      矩形右下角的y坐标值
; *           color	显示颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void  GUI_Rectangle(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
; {  GUI_HLine(x0, y0, x1, color);
	.dbline 24
	std y+2,R22
	ldd R0,y+9
	ldd R1,y+10
	std y+1,R1
	std y+0,R0
	movw R18,R20
	movw R16,R10
	xcall _GUI_HLine
	.dbline 25
;    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
	ldd R19,y+12
	movw R16,R10
	xcall _GUI_HLine
	.dbline 26
;    GUI_RLine(x0, y0, y1, color);
	std y+2,R22
	ldd R0,y+11
	ldd R1,y+12
	std y+1,R1
	std y+0,R0
	movw R18,R20
	movw R16,R10
	xcall _GUI_RLine
	.dbline 27
;    GUI_RLine(x1, y0, y1, color);
	std y+2,R22
	ldd R0,y+11
	ldd R1,y+12
	std y+1,R1
	std y+0,R0
	movw R18,R20
	ldd R16,y+9
	ldd R17,y+10
	xcall _GUI_RLine
	.dbline -2
L7:
	adiw R28,3
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r color 22 c
	.dbsym l y1 11 i
	.dbsym l x1 9 i
	.dbsym r y0 20 i
	.dbsym r x0 10 i
	.dbend
	.dbfunc e GUI_RectangleFill _GUI_RectangleFill fV
;              i -> R14,R15
;          color -> R20
;             y1 -> R22,R23
;             x1 -> R10,R11
;             y0 -> R12,R13
;             x0 -> y+13
	.even
_GUI_RectangleFill::
	xcall push_arg4
	xcall push_gset5
	movw R12,R18
	sbiw R28,3
	ldd R10,y+17
	ldd R11,y+18
	ldd R22,y+19
	ldd R23,y+20
	ldd R20,y+21
	.dbline -1
	.dbline 43
; }
; 
; 
; /****************************************************************************
; * 名称:GUI_RectangleFill()
; * 功能:填充矩形。画一个填充的矩形,填充色与边框色一样。
; * 入口参数: x0		矩形左上角的x坐标值
; *           y0		矩形左上角的y坐标值
; *           x1      矩形右下角的x坐标值
; *           y1      矩形右下角的y坐标值
; *           color	填充颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void  GUI_RectangleFill(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
; {  uint32  i;
	.dbline 46
; 
;    /* 先找出矩形左上角与右下角的两个点,保存在(x0,y0),(x1,y1) */
;    if(x0>x1) 						// 若x0>x1,则x0与x1交换
	ldd R0,y+13
	ldd R1,y+14
	cp R10,R0
	cpc R11,R1
	brsh L9
	.dbline 47
;    {  i = x0;
	.dbline 47
	movw R14,R0
	.dbline 48
;       x0 = x1;
	std y+14,R11
	std y+13,R10
	.dbline 49
;       x1 = i;
	movw R10,R14
	.dbline 50
;    }
L9:
	.dbline 51
;    if(y0>y1)						// 若y0>y1,则y0与y1交换
	cp R22,R12
	cpc R23,R13
	brsh L11
	.dbline 52
;    {  i = y0;
	.dbline 52
	movw R14,R12
	.dbline 53
;       y0 = y1;
	movw R12,R22
	.dbline 54
;       y1 = i;
	movw R22,R14
	.dbline 55
;    }
L11:
	.dbline 58
;    
;    /* 判断是否只是直线 */
;    if(y0==y1) 
	cp R12,R22
	cpc R13,R23
	brne L13
	.dbline 59
;    {  GUI_HLine(x0, y0, x1, color);
	.dbline 59
	std y+2,R20
	std y+1,R11
	std y+0,R10
	movw R18,R12
	ldd R16,y+13
	ldd R17,y+14
	xcall _GUI_HLine
	.dbline 60
;       return;
	xjmp L8
L13:
	.dbline 62
;    }
;    if(x0==x1) 
	ldd R0,y+13
	ldd R1,y+14
	cp R0,R10
	cpc R1,R11
	brne L18
	.dbline 63
;    {  GUI_RLine(x0, y0, y1, color);
	.dbline 63
	std y+2,R20
	std y+1,R23
	std y+0,R22
	movw R18,R12
	movw R16,R0
	xcall _GUI_RLine
	.dbline 64
;       return;
	xjmp L8
L17:
	.dbline 68
	.dbline 68
	std y+2,R20
	std y+1,R11
	std y+0,R10
	movw R18,R12
	ldd R16,y+13
	ldd R17,y+14
	xcall _GUI_HLine
	.dbline 69
	movw R24,R12
	adiw R24,1
	movw R12,R24
	.dbline 70
L18:
	.dbline 67
;    }
; 
;    while(y0<=y1)						
	cp R22,R12
	cpc R23,R13
	brsh L17
	.dbline -2
L8:
	adiw R28,3
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r i 14 i
	.dbsym r color 20 c
	.dbsym r y1 22 i
	.dbsym r x1 10 i
	.dbsym r y0 12 i
	.dbsym l x0 13 i
	.dbend
	.dbfunc e GUI_Square _GUI_Square fV
;          color -> y+13
;           with -> R10,R11
;             y0 -> R22,R23
;             x0 -> R20,R21
	.even
_GUI_Square::
	xcall push_gset3
	movw R22,R18
	movw R20,R16
	sbiw R28,5
	ldd R10,y+11
	ldd R11,y+12
	.dbline -1
	.dbline 85
;    {  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)
; {   if(with==0) return;
	.dbline 85
	tst R10
	brne L21
	tst R11
	brne L21
X0:
	.dbline 85
	xjmp L20
L21:
	.dbline 86
; 	if( (x0+with) > GUI_LCM_XMAX ) return;
	movw R2,R20
	add R2,R10
	adc R3,R11
	ldi R24,240
	ldi R25,0
	cp R24,R2
	cpc R25,R3
	brsh L23
	.dbline 86
	xjmp L20
L23:
	.dbline 87
; 	if( (y0+with) > GUI_LCM_YMAX ) return;
	movw R2,R22
	add R2,R10
	adc R3,R11
	ldi R24,128
	ldi R25,0
	cp R24,R2
	cpc R25,R3
	brsh L25
	.dbline 87
	xjmp L20
L25:
	.dbline 88
; 	GUI_Rectangle(x0, y0, x0+with, y0+with, color);
	ldd R0,y+13
	std y+4,R0
	movw R2,R22
	add R2,R10
	adc R3,R11
	std y+3,R3
	std y+2,R2
	movw R2,R20
	add R2,R10
	adc R3,R11
	std y+1,R3
	std y+0,R2
	movw R18,R22
	movw R16,R20
	xcall _GUI_Rectangle
	.dbline -2
L20:
	adiw R28,5
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym l color 13 c
	.dbsym r with 10 i
	.dbsym r y0 22 i
	.dbsym r x0 20 i
	.dbend
	.dbfunc e GUI_Line _GUI_Line fV
;             dy -> y+5
;             dx -> y+3
;          dy_x2 -> R20,R21
;          dx_x2 -> R22,R23
;         dy_sym -> R10
;         dx_sym -> R12
;             di -> R14,R15
;          color -> y+25
;             y1 -> y+23
;             x1 -> y+21
;             y0 -> y+19
;             x0 -> y+17
	.even
_GUI_Line::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,7
	.dbline -1
	.dbline 105
; }
; 
; 
; 
; /****************************************************************************
; * 名称: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)
; {  int32   dx;						// 直线x轴差值变量
	.dbline 114
;    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;						// 求取两点之间的差值
	ldd R2,y+21
	ldd R3,y+22
	ldd R0,y+17
	ldd R1,y+18
	sub R2,R0
	sbc R3,R1
	std y+4,R3
	std y+3,R2
	.dbline 115
;    dy = y1-y0;
	ldd R2,y+23
	ldd R3,y+24
	ldd R0,y+19
	ldd R1,y+20
	sub R2,R0
	sbc R3,R1
	std y+6,R3
	std y+5,R2
	.dbline 118
;    
;    /* 判断增长方向,或是否为水平线、垂直线、点 */
;    if(dx>0)							// 判断x轴方向
	clr R2
	clr R3
	ldd R4,y+3
	ldd R5,y+4
	cp R2,R4
	cpc R3,R5
	brge L28
	.dbline 119
;    {  dx_sym = 1;					// dx>0,设置dx_sym=1
	.dbline 119
	clr R12
	inc R12
	.dbline 120
;    }
	xjmp L29
L28:
	.dbline 122
;    else
;    {  if(dx<0)
	.dbline 122
	ldd R24,y+3
	ldd R25,y+4
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge L30
	.dbline 123
;       {  dx_sym = -1;				// dx<0,设置dx_sym=-1
	.dbline 123
	ldi R24,255
	mov R12,R24
	.dbline 124
;       }
	xjmp L31
L30:
	.dbline 126
;       else
;       {  // dx==0,画垂直线,或一点
	.dbline 127
;          GUI_RLine(x0, y0, y1, color);
	ldd R0,y+25
	std y+2,R0
	ldd R0,y+23
	ldd R1,y+24
	std y+1,R1
	std y+0,R0
	ldd R18,y+19
	ldd R19,y+20
	ldd R16,y+17
	ldd R17,y+18
	xcall _GUI_RLine
	.dbline 128
;       	 return;
	xjmp L27
L31:
	.dbline 130
;       }
;    }
L29:
	.dbline 132
;    
;    if(dy>0)							// 判断y轴方向
	clr R2
	clr R3
	ldd R4,y+5
	ldd R5,y+6
	cp R2,R4
	cpc R3,R5
	brge L32
	.dbline 133
;    {  dy_sym = 1;					// dy>0,设置dy_sym=1
	.dbline 133
	clr R10
	inc R10
	.dbline 134
;    }
	xjmp L33
L32:
	.dbline 136
;    else
;    {  if(dy<0)
	.dbline 136
	ldd R24,y+5
	ldd R25,y+6
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge L34
	.dbline 137
;       {  dy_sym = -1;				// dy<0,设置dy_sym=-1
	.dbline 137
	ldi R24,255
	mov R10,R24
	.dbline 138
;       }
	xjmp L35
L34:
	.dbline 140
;       else
;       {  // dy==0,画水平线,或一点
	.dbline 141
;          GUI_HLine(x0, y0, x1, color);
	ldd R0,y+25
	std y+2,R0
	ldd R0,y+21
	ldd R1,y+22
	std y+1,R1
	std y+0,R0
	ldd R18,y+19
	ldd R19,y+20
	ldd R16,y+17
	ldd R17,y+18
	xcall _GUI_HLine
	.dbline 142
;       	 return;
	xjmp L27
L35:
	.dbline 144
;       }
;    }
L33:
	.dbline 147
;     
;    /* 将dx、dy取绝对值 */
;    dx = dx_sym * dx;
	ldd R18,y+3
	ldd R19,y+4
	mov R16,R12
	clr R17
	sbrc R16,7
	com R17
	xcall empy16s
	std y+4,R17
	std y+3,R16
	.dbline 148
;    dy = dy_sym * dy;
	ldd R18,y+5
	ldd R19,y+6
	mov R16,R10
	clr R17
	sbrc R16,7
	com R17
	xcall empy16s
	std y+6,R17
	std y+5,R16
	.dbline 151
;  
;    /* 计算2倍的dx及dy值 */
;    dx_x2 = dx*2;
	ldd R18,y+3
	ldd R19,y+4
	ldi R16,2
	ldi R17,0
	xcall empy16s
	movw R22,R16
	.dbline 152
;    dy_x2 = dy*2;
	ldd R18,y+5
	ldd R19,y+6
	ldi R16,2
	ldi R17,0
	xcall empy16s
	movw R20,R16
	.dbline 155
;    
;    /* 使用Bresenham法进行画直线 */
;    if(dx>=dy)						// 对于dx>=dy,则使用x轴为基准
	ldd R2,y+5
	ldd R3,y+6
	ldd R4,y+3
	ldd R5,y+4
	cp R4,R2
	cpc R5,R3
	brge X1
	xjmp L36
X1:
	.dbline 156
;    {  di = dy_x2 - dx;
	.dbline 156
	movw R14,R20
	sub R14,R4
	sbc R15,R5
	xjmp L39
L38:
	.dbline 158
;       while(x0!=x1)
;       {  GUI_Point(x0, y0, color);
	.dbline 158
	ldd R0,y+25
	std y+0,R0
	ldd R18,y+19
	ldd R19,y+20
	ldd R16,y+17
	ldd R17,y+18
	xcall _GUI_Point
	.dbline 159
;          x0 += dx_sym;
	mov R2,R12
	clr R3
	sbrc R2,7
	com R3
	ldd R0,y+17
	ldd R1,y+18
	add R0,R2
	adc R1,R3
	std y+18,R1
	std y+17,R0
	.dbline 160
;          if(di<0)
	movw R24,R14
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge L41
	.dbline 161
;          {  di += dy_x2;			// 计算出下一步的决策值
	.dbline 161
	add R14,R20
	adc R15,R21
	.dbline 162
;          }
	xjmp L42
L41:
	.dbline 164
;          else
;          {  di += dy_x2 - dx_x2;
	.dbline 164
	movw R2,R20
	sub R2,R22
	sbc R3,R23
	add R14,R2
	adc R15,R3
	.dbline 165
;             y0 += dy_sym;
	mov R2,R10
	clr R3
	sbrc R2,7
	com R3
	ldd R0,y+19
	ldd R1,y+20
	add R0,R2
	adc R1,R3
	std y+20,R1
	std y+19,R0
	.dbline 166
;          }
L42:
	.dbline 167
L39:
	.dbline 157
	ldd R0,y+17
	ldd R1,y+18
	ldd R16,y+21
	ldd R17,y+22
	cp R0,R16
	cpc R1,R17
	brne L38
	.dbline 168
;       }
;       GUI_Point(x0, y0, color);		// 显示最后一点
	ldd R0,y+25
	std y+0,R0
	ldd R18,y+19
	ldd R19,y+20
	ldd R16,y+17
	ldd R17,y+18
	xcall _GUI_Point
	.dbline 169
;    }
	xjmp L37
L36:
	.dbline 171
;    else								// 对于dx<dy,则使用y轴为基准
;    {  di = dx_x2 - dy;
	.dbline 171
	ldd R2,y+5
	ldd R3,y+6
	movw R14,R22
	sub R14,R2
	sbc R15,R3
	xjmp L44
L43:
	.dbline 173
;       while(y0!=y1)
;       {  GUI_Point(x0, y0, color);
	.dbline 173
	ldd R0,y+25
	std y+0,R0
	ldd R18,y+19
	ldd R19,y+20
	ldd R16,y+17
	ldd R17,y+18
	xcall _GUI_Point
	.dbline 174
;          y0 += dy_sym;
	mov R2,R10
	clr R3
	sbrc R2,7
	com R3
	ldd R0,y+19
	ldd R1,y+20
	add R0,R2
	adc R1,R3
	std y+20,R1
	std y+19,R0
	.dbline 175
;          if(di<0)
	movw R24,R14
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge L46
	.dbline 176
;          {  di += dx_x2;
	.dbline 176
	add R14,R22
	adc R15,R23
	.dbline 177
;          }
	xjmp L47
L46:
	.dbline 179
;          else
;          {  di += dx_x2 - dy_x2;

⌨️ 快捷键说明

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