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

📄 gui_basic_.lst

📁 一个基于MEGA16的GUI
💻 LST
📖 第 1 页 / 共 3 页
字号:
  99:GUI_BASIC_.c  **** *           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
 100:GUI_BASIC_.c  **** * 出口参数:无
 101:GUI_BASIC_.c  **** * 说明:操作失败原因是指定地址超出有效范围。
 102:GUI_BASIC_.c  **** ****************************************************************************/
 103:GUI_BASIC_.c  **** void  GUI_Line(uint8 x0, uint8 y0, uint8 x1, uint8 y1, TCOLOR color)
 104:GUI_BASIC_.c  **** {  int8   dx;						// 直线x轴差值变量
 351               	.LM26:
 352               	/* prologue: frame size=0 */
 353 00ec 9F92      		push r9
 354 00ee AF92      		push r10
 355 00f0 BF92      		push r11
 356 00f2 CF92      		push r12
 357 00f4 DF92      		push r13
 358 00f6 EF92      		push r14
 359 00f8 FF92      		push r15
 360 00fa 0F93      		push r16
 361 00fc 1F93      		push r17
 362 00fe CF93      		push r28
 363               	/* prologue end (size=10) */
 364 0100 F82E      		mov r15,r24
 365 0102 162F      		mov r17,r22
 366 0104 B42E      		mov r11,r20
 367 0106 D22E      		mov r13,r18
 368 0108 C02E      		mov r12,r16
 105:GUI_BASIC_.c  ****    int8   dy;          			// 直线y轴差值变量
 106:GUI_BASIC_.c  ****    int8    dx_sym;					// x轴增长方向,为-1时减值方向,为1时增值方向
 107:GUI_BASIC_.c  ****    int8    dy_sym;					// y轴增长方向,为-1时减值方向,为1时增值方向
 108:GUI_BASIC_.c  ****    int8   dx_x2;					// dx*2值变量,用于加快运算速度
 109:GUI_BASIC_.c  ****    int8   dy_x2;					// dy*2值变量,用于加快运算速度
 110:GUI_BASIC_.c  ****    int8   di;						// 决策变量
 111:GUI_BASIC_.c  ****    
 112:GUI_BASIC_.c  ****    
 113:GUI_BASIC_.c  ****    dx = x1-x0;						// 求取两点之间的差值
 370               	.LM27:
 371 010a 942F      		mov r25,r20
 372 010c 981B      		sub r25,r24
 114:GUI_BASIC_.c  ****    dy = y1-y0;
 374               	.LM28:
 375 010e 822F      		mov r24,r18
 376 0110 861B      		sub r24,r22
 115:GUI_BASIC_.c  ****    
 116:GUI_BASIC_.c  ****    /* 判断增长方向,或是否为水平线、垂直线、点 */
 117:GUI_BASIC_.c  ****    if(dx>0)							// 判断x轴方向
 378               	.LM29:
 379 0112 1916      		cp __zero_reg__,r25
 380 0114 1CF4      		brge .L16
 118:GUI_BASIC_.c  ****    {  dx_sym = 1;					// dx>0,设置dx_sym=1
 382               	.LM30:
 383 0116 51E0      		ldi r21,lo8(1)
 384 0118 952E      		mov r9,r21
 385 011a 0BC0      		rjmp .L17
 386               	.L16:
 119:GUI_BASIC_.c  ****    }
 120:GUI_BASIC_.c  ****    else
 121:GUI_BASIC_.c  ****    {  if(dx<0)
 388               	.LM31:
 389 011c 97FF      		sbrs r25,7
 390 011e 03C0      		rjmp .L18
 122:GUI_BASIC_.c  ****       {  dx_sym = -1;				// dx<0,设置dx_sym=-1
 392               	.LM32:
 393 0120 4FEF      		ldi r20,lo8(-1)
 394 0122 942E      		mov r9,r20
 395 0124 06C0      		rjmp .L17
 396               	.L18:
 123:GUI_BASIC_.c  ****       }
 124:GUI_BASIC_.c  ****       else
 125:GUI_BASIC_.c  ****       {  // dx==0,画垂直线,或一点
 126:GUI_BASIC_.c  ****          GUI_RLine(x0, y0, y1, color);
 398               	.LM33:
 399 0126 202F      		mov r18,r16
 400 0128 4D2D      		mov r20,r13
 401 012a 8F2D      		mov r24,r15
 402 012c 0E94 0000 		call GUI_RLine
 127:GUI_BASIC_.c  ****       	 return;
 404               	.LM34:
 405 0130 48C0      		rjmp .L15
 406               	.L17:
 128:GUI_BASIC_.c  ****       }
 129:GUI_BASIC_.c  ****    }
 130:GUI_BASIC_.c  ****    
 131:GUI_BASIC_.c  ****    if(dy>0)							// 判断y轴方向
 408               	.LM35:
 409 0132 1816      		cp __zero_reg__,r24
 410 0134 1CF4      		brge .L20
 132:GUI_BASIC_.c  ****    {  dy_sym = 1;					// dy>0,设置dy_sym=1
 412               	.LM36:
 413 0136 31E0      		ldi r19,lo8(1)
 414 0138 A32E      		mov r10,r19
 415 013a 0CC0      		rjmp .L21
 416               	.L20:
 133:GUI_BASIC_.c  ****    }
 134:GUI_BASIC_.c  ****    else
 135:GUI_BASIC_.c  ****    {  if(dy<0)
 418               	.LM37:
 419 013c 87FF      		sbrs r24,7
 420 013e 03C0      		rjmp .L22
 136:GUI_BASIC_.c  ****       {  dy_sym = -1;				// dy<0,设置dy_sym=-1
 422               	.LM38:
 423 0140 2FEF      		ldi r18,lo8(-1)
 424 0142 A22E      		mov r10,r18
 425 0144 07C0      		rjmp .L21
 426               	.L22:
 137:GUI_BASIC_.c  ****       }
 138:GUI_BASIC_.c  ****       else
 139:GUI_BASIC_.c  ****       {  // dy==0,画水平线,或一点
 140:GUI_BASIC_.c  ****          GUI_HLine(x0, y0, x1, color);
 428               	.LM39:
 429 0146 2C2D      		mov r18,r12
 430 0148 4B2D      		mov r20,r11
 431 014a 612F      		mov r22,r17
 432 014c 8F2D      		mov r24,r15
 433 014e 0E94 0000 		call GUI_HLine
 141:GUI_BASIC_.c  ****       	 return;
 435               	.LM40:
 436 0152 37C0      		rjmp .L15
 437               	.L21:
 142:GUI_BASIC_.c  ****       }
 143:GUI_BASIC_.c  ****    }
 144:GUI_BASIC_.c  ****     
 145:GUI_BASIC_.c  ****    /* 将dx、dy取绝对值 */
 146:GUI_BASIC_.c  ****    dx = dx_sym * dx;
 439               	.LM41:
 440 0154 999D      		mul r25,r9
 441 0156 902D      		mov r25,r0
 442 0158 1124      		clr r1
 147:GUI_BASIC_.c  ****    dy = dy_sym * dy;
 444               	.LM42:
 445 015a 8A9D      		mul r24,r10
 446 015c 802D      		mov r24,r0
 447 015e 1124      		clr r1
 148:GUI_BASIC_.c  ****  
 149:GUI_BASIC_.c  ****    /* 计算2倍的dx及dy值 */
 150:GUI_BASIC_.c  ****    dx_x2 = dx*2;
 449               	.LM43:
 450 0160 E92E      		mov r14,r25
 451 0162 EE0C      		lsl r14
 151:GUI_BASIC_.c  ****    dy_x2 = dy*2;
 453               	.LM44:
 454 0164 082F      		mov r16,r24
 455 0166 000F      		lsl r16
 152:GUI_BASIC_.c  ****    
 153:GUI_BASIC_.c  ****    /* 使用Bresenham法进行画直线 */
 154:GUI_BASIC_.c  ****    if(dx>=dy)						// 对于dx>=dy,则使用x轴为基准
 457               	.LM45:
 458 0168 9817      		cp r25,r24
 459 016a 9CF0      		brlt .L24
 155:GUI_BASIC_.c  ****    {  di = dy_x2 - dx;
 461               	.LM46:
 462 016c C02F      		mov r28,r16
 463 016e C91B      		sub r28,r25
 464               	.L42:
 156:GUI_BASIC_.c  ****       while(x0!=x1)
 157:GUI_BASIC_.c  ****       {  GUI_Point(x0, y0, color);
 158:GUI_BASIC_.c  ****          x0 += dx_sym;
 159:GUI_BASIC_.c  ****          if(di<0)
 160:GUI_BASIC_.c  ****          {  di += dy_x2;			// 计算出下一步的决策值
 161:GUI_BASIC_.c  ****          }
 162:GUI_BASIC_.c  ****          else
 163:GUI_BASIC_.c  ****          {  di += dy_x2 - dx_x2;
 164:GUI_BASIC_.c  ****             y0 += dy_sym;
 466               	.LM47:
 467 0170 FB14      		cp r15,r11
 468 0172 11F1      		breq .L39
 470               	.LM48:
 471 0174 4C2D      		mov r20,r12
 472 0176 612F      		mov r22,r17
 473 0178 8F2D      		mov r24,r15
 474 017a 0E94 0000 		call GUI_Point
 476               	.LM49:
 477 017e F90C      		add r15,r9
 479               	.LM50:
 480 0180 C7FF      		sbrs r28,7
 481 0182 02C0      		rjmp .L27
 483               	.LM51:
 484 0184 C00F      		add r28,r16
 485 0186 F4CF      		rjmp .L42
 486               	.L27:
 488               	.LM52:
 489 0188 802F      		mov r24,r16
 490 018a 8E19      		sub r24,r14
 491 018c C80F      		add r28,r24
 493               	.LM53:
 494 018e 1A0D      		add r17,r10
 495 0190 EFCF      		rjmp .L42
 496               	.L24:
 165:GUI_BASIC_.c  ****          }
 166:GUI_BASIC_.c  ****       }
 167:GUI_BASIC_.c  ****       GUI_Point(x0, y0, color);		// 显示最后一点
 168:GUI_BASIC_.c  ****    }
 169:GUI_BASIC_.c  ****    else								// 对于dx<dy,则使用y轴为基准
 170:GUI_BASIC_.c  ****    {  di = dx_x2 - dy;
 498               	.LM54:
 499 0192 CE2D      		mov r28,r14
 500 0194 C81B      		sub r28,r24
 501               	.L43:
 171:GUI_BASIC_.c  ****       while(y0!=y1)
 172:GUI_BASIC_.c  ****       {  GUI_Point(x0, y0, color);
 173:GUI_BASIC_.c  ****          y0 += dy_sym;
 174:GUI_BASIC_.c  ****          if(di<0)
 175:GUI_BASIC_.c  ****          {  di += dx_x2;
 176:GUI_BASIC_.c  ****          }
 177:GUI_BASIC_.c  ****          else
 178:GUI_BASIC_.c  ****          {  di += dx_x2 - dy_x2;
 179:GUI_BASIC_.c  ****             x0 += dx_sym;
 503               	.LM55:
 504 0196 1D15      		cp r17,r13
 505 0198 79F0      		breq .L39
 507               	.LM56:
 508 019a 4C2D      		mov r20,r12
 509 019c 612F      		mov r22,r17
 510 019e 8F2D      		mov r24,r15
 511 01a0 0E94 0000 		call GUI_Point
 513               	.LM57:
 514 01a4 1A0D      		add r17,r10
 516               	.LM58:
 517 01a6 C7FF      		sbrs r28,7
 518 01a8 02C0      		rjmp .L33
 520               	.LM59:
 521 01aa CE0D      		add r28,r14
 522 01ac F4CF      		rjmp .L43
 523               	.L33:
 525               	.LM60:
 526 01ae 8E2D      		mov r24,r14
 527 01b0 801B      		sub r24,r16
 528 01b2 C80F      		add r28,r24
 530               	.LM61:
 531 01b4 F90C      		add r15,r9
 532 01b6 EFCF      		rjmp .L43
 533               	.L39:
 180:GUI_BASIC_.c  ****          }
 181:GUI_BASIC_.c  ****       }
 182:GUI_BASIC_.c  ****       GUI_Point(x0, y0, color);		// 显示最后一点
 535               	.LM62:
 536 01b8 4C2D      		mov r20,r12
 537 01ba 612F      		mov r22,r17
 538 01bc 8F2D      		mov r24,r15
 539 01be 0E94 0000 		call GUI_Point
 540               	.L15:
 541               	/* epilogue: frame size=0 */
 542 01c2 CF91      		pop r28
 543 01c4 1F91      		pop r17
 544 01c6 0F91      		pop r16
 545 01c8 FF90      		pop r15
 546 01ca EF90      		pop r14
 547 01cc DF90      		pop r13
 548 01ce CF90      		pop r12
 549 01d0 BF90      		pop r11
 550 01d2 AF90      		pop r10
 551 01d4 9F90      		pop r9
 552 01d6 0895      		ret
 553               	/* epilogue end (size=11) */
 554               	/* function GUI_Line size 118 (97) */
 565               	.Lscope3:
 570               	.global	GUI_LineS
 572               	GUI_LineS:
 183:GUI_BASIC_.c  ****    } 
 184:GUI_BASIC_.c  ****   
 185:GUI_BASIC_.c  **** }
 186:GUI_BASIC_.c  **** 
 187:GUI_BASIC_.c  **** 
 188:GUI_BASIC_.c  **** #if	GUI_LineWith_EN==1
 189:GUI_BASIC_.c  **** /****************************************************************************
 190:GUI_BASIC_.c  **** * 名称:GUI_LineWith()
 191:GUI_BASIC_.c  **** * 功能:画任意两点之间的直线,并且可设置线的宽度。
 192:GUI_BASIC_.c  **** * 入口参数: x0		直线起点的x坐标值
 193:GUI_BASIC_.c  **** *           y0		直线起点的y坐标值
 194:GUI_BASIC_.c  **** *           x1      直线终点的x坐标值
 195:GUI_BASIC_.c  **** *           y1      直线终点的y坐标值
 196:GUI_BASIC_.c  **** *           with    线宽(0-50)
 197:GUI_BASIC_.c  **** *           color	显示颜色
 198:GUI_BASIC_.c  **** * 出口参数:无
 199:GUI_BASIC_.c  **** * 说明:操作失败原因是指定地址超出有效范围。
 200:GUI_BASIC_.c  **** ****************************************************************************/
 201:GUI_BASIC_.c  **** void  GUI_LineWith(uint32 x0, uint32 y0, uint32 x1, uint32 y1, uint8 with, TCOLOR color)
 202:GUI_BASIC_.c  **** {  int32   dx;						// 直线x轴差值变量
 203:GUI_BASIC_.c  ****    int32   dy;          			// 直线y轴差值变量
 204:GUI_BASIC_.c  ****    int8    dx_sym;					// x轴增长方向,为-1时减值方向,为1时增值方向

⌨️ 快捷键说明

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