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

📄 keytest.lst

📁 一个简易的计算器程序 有键盘扫描和计算功能
💻 LST
字号:
C51 COMPILER V7.50   KEYTEST                                                               11/21/2007 23:29:53 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE KEYTEST
OBJECT MODULE PLACED IN keytest.OBJ
COMPILER INVOKED BY: D:\keil\C51\BIN\C51.EXE keytest.c BROWSE DEBUG OBJECTEXTEND TABS(3)

line level    source

   1          #include<reg51.h>
   2          #include<math.h>
   3          #define uchar unsigned char
   4          #define uint unsigned int
   5          #define KEYPORT P1
   6          static unsigned long int counter;//用来记录输入的数据
   7          static unsigned long int counter_save; 
   8          unsigned char value[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
   9          char code row[4]={0x70,0xb0,0xd0,0xe0};
  10          char code line[4]={0x07,0x0b,0x0d,0x0e};
  11          unsigned char code LED[11]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00};
  12          bit XFLAG=0;
  13          char k;
  14          uchar keyvalue;
  15          
  16          //----------------------------------------------------------------------
  17          senddata(uchar b)
  18          {
  19   1         char i;
  20   1         i=b;
  21   1         
  22   1         SBUF=LED[i];
  23   1         while(TI==0);
  24   1         TI=0;
  25   1      
  26   1         
  27   1      }
  28          //----------------------------延时程序---------------------------
  29          void delay(uint delaytime)
  30          {
  31   1         char i;
  32   1         for(;delaytime>0;delaytime--)
  33   1            for(i=0;i<121;i++)
  34   1            {;}
  35   1      }
  36          //-------------------------------------------------------------------
  37          
  38          uchar keyscan(void)
  39           {  
  40   1          uchar xinvalue,yinvalue,i,j;
  41   1         uchar kvalue;
  42   1         KEYPORT=0x0f;
  43   1         while(KEYPORT==0x0f);
  44   1      
  45   1         if(KEYPORT!=0x0f)
  46   1            {
  47   2              delay(20);//延时消抖
  48   2               if(KEYPORT!=0x0f)
  49   2                {
  50   3                     KEYPORT=0x0f;//输出行扫描码
  51   3                     xinvalue=KEYPORT;
  52   3                  KEYPORT=0xf0;//输出列扫描码
  53   3                  yinvalue=KEYPORT;
  54   3                  for(i=0;i<4;i++)
  55   3                  {     
C51 COMPILER V7.50   KEYTEST                                                               11/21/2007 23:29:53 PAGE 2   

  56   4                           if((xinvalue&0x0f)==line[i])
  57   4                           for(j=0;j<4;j++)
  58   4                        {
  59   5                              if((yinvalue&0xf0)==row[j])
  60   5                           {
  61   6                                 kvalue=value[i][j];
  62   6                                 return(kvalue);//反回按键值
  63   6                           }
  64   5                           
  65   5                         }
  66   4                  }
  67   3                 }
  68   2               }
  69   1       }
  70          //------------------------keyprocess函数-----------------------
  71          void keyprocess(uchar kvalue)
  72          {  
  73   1         char cosave[8];
  74   1         char i;
  75   1         char a=0;
  76   1         a=0;
  77   1         //输出数据
  78   1         switch(kvalue)
  79   1         {
  80   2            case 0:
  81   2            senddata(0);
  82   2            counter=counter*10;
  83   2            break;
  84   2            case 1:
  85   2            senddata(1);
  86   2            counter=counter*10+1;
  87   2            break;
  88   2            case 2:
  89   2            senddata(2);
  90   2            counter=counter*10+2;
  91   2            break;
  92   2            case 3:
  93   2            senddata(3);
  94   2            counter=counter*10+3;
  95   2            break;
  96   2            case 4:
  97   2            senddata(4);
  98   2            counter=counter*10+4;
  99   2            break;
 100   2            case 5:
 101   2            senddata(5);
 102   2            counter=counter*10+5;
 103   2            break;
 104   2            case 6:
 105   2            senddata(6);
 106   2            counter=counter*10+6;
 107   2            break;
 108   2            case 7:
 109   2            senddata(7);
 110   2            counter=counter*10+7;
 111   2            break;
 112   2            case 8:
 113   2            senddata(8);
 114   2            counter=counter*10+8;
 115   2            break;
 116   2            case 9:
 117   2            senddata(9);
C51 COMPILER V7.50   KEYTEST                                                               11/21/2007 23:29:53 PAGE 3   

 118   2            counter=counter*10+9;
 119   2            break;
 120   2            case 10:
 121   2            for(i=0;i<8;i++)
 122   2            senddata(10);
 123   2            counter=0;
 124   2            counter_save=0;
 125   2            break;
 126   2            case  11:
 127   2            for(i=0;i<8;i++)
 128   2            senddata(10);//清除屏幕
 129   2            if(XFLAG==0)//查询是加法还是减法
 130   2            counter_save=counter_save+counter;
 131   2            if(XFLAG==1)
 132   2            counter_save=counter_save-counter;
 133   2            counter=counter_save;
 134   2            for(i=0;i<8;i++)
 135   2               {
 136   3                  cosave[i]=(counter_save%10);
 137   3                  counter_save/=10;
 138   3               }
 139   2                  for(i=7;i>=0;i--)
 140   2                     {
 141   3                        if(cosave[i]>0)
 142   3                           {
 143   4                              a=i;
 144   4                              break;
 145   4                           }
 146   3                     }  
 147   2                              for(;a>=0;a--)
 148   2                              {                    
 149   3                                 senddata(cosave[a]);
 150   3                              }
 151   2                     break;
 152   2                     case 12:
 153   2                     XFLAG=0;
 154   2                     counter_save=counter;//保存加数
 155   2                     counter=0;//清除原来计数用来记录下一个输入的加数
 156   2                     for(i=0;i<8;i++)
 157   2                     senddata(10);//清除屏幕以便显示下一个加数
 158   2                     break;
 159   2                     case 13:
 160   2                     XFLAG=1;//减法标志位有效
 161   2                     counter_save=counter;//保存被减数
 162   2                     counter=0;//清除计数用来储存减数
 163   2                     for(i=0;i<8;i++)
 164   2                     senddata(10);//清除屏幕用来显示下一个减数
 165   2                     break;
 166   2                     case 14:
 167   2                     for(i=0;i<8;i++)
 168   2                     senddata(10);//清除屏幕可以显示以下的数据
 169   2                     counter=counter*10+1;
 170   2                     counter_save=counter;
 171   2                     for(i=0;i<8;i++)
 172   2                     {
 173   3                        cosave[i]=counter_save%10;
 174   3                        counter_save/=10;
 175   3                     }
 176   2                        for(i=7;i>=0;i--)
 177   2                           {
 178   3                              if(cosave[i]>0)
 179   3                              {
C51 COMPILER V7.50   KEYTEST                                                               11/21/2007 23:29:53 PAGE 4   

 180   4                                 a=i;
 181   4                                 break;
 182   4                              }
 183   3                           }
 184   2                                 for(;a>=0;a--)
 185   2                                    {
 186   3                                       senddata(cosave[a]);
 187   3                                    }
 188   2                                       break;
 189   2                           
 190   2                           case 15:
 191   2                           for(i=0;i<8;i++)
 192   2                           senddata(10);//清除屏幕可以显示以下的数据
 193   2                           counter=counter*10-1;
 194   2                           counter_save=counter;
 195   2                           for(i=0;i<8;i++)
 196   2                           {
 197   3                              cosave[i]=counter_save%10;
 198   3                              counter_save/=10;
 199   3                           }
 200   2                              for(i=7;i>=0;i--)
 201   2                              {
 202   3                                 if(cosave[i]>0)
 203   3                                    {
 204   4                                       a=i;
 205   4                                       break;
 206   4                                    }
 207   3      
 208   3                              }
 209   2                                 for(;a>=0;a--)
 210   2                                    {
 211   3                                       senddata(cosave[a]);
 212   3                                    }
 213   2                                    break;
 214   2         }
 215   1      }
 216          
 217           //----------------------------主函数--------------------------------------
 218           void main(void)
 219           { 
 220   1         counter=0;
 221   1         counter_save=0;
 222   1         for(k=0;k<8;k++)
 223   1         senddata(10);
 224   1         while(1)
 225   1         {
 226   2         
 227   2            keyvalue=keyscan();
 228   2            if(keyvalue>=0&&keyvalue<=15)
 229   2            keyprocess(keyvalue);
 230   2            delay(600);
 231   2         }
 232   1       }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1238    ----
   CONSTANT SIZE    =     19    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     26      10
   IDATA SIZE       =   ----    ----
C51 COMPILER V7.50   KEYTEST                                                               11/21/2007 23:29:53 PAGE 5   

   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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