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

📄 gui_basic.lst

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


C51 COMPILER V7.50, COMPILATION OF MODULE GUI_BASIC
OBJECT MODULE PLACED IN .\OBJ\GUI_BASIC.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE GUI_BASIC.C LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\LST\GUI_BASIC.lst) OBJE
                    -CT(.\OBJ\GUI_BASIC.obj)

line level    source

   1          /****************************************************************************************
   2          * 文件名:GUI_BASIC.C
   3          * 功能:GUI基本绘图函数。进行基本绘图运算,并调用相应的刷新程序更新LCD显示。
   4          * 作者:黄绍斌
   5          * 日期:2004.02.26
   6          * 备注:图形操作层,进行各种图形运算操作。
   7          ****************************************************************************************/
   8          #include "config.h"
   9          #include <math.h>
  10          
  11          #if     GUI_Basic_EN==1
  12          /****************************************************************************
  13          * 名称:GUI_Rectangle()
  14          * 功能:画矩形。
  15          * 入口参数: x0         矩形左上角的x坐标值
  16          *           y0          矩形左上角的y坐标值
  17          *           x1      矩形右下角的x坐标值
  18          *           y1      矩形右下角的y坐标值
  19          *           color       显示颜色
  20          * 出口参数:无
  21          * 说明:操作失败原因是指定地址超出有效范围。
  22          ****************************************************************************/
  23          void  GUI_Rectangle(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
  24          {  GUI_HLine(x0, y0, x1, color);
  25   1         GUI_HLine(x0, y1, x1, color);
  26   1         GUI_RLine(x0, y0, y1, color);
  27   1         GUI_RLine(x1, y0, y1, color);
  28   1      }
  29          
  30          
  31          /****************************************************************************
  32          * 名称:GUI_RectangleFill()
  33          * 功能:填充矩形。画一个填充的矩形,填充色与边框色一样。
  34          * 入口参数: x0         矩形左上角的x坐标值
  35          *           y0          矩形左上角的y坐标值
  36          *           x1      矩形右下角的x坐标值
  37          *           y1      矩形右下角的y坐标值
  38          *           color       填充颜色
  39          * 出口参数:无
  40          * 说明:操作失败原因是指定地址超出有效范围。
  41          ****************************************************************************/
  42          void  GUI_RectangleFill(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
  43          {  uint32  i;
  44   1      
  45   1         /* 先找出矩形左上角与右下角的两个点,保存在(x0,y0),(x1,y1) */
  46   1         if(x0>x1)                                            // 若x0>x1,则x0与x1交换
  47   1         {  i = x0;
  48   2            x0 = x1;
  49   2            x1 = i;
  50   2         }
  51   1         if(y0>y1)                                            // 若y0>y1,则y0与y1交换
  52   1         {  i = y0;
  53   2            y0 = y1;
  54   2            y1 = i;
C51 COMPILER V7.50   GUI_BASIC                                                             09/11/2007 21:56:45 PAGE 2   

  55   2         }
  56   1         
  57   1         /* 判断是否只是直线 */
  58   1         if(y0==y1) 
  59   1         {  GUI_HLine(x0, y0, x1, color);
  60   2            return;
  61   2         }
  62   1         if(x0==x1) 
  63   1         {  GUI_RLine(x0, y0, y1, color);
  64   2            return;
  65   2         }
  66   1      
  67   1         while(y0<=y1)                                                
  68   1         {  GUI_HLine(x0, y0, x1, color);     // 当前画水平线
  69   2            y0++;                                                     // 下一行
  70   2         }
  71   1      }
  72          
  73          
  74          /****************************************************************************
  75          * 名称:GUI_Square()
  76          * 功能:画正方形。
  77          * 入口参数: x0         正方形左上角的x坐标值
  78          *           y0          正方形左上角的y坐标值
  79          *           with    正方形的边长
  80          *           color       显示颜色
  81          * 出口参数:无
  82          * 说明:操作失败原因是指定地址超出有效范围。
  83          ****************************************************************************/
  84          void  GUI_Square(uint32 x0, uint32 y0, uint32  with, TCOLOR  color)
  85          {   if(with==0) return;
  86   1              if( (x0+with) > GUI_LCM_XMAX ) return;
  87   1              if( (y0+with) > GUI_LCM_YMAX ) return;
  88   1              GUI_Rectangle(x0, y0, x0+with, y0+with, color);
  89   1      }
  90          
  91          
  92          
  93          /****************************************************************************
  94          * 名称:GUI_Line()
  95          * 功能:画任意两点之间的直线。
  96          * 入口参数: x0         直线起点的x坐标值
  97          *           y0          直线起点的y坐标值
  98          *           x1      直线终点的x坐标值
  99          *           y1      直线终点的y坐标值
 100          *           color       显示颜色(对于黑白色LCM,为0时灭,为1时显示)
 101          * 出口参数:无
 102          * 说明:操作失败原因是指定地址超出有效范围。
 103          ****************************************************************************/
 104          void  GUI_Line(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
 105          {  int32   dx;                                          // 直线x轴差值变量
 106   1         int32   dy;                                  // 直线y轴差值变量
 107   1         int8    dx_sym;                                      // x轴增长方向,为-1时减值方向,为1时增值方向
 108   1         int8    dy_sym;                                      // y轴增长方向,为-1时减值方向,为1时增值方向
 109   1         int32   dx_x2;                                       // dx*2值变量,用于加快运算速度
 110   1         int32   dy_x2;                                       // dy*2值变量,用于加快运算速度
 111   1         int32   di;                                          // 决策变量
 112   1         
 113   1         
 114   1         dx = x1-x0;                                          // 求取两点之间的差值
 115   1         dy = y1-y0;
 116   1         
C51 COMPILER V7.50   GUI_BASIC                                                             09/11/2007 21:56:45 PAGE 3   

 117   1         /* 判断增长方向,或是否为水平线、垂直线、点 */
 118   1         if(dx>0)                                                     // 判断x轴方向
 119   1         {  dx_sym = 1;                                       // dx>0,设置dx_sym=1
 120   2         }
 121   1         else
 122   1         {  if(dx<0)
 123   2            {  dx_sym = -1;                           // dx<0,设置dx_sym=-1
 124   3            }
 125   2            else
 126   2            {  // dx==0,画垂直线,或一点
 127   3               GUI_RLine(x0, y0, y1, color);
 128   3               return;
 129   3            }
 130   2         }
 131   1         
 132   1         if(dy>0)                                                     // 判断y轴方向
 133   1         {  dy_sym = 1;                                       // dy>0,设置dy_sym=1
 134   2         }
 135   1         else
 136   1         {  if(dy<0)
 137   2            {  dy_sym = -1;                           // dy<0,设置dy_sym=-1
 138   3            }
 139   2            else
 140   2            {  // dy==0,画水平线,或一点
 141   3               GUI_HLine(x0, y0, x1, color);
 142   3               return;
 143   3            }
 144   2         }
 145   1          
 146   1         /* 将dx、dy取绝对值 */
 147   1         dx = dx_sym * dx;
 148   1         dy = dy_sym * dy;
 149   1       
 150   1         /* 计算2倍的dx及dy值 */
 151   1         dx_x2 = dx*2;
 152   1         dy_x2 = dy*2;
 153   1         
 154   1         /* 使用Bresenham法进行画直线 */
 155   1         if(dx>=dy)                                           // 对于dx>=dy,则使用x轴为基准
 156   1         {  di = dy_x2 - dx;
 157   2            while(x0!=x1)
 158   2            {  GUI_Point(x0, y0, color);
 159   3               x0 += dx_sym;
 160   3               if(di<0)
 161   3               {  di += dy_x2;                        // 计算出下一步的决策值
 162   4               }
 163   3               else
 164   3               {  di += dy_x2 - dx_x2;
 165   4                  y0 += dy_sym;
 166   4               }
 167   3            }
 168   2            GUI_Point(x0, y0, color);         // 显示最后一点
 169   2         }
 170   1         else                                                         // 对于dx<dy,则使用y轴为基准
 171   1         {  di = dx_x2 - dy;
 172   2            while(y0!=y1)
 173   2            {  GUI_Point(x0, y0, color);
 174   3               y0 += dy_sym;
 175   3               if(di<0)
 176   3               {  di += dx_x2;
 177   4               }
 178   3               else
C51 COMPILER V7.50   GUI_BASIC                                                             09/11/2007 21:56:45 PAGE 4   

 179   3               {  di += dx_x2 - dy_x2;
 180   4                  x0 += dx_sym;
 181   4               }
 182   3            }
 183   2            GUI_Point(x0, y0, color);         // 显示最后一点
 184   2         } 
 185   1        
 186   1      }
 187          
 188          #endif
 189          
 190          #if GUI_LineSX_EN==1
              /****************************************************************************
              * 名称:GUI_LineS()
              * 功能:多个点之间的连续连线。从第一点连到第二点,再连到第三点...
              * 入口参数: points  多个点坐标数据的指针,数据排列为(x0,y0)、(x1,y1)、(x2,y2)...
              *           no      点数目,至少要大于1
              *           color       显示颜色
              * 出口参数:无
              * 说明:操作失败原因是指定地址超出有效范围。
              ****************************************************************************/
              void  GUI_LineS(uint32 const *points, uint8 no, TCOLOR color)
              {  uint32  x0, y0;
                 uint32  x1, y1;
                 uint8  i;
              
                 /* 入口参数过滤 */
                 if(0==no) return;
                 if(1==no)                                            // 单点
                 {  x0 = *points++;
                    y0 = *points;
                    GUI_Point(x0, y0, color);
                 }
                 
                 /* 画多条线条 */
                 x0 = *points++;                                      // 取出第一点坐标值,作为原起点坐标值
                 y0 = *points++;
                 for(i=1; i<no; i++)
                 {  x1 = *points++;                           // 取出下一点坐标值
                    y1 = *points++;
                    GUI_Line(x0, y0, x1, y1, color);
                    x0 = x1;                                          // 更新原起点坐标
                    y0 = y1;
                 }
              }
              #endif
 225          
 226          
 227          #if     GUI_LineWith_EN==1
              /****************************************************************************
              * 名称:GUI_LineWith()
              * 功能:画任意两点之间的直线,并且可设置线的宽度。
              * 入口参数: x0         直线起点的x坐标值
              *           y0          直线起点的y坐标值
              *           x1      直线终点的x坐标值
              *           y1      直线终点的y坐标值
              *           with    线宽(0-50)
              *           color       显示颜色
              * 出口参数:无
              * 说明:操作失败原因是指定地址超出有效范围。
              ****************************************************************************/
              void  GUI_LineWith(uint32 x0, uint32 y0, uint32 x1, uint32 y1, uint8 with, TCOLOR color)

⌨️ 快捷键说明

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