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

📄 calculator.lst

📁 4*4键盘控制计算器的c语言和汇编程序源码
💻 LST
字号:
C51 COMPILER V6.23a  CALCULATOR                                                            05/09/2008 20:15:25 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE CALCULATOR
OBJECT MODULE PLACED IN calculator.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE calculator.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /******************************************************************************************************
   2          ******************************************************************************************************/
   3          #include<reg51.h>
   4          #define uchar unsigned char
   5          #define uint unsigned int
   6          #define ulong unsigned long
   7          
   8          uchar keyVal=0; //读取的键盘值
   9          uint lOpD=0;    //左操作数
  10          uint rOpD=0;    //右操作数
  11          ulong res=0;    //计算结果
  12          /*uchar code table0[16]={
  13                                            0x48,0x84,0x44,0x24,  // 0  1  2  3
  14                                            0x82,0x42,0x22,0x81,  // 4  5  6  7
  15                                            0x41,0x21,0x18,0x14,  // 8  9  +  -
  16                                            0x12,0x11,0x88,0x28   // *  /  C  =
  17                                            };*/
  18          uchar code table1[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //LED段码
  19          uchar getKey(ulong d);
  20          void display(ulong d);
  21          void delay(uchar t);
  22          
  23          //====================================================================================================
  24          //====================================================================================================
  25          void main()
  26          {
  27   1        uchar op1,op2,count=0,key=0;
  28   1        while(1)
  29   1        {
  30   2          key=0;
  31   2              count=0;
  32   2      L:  while(key<10)   //获取左操作数
  33   2              { 
  34   3               
  35   3               display(res);
  36   3               key=getKey(lOpD);
  37   3               if(count==0&&key>=10) //第一次按键是操作符时继续
  38   3               {
  39   4                 lOpD=0;
  40   4                 key=0;
  41   4               }
  42   3               count++;
  43   3               if(key<10)
  44   3               {
  45   4                 lOpD=lOpD*10+key;
  46   4                 display(lOpD);
  47   4               }
  48   3      
  49   3               if(key==14||lOpD>=65535)    //若按下 ON/C 键或溢出全部清0重来
  50   3               {
  51   4                 lOpD=0;
  52   4                 key=0;
  53   4               }
  54   3               if(key==15)   //若按下 = 继续读左操作数
  55   3                key=0;
C51 COMPILER V6.23a  CALCULATOR                                                            05/09/2008 20:15:25 PAGE 2   

  56   3              }
  57   2              op1=key;    //保存操作符
  58   2              key=0;
  59   2      
  60   2      R:  while(key<10)   //获取右操作数
  61   2              {
  62   3               key=getKey(rOpD);
  63   3               display(rOpD);
  64   3               if(key<10)
  65   3               {
  66   4                 rOpD=rOpD*10+key;
  67   4                 display(rOpD);
  68   4               }
  69   3               if(key==14||lOpD>=65535)    //若按下 ON/C 键或溢出全部清0重来
  70   3               {
  71   4                 lOpD=0;
  72   4                 rOpD=0;
  73   4                 key=0;
  74   4                 goto  L;
  75   4               }
  76   3              }
  77   2         op2=key;
  78   2              switch(op1)
  79   2              {
  80   3                case 10:res=lOpD+rOpD;break;  //
  81   3                case 11:res=lOpD-rOpD;break;  //
  82   3                case 12:res=lOpD*rOpD;break;  //
  83   3                case 13:res=lOpD/rOpD;break;  //
  84   3                default:res=0;break;
  85   3              }
  86   2              if(res>999999)  //结果溢出
  87   2              {
  88   3                 lOpD=0;
  89   3                 rOpD=0;
  90   3                 res=0;
  91   3                 key=0;
  92   3                 P3=0xFF;      
  93   3              }
  94   2              display(res);
  95   2              if(op2>=10&&op2<=13)
  96   2              {
  97   3                op1=op2;
  98   3                lOpD=res;
  99   3                key=0;
 100   3                goto R;
 101   3              }
 102   2              P0=0xF0;
 103   2              while(P0==0xF0)
 104   2              {
 105   3                display(res);
 106   3                P0=0xF0;
 107   3              };      
 108   2              key=getKey(res);
 109   2              if(14==key)
 110   2              {
 111   3                 lOpD=0;
 112   3                 rOpD=0;
 113   3                 res=0;
 114   3                 key=0;
 115   3                 //P3=0x00;   
 116   3                 display(0);
 117   3              }
C51 COMPILER V6.23a  CALCULATOR                                                            05/09/2008 20:15:25 PAGE 3   

 118   2        }
 119   1      }
 120          
 121          //====================================================================================================
 122          //====================================================================================================
 123          uchar getKey(ulong d)
 124          {
 125   1        uchar temp=0;
 126   1        uchar low=0x0F;
 127   1        uchar row=0;
 128   1        uchar col=0;
 129   1        uchar key=0;
 130   1        uchar i=0,move;
 131   1        P3=0x00;
 132   1      S: P0=0x0F;
 133   1        temp=P0&0x0F;
 134   1        while(temp==0xF)
 135   1        {
 136   2        P0=0x0F;
 137   2        temp=P0&0x0F;
 138   2        display(d);
 139   2        };
 140   1        delay(20);
 141   1        P0=0x0F;
 142   1        temp=P0&0x0F;
 143   1        if(temp==0x0F)
 144   1          goto S;
 145   1        temp=0x0F&temp;
 146   1        switch(temp)
 147   1        {
 148   2          case 0x0E:row=0;break;
 149   2          case 0x0D:row=1;break;
 150   2              case 0x0B:row=2;break;
 151   2              case 0x07:row=3;break;
 152   2              default:row=0;break;
 153   2        }
 154   1        move=0xF0;
 155   1        for(i=0;i<4;i++)
 156   1        {
 157   2          move<<=1;
 158   2          P0=move|0x0F;
 159   2          temp=P0&0x0F;
 160   2          if(temp!=0x0F)
 161   2          {
 162   3           col=3-i;
 163   3           break;
 164   3              }
 165   2        }
 166   1        key=row*4+col;
 167   1        P0=0x0F;
 168   1        temp=P0&0x0F;
 169   1        while(temp!=0xF)
 170   1        {
 171   2        display(d);
 172   2        P0=0x0F;
 173   2        temp=P0&0x0F;
 174   2        }; //wait for key up
 175   1        return key;
 176   1      }
 177          
 178          //====================================================================================================
 179          //====================================================================================================
C51 COMPILER V6.23a  CALCULATOR                                                            05/09/2008 20:15:25 PAGE 4   

 180          void display(ulong d)
 181          {
 182   1        uchar out[6]={0,0,0,0,0,0};
 183   1        uchar temp,i,j,k;
 184   1        ulong t=100000;
 185   1        ulong b=d;
 186   1        uchar count=5,move=0;
 187   1        for(i=0;i<6;i++)
 188   1        {
 189   2          temp=b/t;
 190   2              b=b%t;
 191   2              t/=10;
 192   2          out[i]=table1[temp];
 193   2              if(count==5&&temp!=0)
 194   2                 count=i;
 195   2        }
 196   1        for(j=0;j<20;j++)
 197   1        {
 198   2           move=0x80;
 199   2           for(k=5;k>=count;k--)
 200   2               {
 201   3                 P3=move;
 202   3                 P2=out[k];
 203   3                 move>>=1;
 204   3                 delay(1);
 205   3               }
 206   2        }
 207   1        
 208   1      }
 209          //====================================================================================================
 210          //====================================================================================================
 211          void delay(uchar t)  //1ms*t
 212          {
 213   1        uchar i,j;
 214   1        for(i=0;i<t;i++)
 215   1        {
 216   2        for(j=0;j<121;j++);
 217   2        }
 218   1      }
 219          //====================================================================================================
 220          //====================================================================================================


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    911    ----
   CONSTANT SIZE    =     16    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      9      38
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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