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

📄 gui.s

📁 ICCAVR编写128*64液晶程序测试已经通过
💻 S
📖 第 1 页 / 共 5 页
字号:
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+19
	ldd R3,z+20
	ldd R4,z+21
	ldd R5,z+22
	cp R20,R2
	cpc R21,R3
	cpc R22,R4
	cpc R23,R5
	brge L39
	.dbline 199
;    {
	.dbline 200
;       dy_sym = 1;					// dy>0,设置dy_sym=1
	clr R10
	inc R10
	.dbline 201
;    }
	xjmp L40
L39:
	.dbline 203
;    else
;    {
	.dbline 204
;       if(dy<0)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+19
	ldd R3,z+20
	ldd R4,z+21
	ldd R5,z+22
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brge L41
	.dbline 205
;       {
	.dbline 206
;          dy_sym = -1;				        // dy<0,设置dy_sym=-1
	ldi R24,255
	mov R10,R24
	.dbline 207
;       }
	xjmp L42
L41:
	.dbline 209
;       else
;       {  // dy==0,画水平线,或一点
	.dbline 210
;          GUI_HLine(x0, y0, x1, color);
	std y+2,R14
	movw R30,R28
	ldd R2,z+41
	ldd R3,z+42
	std y+1,R3
	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_HLine
	.dbline 211
;       	 return;
	xjmp L34
L42:
	.dbline 213
;       }
;    }
L40:
	.dbline 216
;     
;    /* 将dx、dy取绝对值 */
;    dx = dx_sym * dx;
	movw R30,R28
	ldd R2,z+15
	ldd R3,z+16
	ldd R4,z+17
	ldd R5,z+18
	mov R6,R12
	clr R7
	sbrc R6,7
	com R7
	clr R8
	sbrc R7,7
	com R8
	clr R9
	sbrc R8,7
	com R9
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall empy32s
	movw R30,R28
	std z+15,R16
	std z+16,R17
	std z+17,R18
	std z+18,R19
	.dbline 217
;    dy = dy_sym * dy;
	movw R30,R28
	ldd R2,z+19
	ldd R3,z+20
	ldd R4,z+21
	ldd R5,z+22
	mov R6,R10
	clr R7
	sbrc R6,7
	com R7
	clr R8
	sbrc R7,7
	com R8
	clr R9
	sbrc R8,7
	com R9
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall empy32s
	movw R30,R28
	std z+19,R16
	std z+20,R17
	std z+21,R18
	std z+22,R19
	.dbline 220
;  
;    /* 计算2倍的dx及dy值 */
;    dx_x2 = dx*2;
	movw R30,R28
	ldd R2,z+15
	ldd R3,z+16
	ldd R4,z+17
	ldd R5,z+18
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32s
	movw R30,R28
	std z+7,R16
	std z+8,R17
	std z+9,R18
	std z+10,R19
	.dbline 221
;    dy_x2 = dy*2;
	movw R30,R28
	ldd R2,z+19
	ldd R3,z+20
	ldd R4,z+21
	ldd R5,z+22
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32s
	movw R30,R28
	std z+11,R16
	std z+12,R17
	std z+13,R18
	std z+14,R19
	.dbline 224
;    
;    /* 使用Bresenham法进行画直线 */
;    if(dx>=dy)						// 对于dx>=dy,则使用x轴为基准
	movw R30,R28
	ldd R2,z+19
	ldd R3,z+20
	ldd R4,z+21
	ldd R5,z+22
	movw R30,R28
	ldd R6,z+15
	ldd R7,z+16
	ldd R8,z+17
	ldd R9,z+18
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brge X0
	xjmp L43
X0:
	.dbline 225
;    {
	.dbline 226
;       di = dy_x2 - dx;
	movw R30,R28
	ldd R2,z+15
	ldd R3,z+16
	ldd R4,z+17
	ldd R5,z+18
	movw R30,R28
	ldd R6,z+11
	ldd R7,z+12
	ldd R8,z+13
	ldd R9,z+14
	sub R6,R2
	sbc R7,R3
	sbc R8,R4
	sbc R9,R5
	movw R30,R28
	std z+3,R6
	std z+4,R7
	std z+5,R8
	std z+6,R9
	xjmp L46
L45:
	.dbline 228
;       while(x0!=x1)
;       {
	.dbline 229
;          GUI_Point(x0, y0, color);
	std y+0,R14
	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
	xcall _GUI_Point
	.dbline 230
;          x0 += dx_sym;
	mov R2,R12
	clr R3
	sbrc R2,7
	com R3
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	movw R30,R28
	ldd R6,z+33
	ldd R7,z+34
	ldd R8,z+35
	ldd R9,z+36
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+33,R6
	std z+34,R7
	std z+35,R8
	std z+36,R9
	.dbline 231
;          if(di<0)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+3
	ldd R3,z+4
	ldd R4,z+5
	ldd R5,z+6
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brge L48
	.dbline 232
;          {
	.dbline 233
;             di += dy_x2;			        // 计算出下一步的决策值
	movw R30,R28
	ldd R2,z+11
	ldd R3,z+12
	ldd R4,z+13
	ldd R5,z+14
	movw R30,R28
	ldd R6,z+3
	ldd R7,z+4
	ldd R8,z+5
	ldd R9,z+6
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+3,R6
	std z+4,R7
	std z+5,R8
	std z+6,R9
	.dbline 234
;          }
	xjmp L49
L48:
	.dbline 236
;          else
;          {
	.dbline 237
;             di += dy_x2 - dx_x2;
	movw R30,R28
	ldd R2,z+7
	ldd R3,z+8
	ldd R4,z+9
	ldd R5,z+10
	movw R30,R28
	ldd R6,z+11
	ldd R7,z+12
	ldd R8,z+13
	ldd R9,z+14
	sub R6,R2
	sbc R7,R3
	sbc R8,R4
	sbc R9,R5
	movw R30,R28
	ldd R2,z+3
	ldd R3,z+4
	ldd R4,z+5
	ldd R5,z+6
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R30,R28
	std z+3,R2
	std z+4,R3
	std z+5,R4
	std z+6,R5
	.dbline 238
;             y0 += dy_sym;
	mov R2,R10
	clr R3
	sbrc R2,7
	com R3
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	movw R30,R28
	ldd R6,z+37
	ldd R7,z+38
	ldd R8,z+39
	ldd R9,z+40
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+37,R6
	std z+38,R7
	std z+39,R8
	std z+40,R9
	.dbline 239
;          }
L49:
	.dbline 240
L46:
	.dbline 227
	movw R30,R28
	ldd R2,z+41
	ldd R3,z+42
	ldd R4,z+43
	ldd R5,z+44
	movw R30,R28
	ldd R6,z+33
	ldd R7,z+34
	ldd R8,z+35
	ldd R9,z+36
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	breq X1
	xjmp L45
X1:
	.dbline 241
;       }
;       GUI_Point(x0, y0, color);		                // 显示最后一点
	std y+0,R14
	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
	xcall _GUI_Point
	.dbline 242
;    }
	xjmp L44
L43:
	.dbline 244
;    else							// 对于dx<dy,则使用y轴为基准
;    {
	.dbline 245
;       di = dx_x2 - dy;
	movw R30,R28
	ldd R2,z+19
	ldd R3,z+20
	ldd R4,z+21
	ldd R5,z+22
	movw R30,R28
	ldd R6,z+7
	ldd R7,z+8
	ldd R8,z+9
	ldd R9,z+10
	sub R6,R2
	sbc R7,R3
	sbc R8,R4
	sbc R9,R5
	movw R30,R28
	std z+3,R6
	std z+4,R7
	std z+5,R8
	std z+6,R9
	xjmp L51
L50:
	.dbline 247
;       while(y0!=y1)
;       {
	.dbline 248
;          GUI_Point(x0, y0, color);
	std y+0,R14
	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
	xcall _GUI_Point
	.dbline 249
;          y0 += dy_sym;
	mov R2,R10
	clr R3
	sbrc R2,7
	com R3
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	movw R30,R28
	ldd R6,z+37
	ldd R7,z+38
	ldd R8,z+39
	ldd R9,z+40
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+37,R6
	std z+38,R7
	std z+39,R8
	std z+40,R9
	.dbline 250
;          if(di<0)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+3
	ldd R3,z+4
	ldd R4,z+5
	ldd R5,z+6
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brge L53
	.dbline 251
;          {
	.dbline 252
;             di += dx_x2;
	movw R30,R28
	ldd R2,z+7
	ldd R3,z+8
	ldd R4,z+9
	ldd R5,z+10
	movw R30,R28
	ldd R6,z+3
	ldd R7,z+4
	ldd R8,z+5
	ldd R9,z+6
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+3,R6
	std z+4,R7
	std z+5,R8
	std z+6,R9
	.dbline 253
;          }
	xjmp L54
L53:
	.dbline 255
;          else
;          {
	.dbline 256
;             di += dx_x2 - dy_x2;
	movw R30,R28
	ldd R2,z+11
	ldd R3,z+12
	ldd R4,z+13
	ldd R5,z+14
	movw R30,R28
	ldd R6,z+7
	ldd R7,z+8
	ldd R8,z+9
	ldd R9,z+10
	sub R6,R2
	sbc R7,R3
	sbc R8,R4
	sbc R9,R5
	movw R30,R28
	ldd R2,z+3
	ldd R3,z+4
	ldd R4,z+5
	ldd R5,z+6
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R30,R28
	std z+3,R2
	std z+4,R3
	std z+5,R4
	std z+6,R5
	.dbline 257
;             x0 += dx_sym;
	mov R2,R12
	clr R3
	sbrc R2,7
	com R3
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	movw R30,R28
	ldd R6,z+33
	ldd R7,z+34
	ldd R8,z+35
	ldd R9,z+36
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+33,R6
	std z+34,R7
	std z+35,R8
	std z+36,R9
	.dbline 258
;          }
L54:
	.dbline 259
L51:
	.dbline 246
	movw R30,R28
	ldd R2,z+45
	ldd R3,z+46
	ldd R4,z+47
	ldd R5,z+48
	movw R30,R28
	ldd R6,z+37
	ldd R7,z+38
	ldd R8,z+39
	ldd R9,z+40
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	breq X2
	xjmp L50
X2:
	.dbline 260
	std y+0,R14
	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
	xcall _GUI_Point
	.dbline 261
L44:
	.dbline -2
L34:
	adiw R28,23
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l dy 19 L
	.dbsym l dx 15 L
	.dbsym l dy_x2 11 L
	.dbsym l dx_x2 7 L
	.dbsym r dy_sym 10 C
	.dbsym r dx_sym 12 C
	.dbsym l di 3 L
	.dbsym r color 14 c
	.dbsym l y1 45 l
	.dbsym l x1 41 l
	.dbsym l y0 37 l
	.dbsym l x0 33 l
	.dbend
	.dbfunc e GUI_LineS _GUI_LineS fV
;              i -> R20
;             y0 -> y+25
;             x0 -> y+21
;             y1 -> y+17
;             x1 -> y+13
;          color -> R22
;             no -> R10
;         points -> R12,R13
	.even
_GUI_LineS::
	xcall push_gset4
	mov R10,R18
	movw R12,R16
	sbiw R28,29
	ldd R22,y+37
	.dbline -1
	.dbline 438
;       }
;       GUI_Point(x0, y0, color);		// 显示最后一点
;    }
; }
; 
; 
; #if	GUI_LineWith_EN==1
; /****************************************************************************
; * 名称:GUI_LineWith()
; * 功能:画任意两点之间的直线,并且可设置线的宽度。
; * 入口参数:x0		直线起点的x坐标值
; *           y0		直线起点的y坐标值
; *           x1          直线终点的x坐标值
; *           y1          直线终点的y坐标值
; *           with        线宽(0-50)
; *           color	显示颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void  GUI_LineWith(uint32 x0, uint32 y0, uint32 x1, uint32 y1, uint8 with, TCOLOR color)
; {
;    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;						// 决策变量
;    
;    int32   wx, wy;					// 线宽变量
;    int32   draw_a, draw_b;
;    
;    /* 参数过滤 */
;    if(with==0)
;       return;
;    if(with>50)
;       with = 50;
;    
;    dx = x1-x0;						// 求取两点之间的差值
;    dy = y1-y0;
;    
;    wx = with/2;
;    wy = with-wx-1;
;    
;    /* 判断增长方向,或是否为水平线、垂直线、点 */
;    if(dx>0)						// 判断x轴方向
;    {
;       dx_sym = 1;					// dx>0,设置dx_sym=1
;    }
;    else
;    {
;       if(dx<0)
;       {
;          dx_sym = -1;				        // dx<0,设置dx_sym=-1
;       }
;       else
;       {  /* dx==0,画垂直线,或一点 */
;          wx = x0-wx;
;          if(wx<0)
;             wx = 0;
;          wy = x0+wy;
;          
;          while(1)
;          {
;             x0 = wx;
;             GUI_RLine(x0, y0, y1, color);
;             if(wx>=wy)
;                break;
;             wx++;
;          }
;       	 return;
;       }
;    }
;    
;    if(dy>0)						// 判断y轴方向
;    {
;       dy_sym = 1;					// dy>0,设置dy_sym=1
;    }
;    else
;    {
;       if(dy<0)
;       {
;          dy_sym = -1;				        // dy<0,设置dy_sym=-1
;       }
;       else
;       {  /* dy==0,画水平线,或一点 */
;          wx = y0-wx;
;          if(wx<0) wx = 0;
;          wy = y0+wy;
;          
;          while(1)
;          {
;             y0 = wx;
;             GUI_HLine(x0, y0, x1, color);
;             if(wx>=wy)
;                break;
;             wx++;
;          }
;       	 return;
;       }
;    }
;     

⌨️ 快捷键说明

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