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

📄 gui_basic_.lst

📁 一个基于MEGA16的GUI
💻 LST
📖 第 1 页 / 共 3 页
字号:
 205:GUI_BASIC_.c  ****    int8    dy_sym;					// y轴增长方向,为-1时减值方向,为1时增值方向
 206:GUI_BASIC_.c  ****    int32   dx_x2;					// dx*2值变量,用于加快运算速度
 207:GUI_BASIC_.c  ****    int32   dy_x2;					// dy*2值变量,用于加快运算速度
 208:GUI_BASIC_.c  ****    int32   di;						// 决策变量
 209:GUI_BASIC_.c  ****    
 210:GUI_BASIC_.c  ****    int32   wx, wy;					// 线宽变量
 211:GUI_BASIC_.c  ****    int32   draw_a, draw_b;
 212:GUI_BASIC_.c  ****    
 213:GUI_BASIC_.c  ****    /* 参数过滤 */
 214:GUI_BASIC_.c  ****    if(with==0) return;
 215:GUI_BASIC_.c  ****    if(with>50) with = 50;
 216:GUI_BASIC_.c  ****    
 217:GUI_BASIC_.c  ****    dx = x1-x0;						// 求取两点之间的差值
 218:GUI_BASIC_.c  ****    dy = y1-y0;
 219:GUI_BASIC_.c  ****    
 220:GUI_BASIC_.c  ****    wx = with/2;
 221:GUI_BASIC_.c  ****    wy = with-wx-1;
 222:GUI_BASIC_.c  ****    
 223:GUI_BASIC_.c  ****    /* 判断增长方向,或是否为水平线、垂直线、点 */
 224:GUI_BASIC_.c  ****    if(dx>0)							// 判断x轴方向
 225:GUI_BASIC_.c  ****    {  dx_sym = 1;					// dx>0,设置dx_sym=1
 226:GUI_BASIC_.c  ****    }
 227:GUI_BASIC_.c  ****    else
 228:GUI_BASIC_.c  ****    {  if(dx<0)
 229:GUI_BASIC_.c  ****       {  dx_sym = -1;				// dx<0,设置dx_sym=-1
 230:GUI_BASIC_.c  ****       }
 231:GUI_BASIC_.c  ****       else
 232:GUI_BASIC_.c  ****       {  /* dx==0,画垂直线,或一点 */
 233:GUI_BASIC_.c  ****          wx = x0-wx;
 234:GUI_BASIC_.c  ****          if(wx<0) wx = 0;
 235:GUI_BASIC_.c  ****          wy = x0+wy;
 236:GUI_BASIC_.c  ****          
 237:GUI_BASIC_.c  ****          while(1)
 238:GUI_BASIC_.c  ****          {  x0 = wx;
 239:GUI_BASIC_.c  ****             GUI_RLine(x0, y0, y1, color);
 240:GUI_BASIC_.c  ****             if(wx>=wy) break;
 241:GUI_BASIC_.c  ****             wx++;
 242:GUI_BASIC_.c  ****          }
 243:GUI_BASIC_.c  ****          
 244:GUI_BASIC_.c  ****       	 return;
 245:GUI_BASIC_.c  ****       }
 246:GUI_BASIC_.c  ****    }
 247:GUI_BASIC_.c  ****    
 248:GUI_BASIC_.c  ****    if(dy>0)							// 判断y轴方向
 249:GUI_BASIC_.c  ****    {  dy_sym = 1;					// dy>0,设置dy_sym=1
 250:GUI_BASIC_.c  ****    }
 251:GUI_BASIC_.c  ****    else
 252:GUI_BASIC_.c  ****    {  if(dy<0)
 253:GUI_BASIC_.c  ****       {  dy_sym = -1;				// dy<0,设置dy_sym=-1
 254:GUI_BASIC_.c  ****       }
 255:GUI_BASIC_.c  ****       else
 256:GUI_BASIC_.c  ****       {  /* dy==0,画水平线,或一点 */
 257:GUI_BASIC_.c  ****          wx = y0-wx;
 258:GUI_BASIC_.c  ****          if(wx<0) wx = 0;
 259:GUI_BASIC_.c  ****          wy = y0+wy;
 260:GUI_BASIC_.c  ****          
 261:GUI_BASIC_.c  ****          while(1)
 262:GUI_BASIC_.c  ****          {  y0 = wx;
 263:GUI_BASIC_.c  ****             GUI_HLine(x0, y0, x1, color);
 264:GUI_BASIC_.c  ****             if(wx>=wy) break;
 265:GUI_BASIC_.c  ****             wx++;
 266:GUI_BASIC_.c  ****          }
 267:GUI_BASIC_.c  ****       	 return;
 268:GUI_BASIC_.c  ****       }
 269:GUI_BASIC_.c  ****    }
 270:GUI_BASIC_.c  ****     
 271:GUI_BASIC_.c  ****    /* 将dx、dy取绝对值 */
 272:GUI_BASIC_.c  ****    dx = dx_sym * dx;
 273:GUI_BASIC_.c  ****    dy = dy_sym * dy;
 274:GUI_BASIC_.c  ****  
 275:GUI_BASIC_.c  ****    /* 计算2倍的dx及dy值 */
 276:GUI_BASIC_.c  ****    dx_x2 = dx*2;
 277:GUI_BASIC_.c  ****    dy_x2 = dy*2;
 278:GUI_BASIC_.c  ****    
 279:GUI_BASIC_.c  ****    /* 使用Bresenham法进行画直线 */
 280:GUI_BASIC_.c  ****    if(dx>=dy)						// 对于dx>=dy,则使用x轴为基准
 281:GUI_BASIC_.c  ****    {  di = dy_x2 - dx;
 282:GUI_BASIC_.c  ****       while(x0!=x1)
 283:GUI_BASIC_.c  ****       {  /* x轴向增长,则宽度在y方向,即画垂直线 */
 284:GUI_BASIC_.c  ****          draw_a = y0-wx;
 285:GUI_BASIC_.c  ****          if(draw_a<0) draw_a = 0;
 286:GUI_BASIC_.c  ****          draw_b = y0+wy;
 287:GUI_BASIC_.c  ****          GUI_RLine(x0, draw_a, draw_b, color);
 288:GUI_BASIC_.c  ****          
 289:GUI_BASIC_.c  ****          x0 += dx_sym;				
 290:GUI_BASIC_.c  ****          if(di<0)
 291:GUI_BASIC_.c  ****          {  di += dy_x2;			// 计算出下一步的决策值
 292:GUI_BASIC_.c  ****          }
 293:GUI_BASIC_.c  ****          else
 294:GUI_BASIC_.c  ****          {  di += dy_x2 - dx_x2;
 295:GUI_BASIC_.c  ****             y0 += dy_sym;
 296:GUI_BASIC_.c  ****          }
 297:GUI_BASIC_.c  ****       }
 298:GUI_BASIC_.c  ****       draw_a = y0-wx;
 299:GUI_BASIC_.c  ****       if(draw_a<0) draw_a = 0;
 300:GUI_BASIC_.c  ****       draw_b = y0+wy;
 301:GUI_BASIC_.c  ****       GUI_RLine(x0, draw_a, draw_b, color);
 302:GUI_BASIC_.c  ****    }
 303:GUI_BASIC_.c  ****    else								// 对于dx<dy,则使用y轴为基准
 304:GUI_BASIC_.c  ****    {  di = dx_x2 - dy;
 305:GUI_BASIC_.c  ****       while(y0!=y1)
 306:GUI_BASIC_.c  ****       {  /* y轴向增长,则宽度在x方向,即画水平线 */
 307:GUI_BASIC_.c  ****          draw_a = x0-wx;
 308:GUI_BASIC_.c  ****          if(draw_a<0) draw_a = 0;
 309:GUI_BASIC_.c  ****          draw_b = x0+wy;
 310:GUI_BASIC_.c  ****          GUI_HLine(draw_a, y0, draw_b, color);
 311:GUI_BASIC_.c  ****          
 312:GUI_BASIC_.c  ****          y0 += dy_sym;
 313:GUI_BASIC_.c  ****          if(di<0)
 314:GUI_BASIC_.c  ****          {  di += dx_x2;
 315:GUI_BASIC_.c  ****          }
 316:GUI_BASIC_.c  ****          else
 317:GUI_BASIC_.c  ****          {  di += dx_x2 - dy_x2;
 318:GUI_BASIC_.c  ****             x0 += dx_sym;
 319:GUI_BASIC_.c  ****          }
 320:GUI_BASIC_.c  ****       }
 321:GUI_BASIC_.c  ****       draw_a = x0-wx;
 322:GUI_BASIC_.c  ****       if(draw_a<0) draw_a = 0;
 323:GUI_BASIC_.c  ****       draw_b = x0+wy;
 324:GUI_BASIC_.c  ****       GUI_HLine(draw_a, y0, draw_b, color);
 325:GUI_BASIC_.c  ****    } 
 326:GUI_BASIC_.c  ****   
 327:GUI_BASIC_.c  **** }
 328:GUI_BASIC_.c  **** #endif
 329:GUI_BASIC_.c  **** 
 330:GUI_BASIC_.c  **** 
 331:GUI_BASIC_.c  **** 
 332:GUI_BASIC_.c  **** /****************************************************************************
 333:GUI_BASIC_.c  **** * 名称:GUI_LineS()
 334:GUI_BASIC_.c  **** * 功能:多个点之间的连续连线。从第一点连到第二点,再连到第三点...
 335:GUI_BASIC_.c  **** * 入口参数: points  多个点坐标数据的指针,数据排列为(x0,y0)、(x1,y1)、(x2,y2)...
 336:GUI_BASIC_.c  **** *           no      点数目,至少要大于1
 337:GUI_BASIC_.c  **** *           color	显示颜色
 338:GUI_BASIC_.c  **** * 出口参数:无
 339:GUI_BASIC_.c  **** * 说明:操作失败原因是指定地址超出有效范围。
 340:GUI_BASIC_.c  **** ****************************************************************************/
 341:GUI_BASIC_.c  **** 
 342:GUI_BASIC_.c  **** void  GUI_LineS(uint8  *points, uint8 no, TCOLOR color)
 343:GUI_BASIC_.c  **** {  uint8  x0, y0;
 574               	.LM63:
 575               	/* prologue: frame size=1 */
 576 01d8 AF92      		push r10
 577 01da BF92      		push r11
 578 01dc DF92      		push r13
 579 01de EF92      		push r14
 580 01e0 FF92      		push r15
 581 01e2 0F93      		push r16
 582 01e4 1F93      		push r17
 583 01e6 CF93      		push r28
 584 01e8 DF93      		push r29
 585 01ea CDB7      		in r28,__SP_L__
 586 01ec DEB7      		in r29,__SP_H__
 587 01ee 2197      		sbiw r28,1
 588 01f0 0FB6      		in __tmp_reg__,__SREG__
 589 01f2 F894      		cli
 590 01f4 DEBF      		out __SP_H__,r29
 591 01f6 0FBE      		out __SREG__,__tmp_reg__
 592 01f8 CDBF      		out __SP_L__,r28
 593               	/* prologue end (size=17) */
 594 01fa 5C01      		movw r10,r24
 595 01fc E62E      		mov r14,r22
 596 01fe D42E      		mov r13,r20
 344:GUI_BASIC_.c  ****    uint8  x1, y1;
 345:GUI_BASIC_.c  ****    uint8  i;
 346:GUI_BASIC_.c  **** 
 347:GUI_BASIC_.c  ****    /* 入口参数过滤 */
 348:GUI_BASIC_.c  ****    if(0==no) return;
 598               	.LM64:
 599 0200 6623      		tst r22
 600 0202 01F1      		breq .L44
 349:GUI_BASIC_.c  ****    if(1==no)						// 单点
 602               	.LM65:
 603 0204 81E0      		ldi r24,lo8(1)
 604 0206 6817      		cp r22,r24
 605 0208 31F4      		brne .L46
 350:GUI_BASIC_.c  ****    {  x0 = *points++;
 607               	.LM66:
 608 020a F501      		movw r30,r10
 609 020c 8191      		ld r24,Z+
 610 020e 5F01      		movw r10,r30
 351:GUI_BASIC_.c  ****       y0 = *points;
 612               	.LM67:
 613 0210 6081      		ld r22,Z
 352:GUI_BASIC_.c  ****       GUI_Point(x0, y0, color);
 615               	.LM68:
 616 0212 0E94 0000 		call GUI_Point
 617               	.L46:
 353:GUI_BASIC_.c  ****    }
 354:GUI_BASIC_.c  ****    
 355:GUI_BASIC_.c  ****    /* 画多条线条 */
 356:GUI_BASIC_.c  ****    x0 = *points++;					// 取出第一点坐标值,作为原起点坐标值
 619               	.LM69:
 620 0216 F501      		movw r30,r10
 621 0218 8191      		ld r24,Z+
 357:GUI_BASIC_.c  ****    y0 = *points++;
 623               	.LM70:
 624 021a 6191      		ld r22,Z+
 625 021c 5F01      		movw r10,r30
 358:GUI_BASIC_.c  ****    for(i=1; i<no; i++)
 627               	.LM71:
 628 021e 91E0      		ldi r25,lo8(1)
 629 0220 9E15      		cp r25,r14
 630 0222 80F4      		brsh .L44
 631               	.L50:
 359:GUI_BASIC_.c  ****    {  x1 = *points++;				// 取出下一点坐标值
 633               	.LM72:
 634 0224 F501      		movw r30,r10
 635 0226 1191      		ld r17,Z+
 360:GUI_BASIC_.c  ****       y1 = *points++;
 637               	.LM73:
 638 0228 F190      		ld r15,Z+
 639 022a 5F01      		movw r10,r30
 361:GUI_BASIC_.c  ****       GUI_Line(x0, y0, x1, y1, color);
 641               	.LM74:
 642 022c 0D2D      		mov r16,r13
 643 022e 2F2D      		mov r18,r15
 644 0230 412F      		mov r20,r17
 645 0232 9983      		std Y+1,r25
 646 0234 0E94 0000 		call GUI_Line
 362:GUI_BASIC_.c  ****       x0 = x1;						// 更新原起点坐标
 648               	.LM75:
 649 0238 812F      		mov r24,r17
 363:GUI_BASIC_.c  ****       y0 = y1;
 651               	.LM76:
 652 023a 6F2D      		mov r22,r15
 654               	.LM77:
 655 023c 9981      		ldd r25,Y+1
 656 023e 9F5F      		subi r25,lo8(-(1))
 657 0240 9E15      		cp r25,r14
 658 0242 80F3      		brlo .L50
 659               	.L44:
 660               	/* epilogue: frame size=1 */
 661 0244 2196      		adiw r28,1
 662 0246 0FB6      		in __tmp_reg__,__SREG__
 663 0248 F894      		cli
 664 024a DEBF      		out __SP_H__,r29
 665 024c 0FBE      		out __SREG__,__tmp_reg__
 666 024e CDBF      		out __SP_L__,r28
 667 0250 DF91      		pop r29
 668 0252 CF91      		pop r28
 669 0254 1F91      		pop r17
 670 0256 0F91      		pop r16
 671 0258 FF90      		pop r15
 672 025a EF90      		pop r14
 673 025c DF90      		pop r13
 674 025e BF90      		pop r11
 675 0260 AF90      		pop r10
 676 0262 0895      		ret
 677               	/* epilogue end (size=16) */
 678               	/* function GUI_LineS size 70 (37) */
 685               	.Lscope4:
 686               		.comm Alarm,1,1
 688               		.text
 690               	Letext:
 691               	/* File "GUI_BASIC_.c": code  306 = 0x0132 ( 225), prologues  39, epilogues  42 */
DEFINED SYMBOLS
                            *ABS*:00000000 GUI_BASIC_.c
C:\DOCUME~1\64564564\LOCALS~1\Temp/ccoJaaaa.s:3      *ABS*:0000003f __SREG__
C:\DOCUME~1\64564564\LOCALS~1\Temp/ccoJaaaa.s:4      *ABS*:0000003e __SP_H__
C:\DOCUME~1\64564564\LOCALS~1\Temp/ccoJaaaa.s:5      *ABS*:0000003d __SP_L__
C:\DOCUME~1\64564564\LOCALS~1\Temp/ccoJaaaa.s:6      *ABS*:00000000 __tmp_reg__
C:\DOCUME~1\64564564\LOCALS~1\Temp/ccoJaaaa.s:7      *ABS*:00000001 __zero_reg__
C:\DOCUME~1\64564564\LOCALS~1\Temp/ccoJaaaa.s:132    .text:00000000 GUI_Rectangle
C:\DOCUME~1\64564564\LOCALS~1\Temp/ccoJaaaa.s:190    .text:0000004c GUI_RectangleFill
C:\DOCUME~1\64564564\LOCALS~1\Temp/ccoJaaaa.s:298    .text:000000b6 GUI_Square
C:\DOCUME~1\64564564\LOCALS~1\Temp/ccoJaaaa.s:349    .text:000000ec GUI_Line
C:\DOCUME~1\64564564\LOCALS~1\Temp/ccoJaaaa.s:572    .text:000001d8 GUI_LineS
                            *COM*:00000001 Alarm
C:\DOCUME~1\64564564\LOCALS~1\Temp/ccoJaaaa.s:690    .text:00000264 Letext

UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss
GUI_HLine
GUI_RLine
GUI_Point

⌨️ 快捷键说明

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