📄 gui_basic_.lst
字号:
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 + -