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

📄 gui_basic.lst

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

              /****************************************************************************
              * 名称:GUI_CmpPointColor()
              * 功能:判断指定点上的颜色是否为某种颜色。
              * 入口参数:x                   指定点的x轴坐标值
              *                  y            指定点的y轴坐标值
              *          color        颜色值
              * 出口参数:返回1表示相同,返回0表示不相同。
              * 说明:
              ****************************************************************************/
              int  GUI_CmpPointColor(uint32 x, uint32 y, TCOLOR color)
              {  TCOLOR  bakc;
                 
                 GUI_ReadPoint(x, y, &bakc);
                 return( GUI_CmpColor(bakc,color) );  
              }
              
              
              /* 定义折点个数 */
              #ifndef  DOWNP_N
              #define  DOWNP_N                20
              #endif
              #ifndef  UPP_N
              #define  UPP_N                  20
              #endif
              /****************************************************************************
              * 名称:GUI_FloodFill()
              * 功能:图形填充,将指定点内的封闭图形进行填充。对指定点的颜色区域进行填充,即不是该颜色
              *      的像素为边界(如,指定点上的颜色为红色,则其它颜色像素均为边界)。
              * 入口参数: x0         指定点的x坐标值
              *           y0          指定点的y坐标值
              *           color       填充颜色
              * 出口参数:无
              * 说明:操作失败原因是指定地址超出有效范围、指定点不在封闭图形内。
              ****************************************************************************/
              void  GUI_FloodFill(uint32 x0, uint32 y0, TCOLOR color)
              {  PointXY  down_point[DOWNP_N];        // 定义向下填充转折点缓冲区
                 uint8    down_no;                            // 向下折点个数
                 PointXY  up_point[UPP_N];            // 定义向上填充转折点缓冲区
                 uint8    up_no;                                      // 向上折点个数
                 TCOLOR   fcolor;                                     // 填充点上的颜色
                 
                 uint32  xx, yy;                                      // 填充临时x,y变量 (当前填充行的中点)
                 uint32  xx0;                                         // 当前填充行的左x值变量
                 uint32  xx1;                                         // 当前填充行的右y值变量
                 uint32  i;
                 
                 uint32  x0_bak, y0_bak;
                 uint32  x1_bak;
                 
                 /* 参数过滤 */
                 if(x0>=GUI_LCM_XMAX) return;
                 if(y0>=GUI_LCM_YMAX) return;
                 
                 /* 判断指定点是否为填充颜色,若是则直接返回 */
                 GUI_ReadPoint(x0, y0, &fcolor);                                              // 取得填充点的颜色
                 if( GUI_CmpColor(fcolor,color)!=0 ) return;
                 
                 y0_bak = y0;
                 x0_bak = xx0 = GUI_ReadLeftPoint(x0, y0, fcolor);                            // 找出当前y坐标上的最左边的点
                 x1_bak = xx1 = GUI_ReadRightPoint(x0, y0, fcolor);                   // 找出当前y坐标上的最右边的点
                 down_point[0].x = up_point[0].x = (xx1 + xx0)/2;
                 down_point[0].y = up_point[0].y = y0;
C51 COMPILER V7.50   GUI_BASIC                                                             09/11/2007 21:56:45 PAGE 18  

                 down_no = 1;
                 up_no = 1;
                                                      
                 /* 开始向上填充 */
              FILL_UP:  
                 if(0==up_no) goto FILL_DOWN;                                                 // 若向下扫描已完成,则退出
                 xx = up_point[up_no-1].x;                                                    // 否则取出下一折点
                 yy = up_point[up_no-1].y;
                 up_no--; 
                 xx0 = GUI_ReadLeftPoint(xx, yy, fcolor);
                 xx1 = GUI_ReadRightPoint(xx, yy, fcolor);
                 while(1) 
                 {  yy += 1;                                                                                  // 中心点向上一点
                     
                    if( GUI_CmpPointColor(xx, yy, fcolor)==0 )                                        
                    {  /* 判断此点是否为终点,若是则退出此次循环 */
                       for(i=xx0; i<=xx1; i++)                                        // 查找此行是否有需填充点
                       {  if( GUI_CmpPointColor(i, yy, fcolor)!=0 ) break;
                       }
                       if(i>xx1) goto FILL_UP; 
                       
                       /* 找出新一行中最右边的点 */
                       xx = i;                                                                                // 更新xx到要填充的有效区域内
                       xx1 = GUI_ReadRightPoint(xx, yy, fcolor);
                    }
                    else
                    {  /* 找出新一行中最右边的点 */
                       xx1 = GUI_ReadRightPoint(xx, yy, fcolor);
                    }
                    xx0 = GUI_ReadLeftPoint(xx, yy, fcolor);
                    
                    /* 向下折点。使用y0作为折点变量,x0作为上一折点变量 */
                    if(down_no<DOWNP_N)
                    {  y0 = xx0;
                       x0 = y0-1;
                       for(i=y0; i<=xx1; i++)
                       {  if( GUI_CmpPointColor(i, yy-1, fcolor)==0 ) // 更新折点
                          {  y0 = i;                                                                          
                          }
                          else
                          {  if(x0!=y0)                                                               // 找到新的折点
                             {  x0 = y0;
                                down_point[down_no].x = i;
                                down_point[down_no].y = yy;
                                down_no++;
                             }
                          }
                          if(down_no>=DOWNP_N) break;                                 // 若缓冲区已保存满,则退出
                       } // end  of for(i=y0+1; i<xx1; i++)
                    } // end of if(down_no<DOWNP_N)
                    
                    xx = (xx1 + xx0)/2;                                                               // 更新中心点
                    GUI_HLine(xx0, yy, xx1, color);                                   // 填充一行
                    
                    /* 向上折点。使用y0作为折点变量,x0作为上一折点变量 */
                    if(up_no<UPP_N)
                    {  y0 = xx0;
                       x0 = y0-1;
                       for(i=y0; i<=xx1; i++)
                       {  if( GUI_CmpPointColor(i, yy+1, fcolor)==0 ) // 更新折点
                          {  y0 = i;                                                                          
                          }
C51 COMPILER V7.50   GUI_BASIC                                                             09/11/2007 21:56:45 PAGE 19  

                          else
                          {  if(x0!=y0)                                                               // 找到新的折点
                             {  x0 = y0;
                                up_point[up_no].x = i;
                                up_point[up_no].y = yy;
                                up_no++;
                             }
                          }
                          if(up_no>=UPP_N) break;                                             // 若缓冲区已保存满,则退出
                       }
                    } // end of if(up_no<UPP_N)
                    
                 } // end of while(1) 
              
                 /* 向下填充 */
              FILL_DOWN: 
                 if(0==down_no) 
                 {  if(0==up_no) 
                    {  GUI_HLine(x0_bak, y0_bak, x1_bak, color);
                       return;                                                                // 若向下扫描已完成,且没有发现新的向上折点,则退出
                    }
                    else
                    {  goto FILL_UP;
                    }
                 }
                 xx = down_point[down_no-1].x;                                                // 否则取出下一折点
                 yy = down_point[down_no-1].y;
                 down_no--;
                 xx0 = GUI_ReadLeftPoint(xx, yy, fcolor);
                 xx1 = GUI_ReadRightPoint(xx, yy, fcolor);
                 
                 while(1) 
                 {  yy -= 1;                                                                                  // 中心点向上一点 
                    if( GUI_CmpPointColor(xx, yy, fcolor)==0 )                                        
                    {  /* 判断此点是否为终点,若是则退出此次循环 */
                       for(i=xx0; i<=xx1; i++)                                        // 查找下一行是否有需填充点
                       {  if( GUI_CmpPointColor(i, yy, fcolor)!=0 ) break;
                       }
                       if(i>xx1) goto FILL_DOWN; 
                       
                       /* 找出新一行中最右边的点 */
                       xx = i;
                       xx1 = GUI_ReadRightPoint(xx, yy, fcolor);
                    }
                    else
                    {  /* 找出新一行中最右边的点 */
                       xx1 = GUI_ReadRightPoint(xx, yy, fcolor);
                    }
                    xx0 = GUI_ReadLeftPoint(xx, yy, fcolor);
                          
                    /* 向上折点。使用y0作为折点变量,x0作为上一折点变量 */
                    if(up_no<UPP_N)
                    {  y0 = xx0;
                       x0 = y0-1;
                       for(i=y0; i<=xx1; i++)
                       {  if( GUI_CmpPointColor(i, yy+1, fcolor)==0 ) // 更新折点
                          {  y0 = i;                                                                          
                          }
                          else
                          {  if(x0!=y0)                                                               // 找到新的折点
                             {  x0 = y0;
                                up_point[up_no].x = i;
C51 COMPILER V7.50   GUI_BASIC                                                             09/11/2007 21:56:45 PAGE 20  

                                up_point[up_no].y = yy;
                                up_no++;
                             }
                          }
                          if(up_no>=UPP_N) break;                                             // 若缓冲区已保存满,则退出
                       }
                    }
                          
                    xx = (xx1 + xx0)/2; 
                    GUI_HLine(xx0, yy, xx1, color);                                   // 填充一行
                    
                    /* 向下折点。使用y0作为折点变量,x0作为上一折点变量 */
                    if(down_no<DOWNP_N)
                    {  y0 = xx0;
                       x0 = y0-1;
                       for(i=y0; i<=xx1; i++)
                       {  if( GUI_CmpPointColor(i, yy-1, fcolor)==0 ) // 更新折点
                          {  y0 = i;                                                                          
                          }
                          else
                          {  if(x0!=y0)                                                               // 找到新的折点
                             {  x0 = y0;
                                down_point[down_no].x = i;
                                down_point[down_no].y = yy;
                                down_no++;
                             }
                          }
                          if(down_no>=DOWNP_N) break;                                 // 若缓冲区已保存满,则退出
                       }
                    } // end of if(down_no<DOWNP_N)
                    
                 } // end of while(1) 
                 
                 GUI_HLine(x0_bak, y0_bak, x1_bak, color);
              }
              #endif
1207          
1208          
1209          
1210          
1211          #if  GUI_ArcX_EN==1
              /****************************************************************************
              * 名称:GUI_Arc4()
              * 功能:画弧。起点及终点只能为0度-90度、90度-180度、180度-270度、270度-0度等。即分别
              *      为第1-4像限的90度弧。
              * 入口参数: x0         圆心的x坐标值
              *           y0          圆心的y坐标值
              *           r       圆弧的半径
              *           angle       画弧的像限(1-4)
              *           color       显示颜色
              * 出口参数:无
              * 说明:操作失败原因是指定地址超出有效范围。
              ****************************************************************************/
              void  GUI_Arc4(uint32 x, uint32 y, uint32 r, uint8 angle, TCOLOR color)
              {  int32  draw_x, draw_y;
              
                 int32  op_x, op_y;
                 int32  op_2rr;
                 
                 if(r==0) return;
                 
          

⌨️ 快捷键说明

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