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

📄 disp.lst

📁 基于单片机的电子计算器的硬件原理图和程序
💻 LST
字号:
C51 COMPILER V7.50   DISP                                                                  07/01/2008 10:35:02 PAGE 1   


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

line level    source

   1          /*
   2          ****************************************************
   3          
   4                          显示
   5          
   6          ****************************************************
   7          */
   8          
   9          #include <reg52.H>
  10          #include "Typedef.H"
  11          #include "UserDef.H"
  12          #include "Disp.h"
  13          
  14          
  15          /* 端口定义 */
  16          #define DISPSCANPORT    P3
  17          #define DISPDATAPORT    P2
  18          
  19          /*  全局变量 */
  20          static INT8U DispBuffer[MAXDISPLEN];            //显示内容缓冲区
  21          static INT8U DispPro[MAXDISPLEN];                       //显示属性缓冲区
  22          //显示属性定义
  23          #define PRO_POINT       (1<<0)  //小数点        
  24          #define PRO_BLINK       (1<<1)  //闪烁
  25          
  26          
  27          /* 7段数码管显示字模 */
  28          static INT8U code SegCode[] = { 
  29                  0x3F,   //0
  30                  0x06,   //1
  31                  0x5B,   //2
  32                  0x4F,   //3
  33                  0x66,   //4
  34                  0x6D,   //5
  35                  0x7D,   //6
  36                  0x07,   //7
  37                  0x7F,   //8
  38                  0x6F,   //9
  39                  0x77,   //10 A
  40                  0x7C,   //11 b
  41                  0x39,   //12 C
  42                  0x5E,   //13 d
  43                  0x79,   //14 E
  44                  0x71,   //15 F
  45                  0x00,   //16 ' '
  46                  0x40,   //17 '-'
  47                  0x50,   //18 'r'
  48                  0x80,   //19 '.'
  49                  };
  50          
  51          
  52          
  53          /***************************************
  54          
  55                  显示扫描刷新程序
C51 COMPILER V7.50   DISP                                                                  07/01/2008 10:35:02 PAGE 2   

  56          
  57          ****************************************/
  58          void DispRef(void)
  59                  {
  60   1              static INT8U CurI = 0;                  //当前扫描数码管位号
  61   1              static INT8U BlinkCnt = 0;              //闪烁显示计数器
  62   1              static BOOLEAN BlinkStatus = 0; //当前闪烁状态
  63   1              INT8U dc;
  64   1      
  65   1              /* 计算当前位的显示内容 */
  66   1              dc = SegCode[DispBuffer[CurI]];
  67   1              if ((DispPro[CurI] & PRO_POINT) != 0)   //是否附加小数点
  68   1                      dc |= SegCode[DC_POINT];
  69   1      
  70   1              /* 计算显示闪烁状态 */
  71   1              BlinkCnt ++;                                                    
  72   1              BlinkCnt %= T_BLINK;
  73   1              if (BlinkCnt == 0)
  74   1                      BlinkStatus = !BlinkStatus;
  75   1      
  76   1              /* 若当前闪烁状态=0且当前显示位允许闪烁 */
  77   1              if ((BlinkStatus == 0) && ((DispPro[CurI] & PRO_BLINK) != 0))
  78   1                      dc = 0;
  79   1      
  80   1              /* 扫描输出当前位 */
  81   1              DISPDATAPORT = 0xFF;
  82   1              DISPSCANPORT = (1<<CurI);
  83   1              DISPDATAPORT = ~dc;
  84   1      
  85   1              CurI ++;
  86   1              CurI %= MAXDISPLEN;
  87   1              }
  88          
  89          
  90          /***************************************
  91          
  92                  获取整数的长度  
  93          
  94          ****************************************/
  95          static INT8U GetIntLen(INT32U val)
  96                  {
  97   1              INT8U len;
  98   1      
  99   1              len = 0;
 100   1              while (val != 0)
 101   1                      {
 102   2                      val /= 10;
 103   2                      len ++;
 104   2                      }
 105   1      
 106   1              if (len == 0)
 107   1                      len = 1;
 108   1      
 109   1              return len;
 110   1              }
 111          
 112          
 113          /***************************************
 114          
 115                  将显示缓冲区的内容由左对齐变为右对齐
 116                  入口参数: 被操作的数的长度
 117          
C51 COMPILER V7.50   DISP                                                                  07/01/2008 10:35:02 PAGE 3   

 118          ****************************************/
 119          static void Right(INT8U len)
 120                  {
 121   1              INT8U sorc,targ;
 122   1      
 123   1              targ = MAXDISPLEN-1;
 124   1              sorc = len - 1;
 125   1      
 126   1              while (len != 0)
 127   1                      {
 128   2                      DispBuffer[targ] = DispBuffer[sorc];
 129   2                      DispPro[targ] = DispPro[sorc];
 130   2                      sorc --;
 131   2                      targ --;
 132   2                      len --;
 133   2                      }
 134   1      
 135   1              while (targ != 0xFF)
 136   1                      {
 137   2                      DispBuffer[targ] = DC_EMPTY;
 138   2                      DispPro[targ] = 0;
 139   2                      targ --;
 140   2                      }
 141   1              }
 142          
 143          /***************************************
 144          
 145                  显示一个整数
 146                  入口参数:整数数值,起始显示位置,长度
 147          
 148          ****************************************/
 149          void DispInt(INT32U val,INT8U position,INT8U len)
 150                  {
 151   1              INT8U n,end;
 152   1      
 153   1              end = position + len - 1;
 154   1              for (n=0;n<len;n++)
 155   1                      {
 156   2                      DispBuffer[end] = val % 10;
 157   2                      DispPro[end] = 0;
 158   2                      val /= 10;
 159   2                      end --;
 160   2                      }
 161   1              }
 162          
 163          /***************************************
 164          
 165                  显示一个整数(左对齐)
 166          
 167          ****************************************/
 168          void DispIntLeft(INT32U val)
 169                  {
 170   1              INT8U n;
 171   1              
 172   1              n = GetIntLen(val);
 173   1      
 174   1              DispInt(val,0,n);
 175   1              }
 176          
 177          /***************************************
 178          
 179                  显示一个整数(右对齐)
C51 COMPILER V7.50   DISP                                                                  07/01/2008 10:35:02 PAGE 4   

 180          
 181          ****************************************/
 182          void DispIntRight(INT32U val)
 183                  {
 184   1              INT8U n;
 185   1              
 186   1              n = GetIntLen(val);
 187   1      
 188   1              DispInt(val,MAXDISPLEN-n,n);
 189   1              }
 190          
 191          /***************************************
 192          
 193                  显示一个字符
 194                  入口参数:字符,显示位置,是否闪烁
 195          
 196          ****************************************/
 197          void DispChr(INT8U cv,INT8U position,BOOLEAN blink)
 198                  {
 199   1              DispBuffer[position] = cv;
 200   1              if (blink == TRUE)
 201   1                      DispPro[position] = PRO_BLINK;
 202   1              else
 203   1                      DispPro[position] = 0;
 204   1              }
 205          
 206          
 207          /***************************************
 208          
 209                  显示一个浮点数
 210                  注:无超显示范围判断
 211                          使用全部的显示区域
 212          
 213          ****************************************/
 214          void DispFloat(float val)
 215                  {
 216   1              INT8U IntLen,n,DispOrg;
 217   1      
 218   1              DispCls();
 219   1                      
 220   1              /* 符号位处理 */
 221   1              if (val < 0)
 222   1                      {
 223   2                      DispBuffer[0] = DC_SUB;
 224   2                      IntLen = 1;
 225   2                      val = -val;
 226   2                      DispOrg = 1;
 227   2                      }
 228   1              else
 229   1                      {
 230   2                      IntLen = 0;
 231   2                      DispOrg = 0;
 232   2                      }
 233   1                      
 234   1              /* 整数位数计算 */
 235   1              IntLen += GetIntLen((INT32U)val);       
 236   1      
 237   1              /* 浮点数定长度归一化  */
 238   1              for (n=IntLen;n<MAXDISPLEN;n++)
 239   1                      {
 240   2                      val *= 10;
 241   2                      }
C51 COMPILER V7.50   DISP                                                                  07/01/2008 10:35:02 PAGE 5   

 242   1      
 243   1              /* 四舍五入 */
 244   1              val += 0.5;
 245   1      
 246   1              /* 显示有效位数 */
 247   1              DispInt((INT32U)val, DispOrg , MAXDISPLEN-DispOrg);
 248   1              DispPro[IntLen - 1] = PRO_POINT;
 249   1      
 250   1              /* 计算实际有效位数,去掉小数部分尾数的所有0 */
 251   1              n = MAXDISPLEN - 1;
 252   1              while (n >= IntLen)
 253   1                      {
 254   2                      if (DispBuffer[n] != 0)
 255   2                              {
 256   3                              break;
 257   3                              }
 258   2                      n --;
 259   2                      }
 260   1      
 261   1              /* 右对齐 */
 262   1              Right(n+1);
 263   1      
 264   1              }
 265          
 266          /***************************************
 267          
 268                  显示清屏
 269          
 270          ****************************************/
 271          void DispCls(void)
 272                  {
 273   1              INT8U n;
 274   1              for (n=0;n<MAXDISPLEN;n++)
 275   1                      {
 276   2                      DispBuffer[n] = DC_EMPTY;
 277   2                      DispPro[n] = 0;
 278   2                      }
 279   1              }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    601    ----
   CONSTANT SIZE    =     20    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     14      28
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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