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

📄 gui_basic.s

📁 ssd1325控制器液晶的驱动程序
💻 S
📖 第 1 页 / 共 5 页
字号:
	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 320
;          }
L92:
	.dbline 321
L87:
	.dbline 306
	ldd R0,y+25
	ldd R1,y+26
	ldd R16,y+29
	ldd R17,y+30
	cp R0,R16
	cpc R1,R17
	breq X6
	xjmp L86
X6:
	.dbline 322
;       }
;       draw_a = x0-wx;
	ldd R20,y+23
	ldd R21,y+24
	sub R20,R6
	sbc R21,R7
	.dbline 323
;       if(draw_a<0) draw_a = 0;
	cpi R20,0
	ldi R30,0
	cpc R21,R30
	brge L93
	.dbline 323
	clr R20
	clr R21
L93:
	.dbline 324
	ldd R2,y+3
	ldd R3,y+4
	ldd R10,y+23
	ldd R11,y+24
	add R10,R2
	adc R11,R3
	.dbline 325
	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
	xcall _GUI_HLine
	.dbline 326
L76:
	.dbline -2
L48:
	adiw R28,13
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l dy 11 I
	.dbsym l dx 9 I
	.dbsym l dy_x2 7 I
	.dbsym l dx_x2 5 I
	.dbsym r dy_sym 14 C
	.dbsym r dx_sym 22 C
	.dbsym l wy 3 I
	.dbsym r di 12 I
	.dbsym r draw_b 10 I
	.dbsym r wx 6 I
	.dbsym r draw_a 20 I
	.dbsym l color 33 c
	.dbsym r with 20 c
	.dbsym l y1 29 i
	.dbsym l x1 27 i
	.dbsym l y0 25 i
	.dbsym l x0 23 i
	.dbend
	.dbfunc e GUI_LineS _GUI_LineS fV
;              i -> R20
;             y0 -> R22,R23
;             x0 -> R10,R11
;             y1 -> R12,R13
;             x1 -> R14,R15
;          color -> y+17
;             no -> y+15
;         points -> R4,R5
	.even
_GUI_LineS::
	st -y,r19
	st -y,r18
	xcall push_gset5
	movw R4,R16
	sbiw R28,5
	.dbline -1
	.dbline 343
;       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)
; {  uint32  x0, y0;
	.dbline 348
;    uint32  x1, y1;
;    uint8  i;
; 
;    /* 入口参数过滤 */
;    if(0==no) return;
	ldd R0,y+15
	tst R0
	brne L96
	.dbline 348
	xjmp L95
L96:
	.dbline 349
;    if(1==no)						// 单点
	ldd R24,y+15
	cpi R24,1
	brne L98
	.dbline 350
;    {  x0 = *points++;
	.dbline 350
	movw R2,R4
	movw R24,R2
	adiw R24,2
	movw R30,R2
	lpm R10,Z+
	lpm R11,Z
	.dbline 351
;       y0 = *points;
	movw R30,R24
	lpm R22,Z+
	lpm R23,Z
	.dbline 352
;       GUI_Point(x0, y0, color);
	ldd R0,y+17
	std y+0,R0
	movw R18,R22
	movw R16,R10
	push R24
	push R25
	xcall _GUI_Point
	pop R5
	pop R4
	.dbline 353
;    }
L98:
	.dbline 356
;    
;    /* 画多条线条 */
;    x0 = *points++;					// 取出第一点坐标值,作为原起点坐标值
	movw R2,R4
	movw R24,R2
	adiw R24,2
	movw R30,R2
	lpm R10,Z+
	lpm R11,Z
	.dbline 357
;    y0 = *points++;
	movw R2,R24
	adiw R24,2
	movw R4,R24
	movw R30,R2
	lpm R22,Z+
	lpm R23,Z
	.dbline 358
;    for(i=1; i<no; i++)
	ldi R20,1
	xjmp L103
L100:
	.dbline 359
	.dbline 359
	movw R2,R4
	movw R24,R2
	adiw R24,2
	movw R30,R2
	lpm R14,Z+
	lpm R15,Z
	.dbline 360
	movw R2,R24
	adiw R24,2
	movw R30,R2
	lpm R12,Z+
	lpm R13,Z
	.dbline 361
	ldd R0,y+17
	std y+4,R0
	std y+3,R13
	std y+2,R12
	std y+1,R15
	std y+0,R14
	movw R18,R22
	movw R16,R10
	push R24
	push R25
	xcall _GUI_Line
	pop R5
	pop R4
	.dbline 362
	movw R10,R14
	.dbline 363
	movw R22,R12
	.dbline 364
L101:
	.dbline 358
	inc R20
L103:
	.dbline 358
	ldd R0,y+15
	cp R20,R0
	brlo L100
	.dbline -2
L95:
	adiw R28,5
	xcall pop_gset5
	adiw R28,2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r y0 22 i
	.dbsym r x0 10 i
	.dbsym r y1 12 i
	.dbsym r x1 14 i
	.dbsym l color 17 c
	.dbsym l no 15 c
	.dbsym r points 4 pki
	.dbend
	.dbfunc e GUI_Circle _GUI_Circle fV
;             di -> y+25
;             yy -> y+23
;        draw_x7 -> y+21
;        draw_x6 -> y+19
;        draw_y3 -> y+17
;        draw_y1 -> y+15
;        draw_x5 -> y+13
;        draw_x4 -> y+11
;        draw_y2 -> y+9
;        draw_y0 -> y+7
;        draw_y7 -> y+5
;        draw_y6 -> y+3
;        draw_x3 -> y+1
;        draw_x1 -> y+27
;        draw_y5 -> R22,R23
;        draw_y4 -> R10,R11
;        draw_x2 -> R12,R13
;        draw_x0 -> R14,R15
;             xx -> R20,R21
;          color -> y+41
;              r -> y+39
;             y0 -> R20,R21
;             x0 -> R22,R23
	.even
_GUI_Circle::
	xcall push_gset5
	movw R20,R18
	movw R22,R16
	sbiw R28,29
	.dbline -1
	.dbline 381
;    {  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)
; {  int32  draw_x0, draw_y0;			// 刽图点坐标变量
	.dbline 394
;    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) return;
	ldd R0,y+39
	ldd R1,y+40
	tst R0
	brne L105
	tst R1
	brne L105
X7:
	.dbline 394
	xjmp L104
L105:
	.dbline 397
;    
;    /* 计算出8个特殊点(0、45、90、135、180、225、270度),进行显示 */
;    draw_x0 = draw_x1 = x0;
	std y+28,R23
	std y+27,R22
	movw R14,R22
	.dbline 398
;    draw_y0 = draw_y1 = y0 + r;
	movw R2,R20
	ldd R0,y+39
	ldd R1,y+40
	add R2,R0
	adc R3,R1
	std y+16,R3
	std y+15,R2
	std y+8,R3
	std y+7,R2
	.dbline 399
;    if(draw_y0<GUI_LCM_YMAX) GUI_Point(draw_x0, draw_y0, color);	// 90度
	movw R24,R2
	cpi R24,128
	ldi R30,0
	cpc R25,R30
	brge L107
	.dbline 399
	ldd R0,y+41
	std y+0,R0
	movw R18,R24
	movw R16,R14
	xcall _GUI_Point
L107:
	.dbline 401
; 	
;    draw_x2 = draw_x3 = x0;
	std y+2,R23
	std y+1,R22
	movw R12,R22
	.dbline 402
;    draw_y2 = draw_y3 = y0 - r;
	movw R2,R20
	ldd R0,y+39
	ldd R1,y+40
	sub R2,R0
	sbc R3,R1
	std y+18,R3
	std y+17,R2
	std y+10,R3
	std y+9,R2
	.dbline 403
;    if(draw_y2>=0) GUI_Point(draw_x2, draw_y2, color);			// 270度
	movw R24,R2
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brlt L109
	.dbline 403
	ldd R0,y+41
	std y+0,R0
	movw R18,R24
	movw R16,R12
	xcall _GUI_Point
L109:
	.dbline 406
;    
; 	
;    draw_x4 = draw_x6 = x0 + r;
	movw R2,R22
	ldd R0,y+39
	ldd R1,y+40
	add R2,R0
	adc R3,R1
	std y+20,R3
	std y+19,R2
	std y+12,R3
	std y+11,R2
	.dbline 407
;    draw_y4 = draw_y6 = y0;
	std y+4,R21
	std y+3,R20
	movw R10,R20
	.dbline 408
;    if(draw_x4<GUI_LCM_XMAX) GUI_Point(draw_x4, draw_y4, color);	// 0度
	ldd R24,y+11
	ldd R25,y+12
	cpi R24,240
	ldi R30,0
	cpc R25,R30
	brge L111
	.dbline 408
	ldd R0,y+41
	std y+0,R0
	movw R18,R10
	movw R16,R24
	xcall _GUI_Point
L111:
	.dbline 410
;    
;    draw_x5 = draw_x7 = x0 - r;
	movw R2,R22
	ldd R0,y+39
	ldd R1,y+40
	sub R2,R0
	sbc R3,R1
	std y+22,R3
	std y+21,R2
	std y+14,R3
	std y+13,R2
	.dbline 411
;    draw_y5 = draw_y7 = y0;
	std y+6,R21
	std y+5,R20
	movw R22,R20
	.dbline 412
;    if(draw_x5>=0) GUI_Point(draw_x5, draw_y5, color);			// 180度   
	ldd R24,y+13
	ldd R25,y+14
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brlt L113
	.dbline 412
	ldd R0,y+41
	std y+0,R0
	movw R18,R22
	movw R16,R24
	xcall _GUI_Point
L113:
	.dbline 413
;    if(1==r) return;					// 若半径为1,则已圆画完
	ldd R24,y+39
	ldd R25,y+40
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brne L115
	.dbline 413
	xjmp L104
L115:
	.dbline 417
;    
;    
;    /* 使用Bresenham法进行画圆 */
;    di = 3 - 2*r;					// 初始化决策变量
	ldi R16,2
	ldi R17,0
	ldd R18,y+39
	ldd R19,y+40
	xcall empy16s
	ldi R24,3
	ldi R25,0
	sub R24,R16
	sbc R25,R17
	std y+26,R25
	std y+25,R24
	.dbline 419
;    
;    xx = 0;
	clr R20
	clr R21
	.dbline 420
;    yy = r;	
	ldd R0,y+39
	ldd R1,y+40
	std y+24,R1
	std y+23,R0
	xjmp L118
L117:
	.dbline 422
;    while(xx<yy)
;    {  if(di<0)
	.dbline 422
	ldd R24,y+25
	ldd R25,y+26
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge L120
	.dbline 423
; 	  {  di += 4*xx + 6;	      
	.dbline 423
	ldi R16,4
	ldi R17,0
	movw R18,R20
	xcall empy16s
	movw R24,R16
	adiw R24,6
	ldd R2,y+25
	ldd R3,y+26
	add R2,R24
	adc R3,R25
	std y+26,R3
	std y+25,R2
	.dbline 424
; 	  }
	xjmp L121
L120:
	.dbline 426
; 	  else
; 	  {  di += 4*(xx - yy) + 10;
	.dbline 426
	ldd R2,y+23
	ldd R3,y+24
	movw R18,R20
	sub R18,R2
	sbc R19,R3
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R24,R16
	adiw R24,10
	ldd R2,y+25
	ldd R3,y+26
	add R2,R24
	adc R3,R25
	std y+26,R3
	std y+25,R2
	.dbline 428
; 	  
; 	     yy--;	  
	ldd R24,y+23
	ldd R25,y+24
	sbiw R24,1
	std y+24,R25
	std y+23,R24
	.dbline 429
; 		 draw_y0--;
	ldd R24,y+7
	ldd R25,y+8
	sbiw R24,1
	std y+8,R25
	std y+7,R24
	.dbline 430
; 		 draw_y1--;
	ldd R24,y+15
	ldd R25,y+16
	sbiw R24,1
	std y+16,R25
	std y+15,R24
	.dbline 431
; 		 draw_y2++;
	ldd R24,y+9
	ldd R25,y+10
	adiw R24,1
	std y+10,R25
	std y+9,R24
	.dbline 432
; 		 draw_y3++;
	ldd R24,y+17
	ldd R25,y+18
	adiw R24,1
	std y+18,R25
	std y+17,R24
	.dbline 433
; 		 draw_x4--;
	ldd R24,y+11
	ldd R25,y+12
	sbiw R24,1
	std y+12,R25
	std y+11,R24
	.dbline 434
; 		 draw_x5++;
	ldd R24,y+13
	ldd R25,y+14
	adiw R24,1
	std y+14,R25
	std y+13,R24
	.dbline 435
; 		 draw_x6--;
	ldd R24,y+19
	ldd R25,y+20
	sbiw R24,1
	std y+20,R25
	std y+19,R24
	.dbline 436
; 		 draw_x7++;	 	
	ldd R24,y+21
	ldd R25,y+22
	adiw R24,1
	std y+22,R25
	std y+21,R24
	.dbline 437
; 	  }
L121:
	.dbline 439
; 	  
; 	  xx++;   
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 440
; 	  draw_x0++;
	movw R24,R14
	adiw R24,1
	movw R14,R24
	.dbline 441
; 	  draw_x1--;
	ldd R24,y+27
	ldd R25,y+28
	sbiw R24,1
	std y+28,R25
	std y+27,R24
	.dbline 442
; 	  draw_x2++;
	movw R24,R12
	adiw R24,1
	movw R12,R24
	.dbline 443
; 	  draw_x3--;
	ldd R24,y+1
	ldd R25,y+2
	sbiw R24,1
	std y+2,R25
	std y+1,R24
	.dbline 444
; 	  draw_y4++;
	movw R24,R10
	adiw R24,1
	movw R10,R24
	.dbline 445
; 	  draw_y5++;
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 446
; 	  draw_y6--;
	ldd R24,y+3
	ldd R25,y+4
	sbiw R24,1
	std y+4,R25
	std y+3,R24
	.dbline 447
; 	  draw_y7--;
	ldd R24,y+5
	ldd R25,y+6
	sbiw R24,1
	std y+6,R25
	std y+5,R24
	.dbline 451
; 		
; 	
; 	  /* 要判断当前点是否在有效范围内 */
; 	  if( (draw_x0<=GUI_LCM_XMAX)&&(draw_y0>=0) )	
	ldi R24,240
	ldi R25,0
	cp R24,R14
	cpc R25,R15
	brlt L122
	ldd R24,y+7
	ldd R25,y+8
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brlt L122
	.dbline 452
; 	  {  GUI_Point(draw_x0, draw_y0, color);
	.dbline 452
	ldd R0,y+41
	std y+0,R0
	movw R18,R24
	movw R16,R14
	xcall _GUI_Point
	.dbline 453
; 	  }	    
L122:
	.dbline 454
; 	  if( (draw_x1>=0)&&(draw_y1>=0) )	
	ldd R24,y+27
	ldd R25,y+28
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brlt L124
	ldd R24,y+15
	ldd R25,y+16
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brlt L124
	.dbline 455
; 	  {  GUI_Point(draw_x1, draw_y1, color);
	.dbline 455
	ldd R0,y+41
	std y+0,R0
	movw R18,R24
	ldd R16,y+27
	ldd R17,y+28
	xcall _GUI_Point
	.dbline 456
; 	  }
L124:
	.dbline 457
; 	  if( (draw_x2<=GUI_LCM_XMAX)&&(draw_y2<=GUI_LCM_YMAX) )	
	ldi R24,240
	ldi R25,0
	cp R24,R12
	cpc R25,R13
	brlt L126
	ldi R24,128
	ldd R2,y+9
	ldd R3,y+10
	cp R24,R2
	cpc R25,R3
	brlt L126
	.dbline 458
; 	  {  GUI_Point(draw_x2, draw_y2, color);   
	.dbline 458
	ldd R0,y+41
	std y+0,R0
	movw R18,R2
	movw R16,R12
	xcall _GUI_Point
	.dbline 459
; 	  }
L126:
	.dbline 460

⌨️ 快捷键说明

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