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

📄 guibasic.lst

📁 SED1335驱动程序(LCD320*240)含GUI
💻 LST
📖 第 1 页 / 共 4 页
字号:
 242                   if(di<0)
 243                   {  di += dy_x2;                        // 计算出下一步的决策值
 244                   }
 245                   else
 246                   {  di += dy_x2 - dx_x2;
 247                      y0 += dy_sym;
 248                   }
 249                }
 250                GUI_Point(x0, y0, color);         // 显示最后一点
 251             }
 252             else                                                         // 对于dx<dy,则使用y轴为基准
 253             {  di = dx_x2 - dy;
 254                while(y0!=y1)
 255                {  GUI_Point(x0, y0, color);
 256                   y0 += dy_sym;
 257                   if(di<0)
 258                   {  di += dx_x2;
 259                   }
 260                   else
 261                   {  di += dx_x2 - dy_x2;
 262                      x0 += dx_sym;
 263                   }
 264                }
 265                GUI_Point(x0, y0, color);         // 显示最后一点
 266             } 
 267            
 268          }
 269          /****************************************************************************
 270          * 名称:GUI_LineWith()
 271          * 功能:画任意两点之间的直线,并且可设置线的宽度。
 272          * 入口参数: x0         直线起点的x坐标值
 273          *           y0          直线起点的y坐标值
 274          *           x1      直线终点的x坐标值
 275          *           y1      直线终点的y坐标值
 276          *           with    线宽(0-50)
 277          *           color       显示颜色
 278          * 出口参数:无
 279          * 说明:操作失败原因是指定地址超出有效范围。
 280          ****************************************************************************/
 281          void  GUI_LineWith(uint32 x0, uint32 y0, uint32 x1, uint32 y1, uint8 with, uint8 color)
 282          {  int32   dx;                                          // 直线x轴差值变量
 283             int32   dy;                                  // 直线y轴差值变量
 284             int8    dx_sym;                                      // x轴增长方向,为-1时减值方向,为1时增值方向
 285             int8    dy_sym;                                      // y轴增长方向,为-1时减值方向,为1时增值方向
 286             int32   dx_x2;                                       // dx*2值变量,用于加快运算速度
 287             int32   dy_x2;                                       // dy*2值变量,用于加快运算速度
 288             int32   di;                                          // 决策变量
 289             
 290             int32   wx, wy;                                      // 线宽变量
 291             int32   draw_a, draw_b;
 292             
 293             /* 参数过滤 */
 294             if(with==0) return;
 295             if(with>50) with = 50;
 296             
 297             dx = x1-x0;                                          // 求取两点之间的差值
 298             dy = y1-y0;
 299             
C51 COMPILER V8.09   GUIBASIC                                                              12/12/2007 14:46:39 PAGE 6   

 300             wx = with/2;
 301             wy = with-wx-1;
 302             
 303             /* 判断增长方向,或是否为水平线、垂直线、点 */
 304             if(dx>0)                                                     // 判断x轴方向
 305             {  dx_sym = 1;                                       // dx>0,设置dx_sym=1
 306             }
 307             else
 308             {  if(dx<0)
 309                {  dx_sym = -1;                           // dx<0,设置dx_sym=-1
 310                }
 311                else
 312                {  /* dx==0,画垂直线,或一点 */
 313                   wx = x0-wx;
 314                   if(wx<0) wx = 0;
 315                   wy = x0+wy;
 316                   
 317                   while(1)
 318                   {  x0 = wx;
 319                      GUI_RLine(x0, y0, y1, color);
 320                      if(wx>=wy) break;
 321                      wx++;
 322                   }
 323                   
 324                   return;
 325                }
 326             }
 327             
 328             if(dy>0)                                                     // 判断y轴方向
 329             {  dy_sym = 1;                                       // dy>0,设置dy_sym=1
 330             }
 331             else
 332             {  if(dy<0)
 333                {  dy_sym = -1;                           // dy<0,设置dy_sym=-1
 334                }
 335                else
 336                {  /* dy==0,画水平线,或一点 */
 337                   wx = y0-wx;
 338                   if(wx<0) wx = 0;
 339                   wy = y0+wy;
 340                   
 341                   while(1)
 342                   {  y0 = wx;
 343                      GUI_HLine(x0, y0, x1, color);
 344                      if(wx>=wy) break;
 345                      wx++;
 346                   }
 347                   return;
 348                }
 349             }
 350              
 351             /* 将dx、dy取绝对值 */
 352             dx = dx_sym * dx;
 353             dy = dy_sym * dy;
 354           
 355             /* 计算2倍的dx及dy值 */
 356             dx_x2 = dx*2;
 357             dy_x2 = dy*2;
 358             
 359             /* 使用Bresenham法进行画直线 */
 360             if(dx>=dy)                                           // 对于dx>=dy,则使用x轴为基准
 361             {  di = dy_x2 - dx;
C51 COMPILER V8.09   GUIBASIC                                                              12/12/2007 14:46:39 PAGE 7   

 362                while(x0!=x1)
 363                {  /* x轴向增长,则宽度在y方向,即画垂直线 */
 364                   draw_a = y0-wx;
 365                   if(draw_a<0) draw_a = 0;
 366                   draw_b = y0+wy;
 367                   GUI_RLine(x0, draw_a, draw_b, color);
 368                   
 369                   x0 += dx_sym;                          
 370                   if(di<0)
 371                   {  di += dy_x2;                        // 计算出下一步的决策值
 372                   }
 373                   else
 374                   {  di += dy_x2 - dx_x2;
 375                      y0 += dy_sym;
 376                   }
 377                }
 378                draw_a = y0-wx;
 379                if(draw_a<0) draw_a = 0;
 380                draw_b = y0+wy;
 381                GUI_RLine(x0, draw_a, draw_b, color);
 382             }
 383             else                                                         // 对于dx<dy,则使用y轴为基准
 384             {  di = dx_x2 - dy;
 385                while(y0!=y1)
 386                {  /* y轴向增长,则宽度在x方向,即画水平线 */
 387                   draw_a = x0-wx;
 388                   if(draw_a<0) draw_a = 0;
 389                   draw_b = x0+wy;
 390                   GUI_HLine(draw_a, y0, draw_b, color);
 391                   
 392                   y0 += dy_sym;
 393                   if(di<0)
 394                   {  di += dx_x2;
 395                   }
 396                   else
 397                   {  di += dx_x2 - dy_x2;
 398                      x0 += dx_sym;
 399                   }
 400                }
 401                draw_a = x0-wx;
 402                if(draw_a<0) draw_a = 0;
 403                draw_b = x0+wy;
 404                GUI_HLine(draw_a, y0, draw_b, color);
 405             } 
 406            
 407          }
 408          /****************************************************************************
 409          * 名称:GUI_DrawLineS()
 410          * 功能:多个点之间的连续连线。从第一点连到第二点,再连到第三点...
 411          * 入口参数: points  多个点坐标数据的指针,数据排列为(x0,y0)、(x1,y1)、(x2,y2)...
 412          *           no      点数目,至少要大于1
 413          *           color       显示颜色
 414          * 出口参数:无
 415          * 说明:操作失败原因是指定地址超出有效范围。
 416          ****************************************************************************/
 417          void  GUI_LineS(uint32 const *points, uint8 no, uint8 color)
 418          {  uint32  x0, y0;
 419             uint32  x1, y1;
 420             uint8  i;
 421          
 422             /* 入口参数过滤 */
 423             if(0==no) return;
C51 COMPILER V8.09   GUIBASIC                                                              12/12/2007 14:46:39 PAGE 8   

 424             if(1==no)                                            // 单点
 425             {  x0 = *points++;
 426                y0 = *points;
 427                GUI_Point(x0, y0, color);
 428             }
 429             
 430             /* 画多条线条 */
 431             x0 = *points++;                                      // 取出第一点坐标值,作为原起点坐标值
 432             y0 = *points++;
 433             for(i=1; i<no; i++)
 434             {  x1 = *points++;                           // 取出下一点坐标值
 435                y1 = *points++;
 436                GUI_Line(x0, y0, x1, y1, color);
 437                x0 = x1;                                          // 更新原起点坐标
 438                y0 = y1;
 439             }
 440          }
 441          
 442          
 443          /****************************************************************************
 444          * 名称:GUI_Circle()
 445          * 功能:指定圆心位置及半径,画圆。
 446          * 入口参数: x0         圆心的x坐标值
 447          *           y0          圆心的y坐标值
 448          *           r       圆的半径
 449          *           color       显示颜色
 450          * 出口参数:无
 451          * 说明:操作失败原因是指定地址超出有效范围。
 452          ****************************************************************************/
 453          void  GUI_Circle(uint32 x0, uint32 y0, uint32 r, uint8 color)
 454          {  int32  draw_x0, draw_y0;                     // 刽图点坐标变量
 455             int32  draw_x1, draw_y1;     
 456             int32  draw_x2, draw_y2;     
 457             int32  draw_x3, draw_y3;     
 458             int32  draw_x4, draw_y4;     
 459             int32  draw_x5, draw_y5;     
 460             int32  draw_x6, draw_y6;     
 461             int32  draw_x7, draw_y7;     
 462             int32  xx, yy;                                       // 画圆控制变量
 463           
 464             int32  di;                                           // 决策变量
 465             
 466             /* 参数过滤 */
 467             if(0==r) return;
 468             
 469             /* 计算出8个特殊点(0、45、90、135、180、225、270度),进行显示 */
 470             draw_x0 = draw_x1 = x0;
 471             draw_y0 = draw_y1 = y0 + r;
 472             if(draw_y0<SCREEN_HIGHT) GUI_Point(draw_x0, draw_y0, color); // 90度
 473                  
 474             draw_x2 = draw_x3 = x0;
 475             draw_y2 = draw_y3 = y0 - r;
 476             if(draw_y2>=0) GUI_Point(draw_x2, draw_y2, color);                   // 270度
 477             
 478                  
 479             draw_x4 = draw_x6 = x0 + r;
 480             draw_y4 = draw_y6 = y0;
 481             if(draw_x4<SCREEN_WIDTH) GUI_Point(draw_x4, draw_y4, color); // 0度
 482             
 483             draw_x5 = draw_x7 = x0 - r;
 484             draw_y5 = draw_y7 = y0;
 485             if(draw_x5>=0) GUI_Point(draw_x5, draw_y5, color);                   // 180度   
C51 COMPILER V8.09   GUIBASIC                                                              12/12/2007 14:46:39 PAGE 9   

 486             if(1==r) return;                                     // 若半径为1,则已圆画完
 487             
 488             
 489             /* 使用Bresenham法进行画圆 */
 490             di = 3 - 2*r;                                        // 初始化决策变量
 491             
 492             xx = 0;
 493             yy = r;      
 494             while(xx<yy)
 495             {  if(di<0)

⌨️ 快捷键说明

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