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

📄 gui.s

📁 ICCAVR编写128*64液晶程序测试已经通过
💻 S
📖 第 1 页 / 共 5 页
字号:
;    /* 将dx、dy取绝对值 */
;    dx = dx_sym * dx;
;    dy = dy_sym * dy;
;  
;    /* 计算2倍的dx及dy值 */
;    dx_x2 = dx*2;
;    dy_x2 = dy*2;
;    
;    /* 使用Bresenham法进行画直线 */
;    if(dx>=dy)						// 对于dx>=dy,则使用x轴为基准
;    {
;       di = dy_x2 - dx;
;       while(x0!=x1)
;       {  /* x轴向增长,则宽度在y方向,即画垂直线 */
;          draw_a = y0-wx;
;          if(draw_a<0) draw_a = 0;
;          draw_b = y0+wy;
;          GUI_RLine(x0, draw_a, draw_b, color);
;          
;          x0 += dx_sym;				
;          if(di<0)
;          {
;             di += dy_x2;			        // 计算出下一步的决策值
;          }
;          else
;          {
;             di += dy_x2 - dx_x2;
;             y0 += dy_sym;
;          }
;       }
;       draw_a = y0-wx;
;       if(draw_a<0)
;          draw_a = 0;
;       draw_b = y0+wy;
;       GUI_RLine(x0, draw_a, draw_b, color);
;    }
;    else							// 对于dx<dy,则使用y轴为基准
;    {
;       di = dx_x2 - dy;
;       while(y0!=y1)
;       {  /* y轴向增长,则宽度在x方向,即画水平线 */
;          draw_a = x0-wx;
;          if(draw_a<0)
;             draw_a = 0;
;          draw_b = x0+wy;
;          GUI_HLine(draw_a, y0, draw_b, color);
;          
;          y0 += dy_sym;
;          if(di<0)
;          {
;             di += dx_x2;
;          }
;          else
;          {
;             di += dx_x2 - dy_x2;
;             x0 += dx_sym;
;          }
;       }
;       draw_a = x0-wx;
;       if(draw_a<0)
;          draw_a = 0;
;       draw_b = x0+wy;
;       GUI_HLine(draw_a, y0, draw_b, color);
;    }
; }
; #endif
; 
; /****************************************************************************
; * 名称:GUI_LineS()
; * 功能:多个点之间的连续连线。从第一点连到第二点,再连到第三点...
; * 入口参数:points      多个点坐标数据的指针,数据排列为(x0,y0)、(x1,y1)、(x2,y2)...
; *           no          点数目,至少要大于1
; *           color	显示颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void  GUI_LineS(uint32 const *points, uint8 no, TCOLOR color)
; {
	.dbline 444
;    uint32  x0, y0;
;    uint32  x1, y1;
;    uint8   i;
; 
;    /* 入口参数过滤 */
;    if(0==no)
	tst R10
	brne L56
	.dbline 445
;       return;
	xjmp L55
L56:
	.dbline 446
;    if(1==no)						// 单点
	mov R24,R10
	cpi R24,1
	brne L58
	.dbline 447
;    {
	.dbline 448
;       x0 = *points++;
	movw R2,R12
	movw R24,R2
	adiw R24,4
	movw R12,R24
	movw R16,R2
	xcall lpm32
	movw R30,R28
	std z+21,R16
	std z+22,R17
	std z+23,R18
	std z+24,R19
	.dbline 449
;       y0 = *points;
	movw R16,R12
	xcall lpm32
	movw R30,R28
	std z+25,R16
	std z+26,R17
	std z+27,R18
	std z+28,R19
	.dbline 450
;       GUI_Point(x0, y0, color);
	std y+0,R22
	movw R30,R28
	ldd R2,z+25
	ldd R3,z+26
	ldd R4,z+27
	ldd R5,z+28
	mov R18,R2
	movw R30,R28
	ldd R16,z+21
	xcall _GUI_Point
	.dbline 451
;    }
L58:
	.dbline 454
;    
;    /* 画多条线条 */
;    x0 = *points++;					// 取出第一点坐标值,作为原起点坐标值
	movw R2,R12
	movw R24,R2
	adiw R24,4
	movw R12,R24
	movw R16,R2
	xcall lpm32
	movw R30,R28
	std z+21,R16
	std z+22,R17
	std z+23,R18
	std z+24,R19
	.dbline 455
;    y0 = *points++;
	movw R2,R12
	movw R24,R2
	adiw R24,4
	movw R12,R24
	movw R16,R2
	xcall lpm32
	movw R30,R28
	std z+25,R16
	std z+26,R17
	std z+27,R18
	std z+28,R19
	.dbline 456
;    for(i=1; i<no; i++)
	ldi R20,1
	xjmp L63
L60:
	.dbline 457
	.dbline 458
	movw R2,R12
	movw R24,R2
	adiw R24,4
	movw R12,R24
	movw R16,R2
	xcall lpm32
	movw R30,R28
	std z+13,R16
	std z+14,R17
	std z+15,R18
	std z+16,R19
	.dbline 459
	movw R2,R12
	movw R24,R2
	adiw R24,4
	movw R12,R24
	movw R16,R2
	xcall lpm32
	movw R30,R28
	std z+17,R16
	std z+18,R17
	std z+19,R18
	std z+20,R19
	.dbline 460
	std y+12,R22
	movw R30,R28
	ldd R2,z+17
	ldd R3,z+18
	ldd R4,z+19
	ldd R5,z+20
	std y+8,R2
	std y+9,R3
	std y+10,R4
	std y+11,R5
	movw R30,R28
	ldd R2,z+13
	ldd R3,z+14
	ldd R4,z+15
	ldd R5,z+16
	std y+4,R2
	std y+5,R3
	std y+6,R4
	std y+7,R5
	movw R30,R28
	ldd R2,z+25
	ldd R3,z+26
	ldd R4,z+27
	ldd R5,z+28
	std y+0,R2
	std y+1,R3
	std y+2,R4
	std y+3,R5
	movw R30,R28
	ldd R16,z+21
	ldd R17,z+22
	ldd R18,z+23
	ldd R19,z+24
	xcall _GUI_Line
	.dbline 461
	movw R30,R28
	ldd R2,z+13
	ldd R3,z+14
	ldd R4,z+15
	ldd R5,z+16
	movw R30,R28
	std z+21,R2
	std z+22,R3
	std z+23,R4
	std z+24,R5
	.dbline 462
	movw R30,R28
	ldd R2,z+17
	ldd R3,z+18
	ldd R4,z+19
	ldd R5,z+20
	movw R30,R28
	std z+25,R2
	std z+26,R3
	std z+27,R4
	std z+28,R5
	.dbline 463
L61:
	.dbline 456
	inc R20
L63:
	.dbline 456
	cp R20,R10
	brsh X3
	xjmp L60
X3:
	.dbline -2
L55:
	adiw R28,29
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym l y0 25 l
	.dbsym l x0 21 l
	.dbsym l y1 17 l
	.dbsym l x1 13 l
	.dbsym r color 22 c
	.dbsym r no 10 c
	.dbsym r points 12 pkl
	.dbend
	.dbfunc e GUI_Circle _GUI_Circle fV
;             di -> y+73
;             yy -> y+69
;        draw_x7 -> y+65
;        draw_x6 -> y+61
;        draw_y3 -> y+57
;        draw_y1 -> y+53
;        draw_x5 -> y+49
;        draw_x4 -> y+45
;        draw_y2 -> y+41
;        draw_y0 -> y+37
;        draw_y7 -> y+33
;        draw_y6 -> y+29
;        draw_x3 -> y+25
;        draw_x1 -> y+21
;        draw_y5 -> y+17
;        draw_y4 -> y+13
;        draw_x2 -> y+9
;        draw_x0 -> y+5
;             xx -> y+1
;          color -> R10
;              r -> y+107
;             y0 -> y+103
;             x0 -> y+99
	.even
_GUI_Circle::
	xcall push_arg4
	xcall push_gset3
	sbiw R28,63
	sbiw R28,30  ; offset = 93
	movw R30,R28
	subi R30,145  ; addi 111
	sbci R31,255
	ldd R10,z+0
	.dbline -1
	.dbline 478
;    {
;       x1 = *points++;				        // 取出下一点坐标值
;       y1 = *points++;
;       GUI_Line(x0, y0, x1, y1, color);
;       x0 = x1;						// 更新原起点坐标
;       y0 = y1;
;    }
; }
; 
; #if  GUI_CircleX_EN==1
; /****************************************************************************
; * 名称:GUI_Circle()
; * 功能:指定圆心位置及半径,画圆。
; * 入口参数:x0		圆心的x坐标值
; *           y0		圆心的y坐标值
; *           r           圆的半径
; *           color	显示颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void  GUI_Circle(uint32 x0, uint32 y0, uint32 r, TCOLOR color)
; {
	.dbline 492
;    int32  draw_x0, draw_y0;			        // 刽图点坐标变量
;    int32  draw_x1, draw_y1;	
;    int32  draw_x2, draw_y2;	
;    int32  draw_x3, draw_y3;	
;    int32  draw_x4, draw_y4;	
;    int32  draw_x5, draw_y5;	
;    int32  draw_x6, draw_y6;	
;    int32  draw_x7, draw_y7;	
;    int32  xx, yy;					// 画圆控制变量
;  
;    int32  di;						// 决策变量
;    
;    /* 参数过滤 */
;    if(0==r)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	subi R30,149  ; addi 107
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brne L65
	.dbline 493
;       return;
	xjmp L64
L65:
	.dbline 496
;    
;    /* 计算出8个特殊点(0、45、90、135、180、225、270度),进行显示 */
;    draw_x0 = draw_x1 = x0;
	movw R30,R28
	subi R30,157  ; addi 99
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+21,R2
	std z+22,R3
	std z+23,R4
	std z+24,R5
	movw R30,R28
	subi R30,157  ; addi 99
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+5,R2
	std z+6,R3
	std z+7,R4
	std z+8,R5
	.dbline 497
;    draw_y0 = draw_y1 = y0 + r;
	movw R30,R28
	subi R30,149  ; addi 107
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	subi R30,153  ; addi 103
	sbci R31,255
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	subi R30,179  ; addi 77
	sbci R31,255
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
	movw R30,R28
	subi R30,179  ; addi 77
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+53,R2
	std z+54,R3
	std z+55,R4
	std z+56,R5
	movw R30,R28
	subi R30,179  ; addi 77
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+37,R2
	std z+38,R3
	std z+39,R4
	std z+40,R5
	.dbline 498
;    if(draw_y0<GUI_LCM_YMAX)
	ldi R20,64
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+37
	ldd R3,z+38
	ldd R4,z+39
	ldd R5,z+40
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brge L67
	.dbline 499
;       GUI_Point(draw_x0, draw_y0, color);	        // 90度
	std y+0,R10
	movw R30,R28
	ldd R18,z+37
	movw R30,R28
	ldd R16,z+5
	xcall _GUI_Point
L67:
	.dbline 501
; 	
;    draw_x2 = draw_x3 = x0;
	movw R30,R28
	subi R30,157  ; addi 99
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+25,R2
	std z+26,R3
	std z+27,R4
	std z+28,R5
	movw R30,R28
	subi R30,157  ; addi 99
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+9,R2
	std z+10,R3
	std z+11,R4
	std z+12,R5
	.dbline 502
;    draw_y2 = draw_y3 = y0 - r;
	movw R30,R28
	subi R30,149  ; addi 107
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	subi R30,153  ; addi 103
	sbci R31,255
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	sub R6,R2
	sbc R7,R3
	sbc R8,R4
	sbc R9,R5
	movw R30,R28
	subi R30,175  ; addi 81
	sbci R31,255
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
	movw R30,R28
	subi R30,175  ; addi 81
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+57,R2
	std z+58,R3
	std z+59,R4
	std z+60,R5
	movw R30,R28
	subi R30,175  ; addi 81
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+41,R2
	std z+42,R3
	std z+43,R4
	std z+44,R5
	.dbline 503
;    if(draw_y2>=0)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+41
	ldd R3,z+42
	ldd R4,z+43
	ldd R5,z+44
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brlt L69
	.dbline 504
;       GUI_Point(draw_x2, draw_y2, color);		// 270度
	std y+0,R10
	movw R30,R28
	ldd R18,z+41
	movw R30,R28
	ldd R16,z+9
	xcall _GUI_Point
L69:
	.dbline 506
; 
;    draw_x4 = draw_x6 = x0 + r;
	movw R30,R28
	subi R30,149  ; addi 107
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	subi R30,157  ; addi 99
	sbci R31,255
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	subi R30,171  ; addi 85
	sbci R31,255
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
	movw R30,R28
	subi R30,171  ; addi 85
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	adiw R30,61
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	movw R30,R28
	subi R30,171  ; addi 85
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+45,R2
	std z+46,R3
	std z+47,R4
	std z+48,R5
	.dbline 507
;    draw_y4 = draw_y6 = y0;
	movw R30,R28
	subi R30,153  ; addi 103
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+29,R2
	std z+30,R3
	std z+31,R4
	std z+32,R5
	movw R30,R28
	subi R30,153  ; addi 103
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+13,R2
	std z+14,R3
	std z+15,R4
	std z+16,R5
	.dbline 508
;    if(draw_x4<GUI_LCM_XMAX)
	ldi R20,128
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+45
	ldd R3,z+46
	ldd R4,z+47
	ldd R5,z+48
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brge L71
	.dbline 509
;       GUI_Point(draw_x4, draw_y4, color);	        // 0度
	std y+0,R10
	movw R30,R28
	ldd R18,z+13
	movw R30,R28
	ldd R16,z+45
	xcall _GUI_Point
L71:
	.dbline 511
;    
;    draw_x5 = draw_x7 = x0 - r;
	movw R30,R28
	subi R30,149  ; addi 107
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	subi R30,157  ; addi 99
	sbci R31,255
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	sub R6,R2
	sbc R7,R3
	sbc R8,R4
	sbc R9,R5
	movw R30,R28
	subi R30,167  ; addi 89
	sbci R31,255
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
	movw R30,R28
	subi R30,167  ; addi 89
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	subi R30,191  ; addi 65
	sbci R31,255
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	movw R30,R28
	subi R30,167  ; addi 89
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+49,R2
	std z+50,R3
	std z+51,R4
	std z+52,R5
	.dbline 512
;    draw_y5 = draw_y7 = y0;
	movw R30,R28
	subi R30,153  ; addi 103
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+33,R2
	std z+34,R3
	std z+35,R4
	std z+36,R5
	movw R30,R28
	subi R30,153  ; addi 103
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+17,R2
	std z+18,R3
	std z+19,R4
	std z+20,R5
	.dbline 513
;    if(draw_x5>=0)
	ldi R20,0
	ldi R21,0

⌨️ 快捷键说明

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