📄 demo.lst
字号:
430 {
431 1 uint idata i;
432 1
433 1 for(i=x1;i<=x2;i++)
434 1 draw_dot(i,y);
435 1 }
436
437 // 函数功能: 画垂直线
438 // 横坐标: 固定为 x
439 // y1: 起始纵坐标; y2: 终点纵坐标
440 void draw_vertical(uchar y1,uchar y2,int x)
441 {
442 1 uchar idata i;
443 1
444 1 for(i=y1;i<=y2;i++)
445 1 draw_dot(x,i);
446 1 }
447
448 // 函数功能:画任意斜率的直线
449 // 起点坐标: x1:(0~319),y1:(0~239)
450 // 终点坐标: x2:(0~319),y2:(0~239)
451 void draw_bias(int x1,uchar y1,int x2,uchar y2)
452 {
453 1 uint idata i;
454 1 int idata err=0;
455 1 int idata delta_x,delta_y;
456 1
457 1 if(y2<y1) // 此步骤使起点纵坐标小于等于终点纵坐标
458 1 { err=x1;
459 2 x1=x2;
460 2 x2=err;
461 2
462 2 i=y1;
463 2 y1=y2;
464 2 y2=(uchar)i;
465 2 }
466 1
467 1 delta_x=x2-x1;
468 1 delta_y=(int)(y2-y1);
469 1
470 1 if(delta_x>=0)
471 1 { if(delta_y<=delta_x) // 斜率 K:0~1
472 2 { for(i=x1;i<x2;i++)
473 3 { draw_dot(x1,y1);
474 4 x1++;
475 4 if(err<0)
476 4 err+=delta_y;
477 4 else
478 4 { y1++;
479 5 err=err+delta_y-delta_x;
480 5 }
481 4 }
482 3 }
483 2 else // 斜率 K>1
484 2 { for(i=y1;i<y2;i++)
485 3 { draw_dot(x1,y1);
486 4 y1++;
487 4 if(err<0)
488 4 { x1++;
489 5 err=err+delta_y-delta_x;
C51 COMPILER V7.07 DEMO 01/12/2007 17:28:05 PAGE 9
490 5 }
491 4 else
492 4 err-=delta_x;
493 4 }
494 3 }
495 2 }
496 1 else if(delta_x<0)
497 1 { delta_x=0-delta_x;
498 2
499 2 if(delta_y<=delta_x) // 斜率 K: -1~0
500 2 { for(i=x1;i>x2;i--)
501 3 { draw_dot(x1,y1);
502 4 x1--;
503 4 if(err<0)
504 4 err+=delta_y;
505 4 else
506 4 { y1++;
507 5 err=err+delta_y-delta_x;
508 5 }
509 4 }
510 3 }
511 2 else // 斜率 K < -1
512 2 { for(i=y1;i<y2;i++)
513 3 { draw_dot(x1,y1);
514 4 y1++;
515 4 if(err<0)
516 4 { x1--;
517 5 err=err+delta_y-delta_x;
518 5 }
519 4 else
520 4 err-=delta_x;
521 4 }
522 3 }
523 2 }
524 1 }
525
526
527 /*void draw_line(int startx,uchar starty,int endx,uchar endy)
528 {
529 register char t,distance;
530 int xerr=0,yerr=0,delta_x,
531 char delta_y;
532 char incx,incy;
533
534 // compute the distance in both directions
535 delta_x=endx-startx;
536 delta_y=endy-starty;
537
538 // compute the direction of the increment ,
539 // an increment of "0" means either a vertical or horizontal lines
540
541 if(delta_x>0)
542 incx=1;
543 else if( delta_x==0 )
544 incx=0;
545 else incx=-1;
546
547
548 if(delta_y>0)
549 incy=1;
550 else if( delta_y==0 )
551 incy=0;
C51 COMPILER V7.07 DEMO 01/12/2007 17:28:05 PAGE 10
552 else incy=-1;
553
554 // determine which distance is greater
555 delta_x = cabs( delta_x ); // 取绝对值
556 delta_y = cabs( delta_y );
557
558 if( delta_x > delta_y )
559 distance=delta_x;
560 else distance=delta_y;
561
562 //draw the line
563 for( t=0;t <= distance+1; t++ )
564 {
565 draw_dot(startx,starty);
566 xerr += delta_x;
567 yerr += delta_y;
568
569 if( xerr > distance )
570 {
571 xerr-=distance;
572 startx+=incx;
573 }
574 if( yerr > distance )
575 {
576 yerr-=distance;
577 starty+=incy;
578 }
579 }
580 }
581 */
582
583
584 // 函数功能:画圆
585 // 圆心坐标: x0,y0
586 // 半径: radius
587 // 说明:为了不使画圆速度太慢,没有对坐标位置是否超出屏幕范围做判断
588 // 所以在调用时,应该保证圆周上点的坐标不会超出显示屏幕,否则可能得到错误的显示
589 void draw_circle(int x0,uchar y0,uchar radius)
590 {
591 1 long idata delta1,delta2;
592 1 int idata x1,x2,tempx;
593 1 uchar idata y1,y2,tempy;
594 1
595 1 x1=0;
596 1 y1=radius;
597 1 x2=(int)radius;
598 1 y2=0;
599 1
600 1 draw_dot(x1+x0,y1+y0);
601 1 draw_dot(x2+x0,y2+y0);
602 1 draw_dot(x1+x0,y0-y1);
603 1 draw_dot(x0-x2,y2+y0);
604 1
605 1 while(1)
606 1 {
607 2 delta1=(x1+1)*(x1+1)+(y1+radius)*(y1-radius)-y1;
608 2 x1++;
609 2 if(delta1>0)
610 2 y1--;
611 2 draw_dot(x1+x0,y1+y0); // 画第 1 象限 45°~90° 圆弧
612 2 tempx=x0-x1;
613 2 tempy=y0-y1;
C51 COMPILER V7.07 DEMO 01/12/2007 17:28:05 PAGE 11
614 2 draw_dot(tempx,y1+y0); // 镜像画第 2 象限 90°~135° 圆弧
615 2 draw_dot(tempx,tempy); // 镜像画第 3 象限 225°~270° 圆弧
616 2 draw_dot(x1+x0,tempy); // 镜像画第 4 象限 270°~315° 圆弧
617 2 if(y1==y2)
618 2 break;
619 2
620 2 delta2=(y2+1)*(y2+1)+(x2+radius)*(x2-radius)-x2;
621 2 y2++;
622 2 if(delta2>0)
623 2 x2--;
624 2 draw_dot(x2+x0,y2+y0); // 画第 1 象限 0°~45° 圆弧
625 2 tempx=x0-x2;
626 2 tempy=y0-y2;
627 2 draw_dot(tempx,y2+y0); // 镜像画第 2 象限 135°~180° 圆弧
628 2 draw_dot(tempx,tempy); // 镜像画第 3 象限 180°~225° 圆弧
629 2 draw_dot(x2+x0,tempy); // 镜像画第 4 象限 315°~360° 圆弧
630 2 if(y1==y2)
631 2 break;
632 2 }
633 1 }
634
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2274 ----
CONSTANT SIZE = 546 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 16 22
IDATA SIZE = ---- 53
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -