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

📄 gui_basic.s

📁 ssd1325控制器液晶的驱动程序
💻 S
📖 第 1 页 / 共 5 页
字号:
	.dbline 179
	movw R2,R22
	sub R2,R20
	sbc R3,R21
	add R14,R2
	adc R15,R3
	.dbline 180
;             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 181
;          }
L47:
	.dbline 182
L44:
	.dbline 172
	ldd R0,y+19
	ldd R1,y+20
	ldd R16,y+23
	ldd R17,y+24
	cp R0,R16
	cpc R1,R17
	brne L43
	.dbline 183
	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 184
L37:
	.dbline -2
L27:
	adiw R28,7
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l dy 5 I
	.dbsym l dx 3 I
	.dbsym r dy_x2 20 I
	.dbsym r dx_x2 22 I
	.dbsym r dy_sym 10 C
	.dbsym r dx_sym 12 C
	.dbsym r di 14 I
	.dbsym l color 25 c
	.dbsym l y1 23 i
	.dbsym l x1 21 i
	.dbsym l y0 19 i
	.dbsym l x0 17 i
	.dbend
	.dbfunc e GUI_LineWith _GUI_LineWith fV
;             dy -> y+11
;             dx -> y+9
;          dy_x2 -> y+7
;          dx_x2 -> y+5
;         dy_sym -> R14
;         dx_sym -> R22
;             wy -> y+3
;             di -> R12,R13
;         draw_b -> R10,R11
;             wx -> R6,R7
;         draw_a -> R20,R21
;          color -> y+33
;           with -> R20
;             y1 -> y+29
;             x1 -> y+27
;             y0 -> y+25
;             x0 -> y+23
	.even
_GUI_LineWith::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,13
	ldd R20,y+31
	.dbline -1
	.dbline 203
;       }
;       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轴差值变量
	.dbline 215
;    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;
	tst R20
	brne L49
	.dbline 215
	xjmp L48
L49:
	.dbline 216
;    if(with>50) with = 50;
	ldi R24,50
	cp R24,R20
	brsh L51
	.dbline 216
	ldi R20,50
L51:
	.dbline 218
;    
;    dx = x1-x0;						// 求取两点之间的差值
	ldd R2,y+27
	ldd R3,y+28
	ldd R0,y+23
	ldd R1,y+24
	sub R2,R0
	sbc R3,R1
	std y+10,R3
	std y+9,R2
	.dbline 219
;    dy = y1-y0;
	ldd R2,y+29
	ldd R3,y+30
	ldd R0,y+25
	ldd R1,y+26
	sub R2,R0
	sbc R3,R1
	std y+12,R3
	std y+11,R2
	.dbline 221
;    
;    wx = with/2;
	ldi R18,2
	ldi R19,0
	mov R16,R20
	clr R17
	xcall div16s
	movw R6,R16
	.dbline 222
;    wy = with-wx-1;
	mov R24,R20
	clr R25
	sub R24,R16
	sbc R25,R17
	sbiw R24,1
	std y+4,R25
	std y+3,R24
	.dbline 225
;    
;    /* 判断增长方向,或是否为水平线、垂直线、点 */
;    if(dx>0)							// 判断x轴方向
	clr R2
	clr R3
	ldd R4,y+9
	ldd R5,y+10
	cp R2,R4
	cpc R3,R5
	brge L53
	.dbline 226
;    {  dx_sym = 1;					// dx>0,设置dx_sym=1
	.dbline 226
	ldi R22,1
	.dbline 227
;    }
	xjmp L54
L53:
	.dbline 229
;    else
;    {  if(dx<0)
	.dbline 229
	ldd R24,y+9
	ldd R25,y+10
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge L55
	.dbline 230
;       {  dx_sym = -1;				// dx<0,设置dx_sym=-1
	.dbline 230
	ldi R22,255
	.dbline 231
;       }
	xjmp L56
L55:
	.dbline 233
;       else
;       {  /* dx==0,画垂直线,或一点 */
	.dbline 234
;          wx = x0-wx;
	ldd R2,y+23
	ldd R3,y+24
	sub R2,R6
	sbc R3,R7
	movw R6,R2
	.dbline 235
;          if(wx<0) wx = 0;
	movw R24,R2
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge L57
	.dbline 235
	clr R6
	clr R7
L57:
	.dbline 236
;          wy = x0+wy;
	ldd R2,y+3
	ldd R3,y+4
	ldd R4,y+23
	ldd R5,y+24
	add R4,R2
	adc R5,R3
	std y+4,R5
	std y+3,R4
	xjmp L60
L59:
	.dbline 239
;          
;          while(1)
;          {  x0 = wx;
	.dbline 239
	std y+24,R7
	std y+23,R6
	.dbline 240
;             GUI_RLine(x0, y0, y1, color);
	ldd R0,y+33
	std y+2,R0
	ldd R0,y+29
	ldd R1,y+30
	std y+1,R1
	std y+0,R0
	ldd R18,y+25
	ldd R19,y+26
	movw R16,R6
	push R16
	push R17
	xcall _GUI_RLine
	pop R7
	pop R6
	.dbline 241
;             if(wx>=wy) break;
	ldd R2,y+3
	ldd R3,y+4
	cp R6,R2
	cpc R7,R3
	brlt L62
	.dbline 241
	xjmp L48
L62:
	.dbline 242
	movw R24,R6
	adiw R24,1
	movw R6,R24
	.dbline 243
L60:
	.dbline 238
	xjmp L59
X2:
	.dbline 245
;             wx++;
;          }
;          
;       	 return;
	xjmp L48
L56:
	.dbline 247
;       }
;    }
L54:
	.dbline 249
;    
;    if(dy>0)							// 判断y轴方向
	clr R2
	clr R3
	ldd R4,y+11
	ldd R5,y+12
	cp R2,R4
	cpc R3,R5
	brge L64
	.dbline 250
;    {  dy_sym = 1;					// dy>0,设置dy_sym=1
	.dbline 250
	clr R14
	inc R14
	.dbline 251
;    }
	xjmp L65
L64:
	.dbline 253
;    else
;    {  if(dy<0)
	.dbline 253
	ldd R24,y+11
	ldd R25,y+12
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge L66
	.dbline 254
;       {  dy_sym = -1;				// dy<0,设置dy_sym=-1
	.dbline 254
	ldi R24,255
	mov R14,R24
	.dbline 255
;       }
	xjmp L67
L66:
	.dbline 257
;       else
;       {  /* dy==0,画水平线,或一点 */
	.dbline 258
;          wx = y0-wx;
	ldd R2,y+25
	ldd R3,y+26
	sub R2,R6
	sbc R3,R7
	movw R6,R2
	.dbline 259
;          if(wx<0) wx = 0;
	movw R24,R2
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge L68
	.dbline 259
	clr R6
	clr R7
L68:
	.dbline 260
;          wy = y0+wy;
	ldd R2,y+3
	ldd R3,y+4
	ldd R4,y+25
	ldd R5,y+26
	add R4,R2
	adc R5,R3
	std y+4,R5
	std y+3,R4
	xjmp L71
L70:
	.dbline 263
;          
;          while(1)
;          {  y0 = wx;
	.dbline 263
	std y+26,R7
	std y+25,R6
	.dbline 264
;             GUI_HLine(x0, y0, x1, color);
	ldd R0,y+33
	std y+2,R0
	ldd R0,y+27
	ldd R1,y+28
	std y+1,R1
	std y+0,R0
	movw R18,R6
	ldd R16,y+23
	ldd R17,y+24
	push R18
	push R19
	xcall _GUI_HLine
	pop R7
	pop R6
	.dbline 265
;             if(wx>=wy) break;
	ldd R2,y+3
	ldd R3,y+4
	cp R6,R2
	cpc R7,R3
	brlt L73
	.dbline 265
	xjmp L48
L73:
	.dbline 266
	movw R24,R6
	adiw R24,1
	movw R6,R24
	.dbline 267
L71:
	.dbline 262
	xjmp L70
X3:
	.dbline 268
;             wx++;
;          }
;       	 return;
	xjmp L48
L67:
	.dbline 270
;       }
;    }
L65:
	.dbline 273
;     
;    /* 将dx、dy取绝对值 */
;    dx = dx_sym * dx;
	ldd R18,y+9
	ldd R19,y+10
	mov R16,R22
	clr R17
	sbrc R16,7
	com R17
	xcall empy16s
	std y+10,R17
	std y+9,R16
	.dbline 274
;    dy = dy_sym * dy;
	ldd R18,y+11
	ldd R19,y+12
	mov R16,R14
	clr R17
	sbrc R16,7
	com R17
	xcall empy16s
	std y+12,R17
	std y+11,R16
	.dbline 277
;  
;    /* 计算2倍的dx及dy值 */
;    dx_x2 = dx*2;
	ldd R18,y+9
	ldd R19,y+10
	ldi R16,2
	ldi R17,0
	xcall empy16s
	std y+6,R17
	std y+5,R16
	.dbline 278
;    dy_x2 = dy*2;
	ldd R18,y+11
	ldd R19,y+12
	ldi R16,2
	ldi R17,0
	xcall empy16s
	std y+8,R17
	std y+7,R16
	.dbline 281
;    
;    /* 使用Bresenham法进行画直线 */
;    if(dx>=dy)						// 对于dx>=dy,则使用x轴为基准
	ldd R2,y+11
	ldd R3,y+12
	ldd R4,y+9
	ldd R5,y+10
	cp R4,R2
	cpc R5,R3
	brge X4
	xjmp L75
X4:
	.dbline 282
;    {  di = dy_x2 - dx;
	.dbline 282
	movw R12,R16
	sub R12,R4
	sbc R13,R5
	xjmp L78
L77:
	.dbline 284
;       while(x0!=x1)
;       {  /* x轴向增长,则宽度在y方向,即画垂直线 */
	.dbline 285
;          draw_a = y0-wx;
	ldd R20,y+25
	ldd R21,y+26
	sub R20,R6
	sbc R21,R7
	.dbline 286
;          if(draw_a<0) draw_a = 0;
	cpi R20,0
	ldi R30,0
	cpc R21,R30
	brge L80
	.dbline 286
	clr R20
	clr R21
L80:
	.dbline 287
;          draw_b = y0+wy;
	ldd R2,y+3
	ldd R3,y+4
	ldd R10,y+25
	ldd R11,y+26
	add R10,R2
	adc R11,R3
	.dbline 288
;          GUI_RLine(x0, draw_a, draw_b, color);
	ldd R0,y+33
	std y+2,R0
	std y+1,R11
	std y+0,R10
	movw R18,R20
	ldd R16,y+23
	ldd R17,y+24
	push R6
	push R7
	xcall _GUI_RLine
	pop R7
	pop R6
	.dbline 290
;          
;          x0 += dx_sym;				
	mov R2,R22
	clr R3
	sbrc R2,7
	com R3
	ldd R0,y+23
	ldd R1,y+24
	add R0,R2
	adc R1,R3
	std y+24,R1
	std y+23,R0
	.dbline 291
;          if(di<0)
	movw R24,R12
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge L82
	.dbline 292
;          {  di += dy_x2;			// 计算出下一步的决策值
	.dbline 292
	ldd R2,y+7
	ldd R3,y+8
	add R12,R2
	adc R13,R3
	.dbline 293
;          }
	xjmp L83
L82:
	.dbline 295
;          else
;          {  di += dy_x2 - dx_x2;
	.dbline 295
	ldd R2,y+5
	ldd R3,y+6
	ldd R4,y+7
	ldd R5,y+8
	sub R4,R2
	sbc R5,R3
	add R12,R4
	adc R13,R5
	.dbline 296
;             y0 += dy_sym;
	mov R2,R14
	clr R3
	sbrc R2,7
	com R3
	ldd R0,y+25
	ldd R1,y+26
	add R0,R2
	adc R1,R3
	std y+26,R1
	std y+25,R0
	.dbline 297
;          }
L83:
	.dbline 298
L78:
	.dbline 283
	ldd R0,y+23
	ldd R1,y+24
	ldd R16,y+27
	ldd R17,y+28
	cp R0,R16
	cpc R1,R17
	breq X5
	xjmp L77
X5:
	.dbline 299
;       }
;       draw_a = y0-wx;
	ldd R20,y+25
	ldd R21,y+26
	sub R20,R6
	sbc R21,R7
	.dbline 300
;       if(draw_a<0) draw_a = 0;
	cpi R20,0
	ldi R30,0
	cpc R21,R30
	brge L84
	.dbline 300
	clr R20
	clr R21
L84:
	.dbline 301
;       draw_b = y0+wy;
	ldd R2,y+3
	ldd R3,y+4
	ldd R10,y+25
	ldd R11,y+26
	add R10,R2
	adc R11,R3
	.dbline 302
;       GUI_RLine(x0, draw_a, draw_b, color);
	ldd R0,y+33
	std y+2,R0
	std y+1,R11
	std y+0,R10
	movw R18,R20
	ldd R16,y+23
	ldd R17,y+24
	push R6
	push R7
	xcall _GUI_RLine
	pop R7
	pop R6
	.dbline 303
;    }
	xjmp L76
L75:
	.dbline 305
;    else								// 对于dx<dy,则使用y轴为基准
;    {  di = dx_x2 - dy;
	.dbline 305
	ldd R2,y+11
	ldd R3,y+12
	ldd R12,y+5
	ldd R13,y+6
	sub R12,R2
	sbc R13,R3
	xjmp L87
L86:
	.dbline 307
;       while(y0!=y1)
;       {  /* y轴向增长,则宽度在x方向,即画水平线 */
	.dbline 308
;          draw_a = x0-wx;
	ldd R20,y+23
	ldd R21,y+24
	sub R20,R6
	sbc R21,R7
	.dbline 309
;          if(draw_a<0) draw_a = 0;
	cpi R20,0
	ldi R30,0
	cpc R21,R30
	brge L89
	.dbline 309
	clr R20
	clr R21
L89:
	.dbline 310
;          draw_b = x0+wy;
	ldd R2,y+3
	ldd R3,y+4
	ldd R10,y+23
	ldd R11,y+24
	add R10,R2
	adc R11,R3
	.dbline 311
;          GUI_HLine(draw_a, y0, draw_b, color);
	ldd R0,y+33
	std y+2,R0
	std y+1,R11
	std y+0,R10
	ldd R18,y+25
	ldd R19,y+26
	movw R16,R20
	push R6
	push R7
	xcall _GUI_HLine
	pop R7
	pop R6
	.dbline 313
;          
;          y0 += dy_sym;
	mov R2,R14
	clr R3
	sbrc R2,7
	com R3
	ldd R0,y+25
	ldd R1,y+26
	add R0,R2
	adc R1,R3
	std y+26,R1
	std y+25,R0
	.dbline 314
;          if(di<0)
	movw R24,R12
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge L91
	.dbline 315
;          {  di += dx_x2;
	.dbline 315
	ldd R2,y+5
	ldd R3,y+6
	add R12,R2
	adc R13,R3
	.dbline 316
;          }
	xjmp L92
L91:
	.dbline 318
;          else
;          {  di += dx_x2 - dy_x2;
	.dbline 318
	ldd R2,y+7
	ldd R3,y+8
	ldd R4,y+5
	ldd R5,y+6
	sub R4,R2
	sbc R5,R3
	add R12,R4
	adc R13,R5
	.dbline 319
;             x0 += dx_sym;
	mov R2,R22
	clr R3

⌨️ 快捷键说明

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