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