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

📄 gui_basic.lst

📁 51单片机在lcd上实现zlg gui,希望好的请多加点分数
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V7.50   GUI_BASIC                                                             09/11/2007 21:56:45 PAGE 5   

              {  int32   dx;                                          // 直线x轴差值变量
                 int32   dy;                                  // 直线y轴差值变量
                 int8    dx_sym;                                      // x轴增长方向,为-1时减值方向,为1时增值方向
                 int8    dy_sym;                                      // y轴增长方向,为-1时减值方向,为1时增值方向
                 int32   dx_x2;                                       // dx*2值变量,用于加快运算速度
                 int32   dy_x2;                                       // dy*2值变量,用于加快运算速度
                 int32   di;                                          // 决策变量
                 
                 int32   wx, wy;                                      // 线宽变量
                 int32   draw_a, draw_b;
                 
                 /* 参数过滤 */
                 if(with==0) return;
                 if(with>50) with = 50;
                 
                 dx = x1-x0;                                          // 求取两点之间的差值
                 dy = y1-y0;
                 
                 wx = with/2;
                 wy = with-wx-1;
                 
                 /* 判断增长方向,或是否为水平线、垂直线、点 */
                 if(dx>0)                                                     // 判断x轴方向
                 {  dx_sym = 1;                                       // dx>0,设置dx_sym=1
                 }
                 else
                 {  if(dx<0)
                    {  dx_sym = -1;                           // dx<0,设置dx_sym=-1
                    }
                    else
                    {  /* dx==0,画垂直线,或一点 */
                       wx = x0-wx;
                       if(wx<0) wx = 0;
                       wy = x0+wy;
                       
                       while(1)
                       {  x0 = wx;
                          GUI_RLine(x0, y0, y1, color);
                          if(wx>=wy) break;
                          wx++;
                       }
                       
                       return;
                    }
                 }
                 
                 if(dy>0)                                                     // 判断y轴方向
                 {  dy_sym = 1;                                       // dy>0,设置dy_sym=1
                 }
                 else
                 {  if(dy<0)
                    {  dy_sym = -1;                           // dy<0,设置dy_sym=-1
                    }
                    else
                    {  /* dy==0,画水平线,或一点 */
                       wx = y0-wx;
                       if(wx<0) wx = 0;
                       wy = y0+wy;
                       
                       while(1)
                       {  y0 = wx;
                          GUI_HLine(x0, y0, x1, color);
C51 COMPILER V7.50   GUI_BASIC                                                             09/11/2007 21:56:45 PAGE 6   

                          if(wx>=wy) break;
                          wx++;
                       }
                       return;
                    }
                 }
                  
                 /* 将dx、dy取绝对值 */
                 dx = dx_sym * dx;
                 dy = dy_sym * dy;
               
                 /* 计算2倍的dx及dy值 */
                 dx_x2 = dx*2;
                 dy_x2 = dy*2;
                 
                 /* 使用Bresenham法进行画直线 */
                 if(dx>=dy)                                           // 对于dx>=dy,则使用x轴为基准
                 {  di = dy_x2 - dx;
                    while(x0!=x1)
                    {  /* x轴向增长,则宽度在y方向,即画垂直线 */
                       draw_a = y0-wx;
                       if(draw_a<0) draw_a = 0;
                       draw_b = y0+wy;
                       GUI_RLine(x0, draw_a, draw_b, color);
                       
                       x0 += dx_sym;                          
                       if(di<0)
                       {  di += dy_x2;                        // 计算出下一步的决策值
                       }
                       else
                       {  di += dy_x2 - dx_x2;
                          y0 += dy_sym;
                       }
                    }
                    draw_a = y0-wx;
                    if(draw_a<0) draw_a = 0;
                    draw_b = y0+wy;
                    GUI_RLine(x0, draw_a, draw_b, color);
                 }
                 else                                                         // 对于dx<dy,则使用y轴为基准
                 {  di = dx_x2 - dy;
                    while(y0!=y1)
                    {  /* y轴向增长,则宽度在x方向,即画水平线 */
                       draw_a = x0-wx;
                       if(draw_a<0) draw_a = 0;
                       draw_b = x0+wy;
                       GUI_HLine(draw_a, y0, draw_b, color);
                       
                       y0 += dy_sym;
                       if(di<0)
                       {  di += dx_x2;
                       }
                       else
                       {  di += dx_x2 - dy_x2;
                          x0 += dx_sym;
                       }
                    }
                    draw_a = x0-wx;
                    if(draw_a<0) draw_a = 0;
                    draw_b = x0+wy;
                    GUI_HLine(draw_a, y0, draw_b, color);
                 } 
C51 COMPILER V7.50   GUI_BASIC                                                             09/11/2007 21:56:45 PAGE 7   

                
              }
              #endif
 368          
 369          
 370          
 371          #if  GUI_CircleX_EN==1
 372          /****************************************************************************
 373          * 名称:GUI_Circle()
 374          * 功能:指定圆心位置及半径,画圆。
 375          * 入口参数: x0         圆心的x坐标值
 376          *           y0          圆心的y坐标值
 377          *           r       圆的半径
 378          *           color       显示颜色
 379          * 出口参数:无
 380          * 说明:操作失败原因是指定地址超出有效范围。
 381          ****************************************************************************/
 382          void  GUI_Circle(uint32 x0, uint32 y0, uint32 r, TCOLOR color)
 383          {  int32  draw_x0, draw_y0;                     // 刽图点坐标变量
 384   1         int32  draw_x1, draw_y1;     
 385   1         int32  draw_x2, draw_y2;     
 386   1         int32  draw_x3, draw_y3;     
 387   1         int32  draw_x4, draw_y4;     
 388   1         int32  draw_x5, draw_y5;     
 389   1         int32  draw_x6, draw_y6;     
 390   1         int32  draw_x7, draw_y7;     
 391   1         int32  xx, yy;                                       // 画圆控制变量
 392   1       
 393   1         int32  di;                                           // 决策变量
 394   1         
 395   1         /* 参数过滤 */
 396   1         if(0==r) return;
 397   1         
 398   1         /* 计算出8个特殊点(0、45、90、135、180、225、270度),进行显示 */
 399   1         draw_x0 = draw_x1 = x0;
 400   1         draw_y0 = draw_y1 = y0 + r;
 401   1         if(draw_y0<GUI_LCM_YMAX) GUI_Point(draw_x0, draw_y0, color); // 90度
 402   1              
 403   1         draw_x2 = draw_x3 = x0;
 404   1         draw_y2 = draw_y3 = y0 - r;
 405   1         if(draw_y2>=0) GUI_Point(draw_x2, draw_y2, color);                   // 270度
 406   1         
 407   1              
 408   1         draw_x4 = draw_x6 = x0 + r;
 409   1         draw_y4 = draw_y6 = y0;
 410   1         if(draw_x4<GUI_LCM_XMAX) GUI_Point(draw_x4, draw_y4, color); // 0度
 411   1         
 412   1         draw_x5 = draw_x7 = x0 - r;
 413   1         draw_y5 = draw_y7 = y0;
 414   1         if(draw_x5>=0) GUI_Point(draw_x5, draw_y5, color);                   // 180度   
 415   1         if(1==r) return;                                     // 若半径为1,则已圆画完
 416   1         
 417   1         
 418   1         /* 使用Bresenham法进行画圆 */
 419   1         di = 3 - 2*r;                                        // 初始化决策变量
 420   1         
 421   1         xx = 0;
 422   1         yy = r;      
 423   1         while(xx<yy)
 424   1         {  if(di<0)
 425   2                {  di += 4*xx + 6;          
 426   3                }
C51 COMPILER V7.50   GUI_BASIC                                                             09/11/2007 21:56:45 PAGE 8   

 427   2                else
 428   2                {  di += 4*(xx - yy) + 10;
 429   3                
 430   3                   yy--;        
 431   3                       draw_y0--;
 432   3                       draw_y1--;
 433   3                       draw_y2++;
 434   3                       draw_y3++;
 435   3                       draw_x4--;
 436   3                       draw_x5++;
 437   3                       draw_x6--;
 438   3                       draw_x7++;             
 439   3                }
 440   2                
 441   2                xx++;   
 442   2                draw_x0++;
 443   2                draw_x1--;
 444   2                draw_x2++;
 445   2                draw_x3--;
 446   2                draw_y4++;
 447   2                draw_y5++;
 448   2                draw_y6--;
 449   2                draw_y7--;
 450   2                      
 451   2              
 452   2                /* 要判断当前点是否在有效范围内 */
 453   2                if( (draw_x0<=GUI_LCM_XMAX)&&(draw_y0>=0) )   
 454   2                {  GUI_Point(draw_x0, draw_y0, color);
 455   3                }         
 456   2                if( (draw_x1>=0)&&(draw_y1>=0) )      
 457   2                {  GUI_Point(draw_x1, draw_y1, color);
 458   3                }
 459   2                if( (draw_x2<=GUI_LCM_XMAX)&&(draw_y2<=GUI_LCM_YMAX) )        
 460   2                {  GUI_Point(draw_x2, draw_y2, color);   
 461   3                }
 462   2                if( (draw_x3>=0)&&(draw_y3<=GUI_LCM_YMAX) )   
 463   2                {  GUI_Point(draw_x3, draw_y3, color);
 464   3                }
 465   2                if( (draw_x4<=GUI_LCM_XMAX)&&(draw_y4>=0) )   
 466   2                {  GUI_Point(draw_x4, draw_y4, color);
 467   3                }
 468   2                if( (draw_x5>=0)&&(draw_y5>=0) )      
 469   2                {  GUI_Point(draw_x5, draw_y5, color);
 470   3                }
 471   2                if( (draw_x6<=GUI_LCM_XMAX)&&(draw_y6<=GUI_LCM_YMAX) )        
 472   2                {  GUI_Point(draw_x6, draw_y6, color);
 473   3                }
 474   2                if( (draw_x7>=0)&&(draw_y7<=GUI_LCM_YMAX) )   
 475   2                {  GUI_Point(draw_x7, draw_y7, color);
 476   3                }
 477   2         }
 478   1      }
 479          
 480          
 481          /****************************************************************************
 482          * 名称:GUI_CircleFill()
 483          * 功能:指定圆心位置及半径,画圆并填充,填充色与边框色一样。
 484          * 入口参数: x0         圆心的x坐标值
 485          *           y0          圆心的y坐标值
 486          *           r       圆的半径
 487          *           color       填充颜色
 488          * 出口参数:无

⌨️ 快捷键说明

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