disp_drive.lst

来自「在keil和proteus中实现两片51单片机的通信。。。」· LST 代码 · 共 385 行

LST
385
字号
C51 COMPILER V7.50   DISP_DRIVE                                                            01/04/2009 21:53:55 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE DISP_DRIVE
OBJECT MODULE PLACED IN Disp_drive.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Disp_drive.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*
   2          ****************************************************
   3          
   4                          显示
   5          
   6          ****************************************************
   7          */
   8          #include<rtx51tny.h>
   9          #include <reg52.H>
  10          #include "Typedef.H"
  11          #include "Disp_drive.h"
  12          #include "UserDef.H"
  13          
  14          
  15          /* 端口定义 */
  16          #define DISPDATAPORT    P0              //数据端口
  17          sbit Pin_RS = P2^5;                             //指令、数据选择(0=指令;1=数据)
  18          sbit Pin_RW = P2^6;                             //读写选择(0=写,1=读)
  19          sbit Pin_E = P2^7;                              //锁存(下降沿有效)
  20          
  21          
  22          /*  全局变量 */
  23          static INT8U idata DispBuffer[2][MAXDISPLEN];           //显示内容缓冲区
  24          static INT8U idata DispPro[2][MAXDISPLEN];              //显示属性缓冲区
  25          //显示属性定义
  26          #define PRO_BLINK       (1<<1)  //闪烁
  27          
  28          
  29          /***************************************
  30          
  31                  LCD忙等待
  32          
  33          ****************************************/
  34          void Busy(void)
  35                  {
  36   1              INT8U bf;
  37   1      
  38   1              Pin_E = 0;
  39   1              DISPDATAPORT = 0xFF;    //使端口为输入状态
  40   1              Pin_RW = 1;                             //读
  41   1              Pin_RS = 0;                             //指令
  42   1      
  43   1              while (1)
  44   1                      {
  45   2                      Pin_E = 1;
  46   2                      bf = DISPDATAPORT;
  47   2                      Pin_E = 0;
  48   2                      if ((bf & 0x80) == 0)
  49   2                              break;
  50   2                      }
  51   1              }
  52          
  53          
  54          /***************************************
  55          
C51 COMPILER V7.50   DISP_DRIVE                                                            01/04/2009 21:53:55 PAGE 2   

  56                  LCD数据写
  57          
  58          ****************************************/
  59          void LCD_Data(INT8U Data)
  60                  {
  61   1              Busy();
  62   1              
  63   1              Pin_E = 0;
  64   1              Pin_RW = 0;             //写
  65   1              Pin_RS = 1;             //数据
  66   1      
  67   1              Pin_E = 1;
  68   1      
  69   1              DISPDATAPORT = Data;
  70   1      
  71   1              Pin_E = 0;
  72   1              }
  73          
  74          /***************************************
  75          
  76                  LCD命令写
  77          
  78          ****************************************/
  79          void LCD_Cmd(INT8U cmd)
  80                  {
  81   1              Busy();
  82   1              
  83   1              Pin_E = 0;
  84   1              Pin_RW = 0;             //写
  85   1              Pin_RS = 0;             //指令
  86   1      
  87   1              Pin_E = 1;
  88   1      
  89   1              DISPDATAPORT = cmd;
  90   1      
  91   1              Pin_E = 0;
  92   1              }
  93          
  94          /***************************************
  95          
  96                  显示扫描刷新程序
  97          
  98          ****************************************/
  99          void DispRef(void)
 100                  {
 101   1              static INT8U BlinkCnt = 0;              //闪烁显示计数器
 102   1              static BOOLEAN BlinkStatus = 0; //当前闪烁状态
 103   1              INT8U n;
 104   1      
 105   1              /* 计算显示闪烁状态 */
 106   1              BlinkCnt ++;                                                    
 107   1              BlinkCnt %= T_BLINK;
 108   1              if (BlinkCnt == 0)
 109   1                      BlinkStatus = !BlinkStatus;
 110   1      
 111   1              /* 若当前闪烁状态=0且当前显示位允许闪烁 */
 112   1      
 113   1      
 114   1              /* 输出行0 */
 115   1              LCD_Cmd(0x80);
 116   1              for (n=0;n<MAXDISPLEN;n++)
 117   1                      {
C51 COMPILER V7.50   DISP_DRIVE                                                            01/04/2009 21:53:55 PAGE 3   

 118   2                      if ((BlinkStatus == 0) && ((DispPro[0][n] & PRO_BLINK) != 0))
 119   2                              LCD_Data(' ');
 120   2                      else
 121   2                              LCD_Data(DispBuffer[0][n]);
 122   2                      }
 123   1      
 124   1              /* 输出行1 */
 125   1              LCD_Cmd(0xC0);
 126   1              for (n=0;n<MAXDISPLEN;n++)
 127   1                      {
 128   2                      if ((BlinkStatus == 0) && ((DispPro[1][n] & PRO_BLINK) != 0))
 129   2                              LCD_Data(' ');
 130   2                      else
 131   2                              LCD_Data(DispBuffer[1][n]);
 132   2                      }
 133   1              }
 134          
 135          
 136          /***************************************
 137          
 138                  获取整数的长度  
 139          
 140          ****************************************/
 141           INT8U GetIntLen(INT32U val)
 142                  {
 143   1              INT8U len;
 144   1      
 145   1              len = 0;
 146   1              while (val != 0)
 147   1                      {
 148   2                      val /= 10;
 149   2                      len ++;
 150   2                      }
 151   1      
 152   1              if (len == 0)
 153   1                      len = 1;
 154   1      
 155   1              return len;
 156   1              }
 157          
 158          
 159          
 160          /***************************************
 161          
 162                  显示一个整数
 163                  入口参数:整数数值,起始显示位置,长度
 164          
 165          ****************************************/
 166          void DispInt(INT32U val,INT8U row,INT8U col,INT8U len)
 167                  {
 168   1              INT8U n,end;
 169   1      
 170   1              end = col + len - 1;
 171   1              for (n=0;n<len;n++)
 172   1                      {
 173   2                      DispBuffer[row][end] = val % 10 + '0';
 174   2              
 175   2                      DispPro[0][end] = 0;
 176   2                      val /= 10;
 177   2                      end --;
 178   2                      }
 179   1              }
C51 COMPILER V7.50   DISP_DRIVE                                                            01/04/2009 21:53:55 PAGE 4   

 180          
 181          
 182          /***************************************
 183          
 184                  显示一个整数(可闪烁)
 185                  入口参数:整数数值,起始显示位置,长度
 186          
 187          ****************************************/
 188          void DispInt_blink(INT32U val,INT8U row,INT8U col,INT8U len,BOOLEAN blink)
 189                  {
 190   1              INT8U n,end;
 191   1      
 192   1              end = col + len - 1;
 193   1              for (n=0;n<len;n++)
 194   1                      {
 195   2                      DispBuffer[row][end] = val % 10 + '0';
 196   2      
 197   2              if (blink == TRUE)
 198   2                      DispPro[row][col+n] = PRO_BLINK;
 199   2              else
 200   2                      DispPro[row][col+n] = 0; 
 201   2              //      DispPro[0][end] = 0;
 202   2                      val /= 10;
 203   2                      end --;
 204   2                      }
 205   1              }
 206          
 207          
 208          
 209          
 210          
 211          
 212          /***************************************
 213          
 214                  显示一个字符
 215                  入口参数:字符,显示位置,是否闪烁
 216          
 217          ****************************************/
 218          void DispChr(INT8U cv,INT8U row,INT8U col,BOOLEAN blink)
 219                  {
 220   1              DispBuffer[row][col] = cv;
 221   1              if (blink == TRUE)
 222   1                      DispPro[row][col] = PRO_BLINK;
 223   1              else
 224   1                      DispPro[row][col] = 0;
 225   1              }
 226          
 227          /***************************************
 228          
 229                  显示一个字符串
 230                  入口参数:字符串指针,显示位置,是否闪烁
 231          
 232          ****************************************/
 233          void DispStr(INT8U *str,INT8U row,INT8U col,BOOLEAN blink)
 234                  {
 235   1              while ((*str)!=0)
 236   1                      {
 237   2                      DispBuffer[row][col] = *str;
 238   2                      if (blink == TRUE)
 239   2                              DispPro[row][col] = PRO_BLINK;
 240   2                      else
 241   2                              DispPro[row][col] = 0;
C51 COMPILER V7.50   DISP_DRIVE                                                            01/04/2009 21:53:55 PAGE 5   

 242   2      
 243   2                      str ++;
 244   2                      col ++;
 245   2                      }
 246   1              }
 247          
 248          /***************************************
 249          
 250                  显示一个浮点数
 251                  注:无超显示范围判断
 252                          使用全部的显示区域
 253          
 254          ****************************************/
 255          void DispFloat(float val,INT8U row,INT8U col,INT8U Len)
 256                  {
 257   1              INT8U IntLen,n;
 258   1              INT32U iv,ivf;
 259   1      
 260   1      
 261   1              /* 符号位处理 */
 262   1              if (val < 0)
 263   1                      {
 264   2                      DispBuffer[row][col] = '-';
 265   2                      val = -val;
 266   2                      col ++;
 267   2                      Len --;
 268   2                      }
 269   1                      
 270   1              /* 整数位数计算 */
 271   1              IntLen = GetIntLen((INT32U)val);        
 272   1      
 273   1              /* 整数部分 */
 274   1              iv = (INT32U)val;
 275   1      
 276   1              /*  */
 277   1              for (n=0;n<(Len-IntLen);n++)
 278   1                      {
 279   2                      val *= 10;
 280   2                      }
 281   1              ivf = (INT32U)val;
 282   1              ivf += 5;
 283   1              ivf /= 10;
 284   1      
 285   1              /* 显示整数部分 */
 286   1              DispInt(iv,row,col, IntLen);
 287   1              /* 显示小数点 */
 288   1              DispChr('.',row,col+IntLen ,FALSE);
 289   1              /* 显示小数部分 */
 290   1              for (n=0;n<(Len-IntLen-1);n++)
 291   1                      {
 292   2                      DispInt(ivf%10 , row , col + Len -n -1, 1);
 293   2                      ivf /= 10;
 294   2                      }
 295   1      
 296   1              /* 计算实际有效位数,去掉小数部分尾数的所有0 */
 297   1              n = col + Len - 1;
 298   1              while (n >= IntLen)
 299   1                      {
 300   2                      if (DispBuffer[row][n] != '0')
 301   2                              {
 302   3                              break;
 303   3                              }
C51 COMPILER V7.50   DISP_DRIVE                                                            01/04/2009 21:53:55 PAGE 6   

 304   2                      DispBuffer[row][n] = ' ';
 305   2                      n --;
 306   2                      }
 307   1              }
 308          
 309          /***************************************
 310          
 311                  显示清屏
 312          
 313          ****************************************/
 314          void DispCls(void)
 315                  {
 316   1              INT8U col,row;
 317   1      
 318   1              for (row=0;row<2;row++)
 319   1                      {
 320   2                      for (col=0;col<MAXDISPLEN;col++)
 321   2                              {
 322   3                              DispBuffer[row][col] = ' ';
 323   3                              DispPro[row][col] = 0;
 324   3                              }
 325   2                      }
 326   1              }
 327          
 328          
 329          
 330          /***************************************
 331          
 332                  屏初始化
 333          
 334          ****************************************/
 335          void DispInit(void)
 336                  {
 337   1      
 338   1              LCD_Cmd(0x38);          //Function Set
 339   1                                                      //data bus length = 1 (8 bits)
 340   1                                                      //display lines = 1 (2 lines)
 341   1                                                      //character font = 0(5x7 Dot Font)
 342   1                      
 343   1              LCD_Cmd(0x06);          //Entry Mode Set
 344   1                                                      //Sets DD RAM counter to increment
 345   1      
 346   1              LCD_Cmd(0x0C);          //Sets Display 
 347   1                                              
 348   1              LCD_Cmd(0x01);          //Clears Display
 349   1                                                      //returns cursor to the Home Position (Address 00)
 350   1              }
 351          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    906    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1      45
   IDATA SIZE       =     64    ----
   BIT SIZE         =      1       3
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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