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

📄 keyboard.lst

📁 单片机计算器,可计算多位小数点的+-*/.可在lcd上显示
💻 LST
字号:
C51 COMPILER V8.02   KEYBOARD                                                              08/23/2007 12:54:42 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE KEYBOARD
OBJECT MODULE PLACED IN KeyBoard.OBJ
COMPILER INVOKED BY: C:\Keil\C51\Bin\c51.exe KeyBoard.c DB SB OE ROM(LARGE) SMALL OT(6,SPEED) WL(2) RB(0)

line level    source

*** WARNING C500 IN LINE 1 OF KEYBOARD.C: LICENSE ERROR (R225: REGISTRATION FILE 'TOOLS.INI' NOT FOUND)

   1          /*+++++++++++++++++++++++++++++++++++++++++++++++++++/
   2           程序名 :KeyBoard.c 键盘扫描子程序
   3           入口:
   4           出口:键盘值
   5          +++++++++++++++++++++++++++++++++++++++++++++++++++*/
   6          #include "CPLD.h"
   7          
   8          //===============================================
   9          unsigned  char idata ucKeyState;
  10           float p1; 
  11          float p2; 
  12           
  13          float *p=&p1;
  14          unsigned char idata op;
  15          int flag=1;//控制小数点个数
  16          
  17          unsigned int f1;
  18          unsigned int f2;
  19          
  20           
  21           void ISR_int1(void) interrupt 2 using 0          
  22          { 
  23   1                                                      //ucSKey初始化
  24   1      
  25   1       unsigned int  uiI;
  26   1       unsigned char ucLcdPosX;
  27   1       unsigned char ucLcdPosY;
  28   1       
  29   1       for (uiI=0;uiI<10000;uiI++);    
  30   1                                   //延时,去掉抖动 
  31   1      if(INT1==1) goto end01;                     //读入int0,
  32   1                                                 //关闭外部中断
  33   1       for (uiI=0;uiI<10000;uiI++); 
  34   1                      //延时,去掉抖动 ;                           
  35   1      //ucSKey=GetKey();
  36   1      ucKeyState=GetKey();
  37   1                                                         //按键所对应的符号first=first&ucKeyState;
  38   1      while(INT1==0);  
  39   1      
  40   1                                    //按键是否弹起
  41   1      if(ucLcdPosX==16||ucLcdPosX==32)
  42   1      
  43   1              {
  44   2              ucLcdPosY^=1,ucLcdPosX=0;
  45   2              
  46   2              }
  47   1              
  48   1              
  49   1      
  50   1      
  51   1       //按下后显示按键所对应的单个字符
  52   1      if(ucKeyState!='=')
  53   1       
  54   1              {
C51 COMPILER V8.02   KEYBOARD                                                              08/23/2007 12:54:42 PAGE 2   

  55   2                      if(ucKeyState>='0'&&ucKeyState<='9')  //如果用户输入的字符是数字,那么就把对相应的操作数进行处理 
  56   2                              { 
  57   3                                      if(ucLcdPosX==16||ucLcdPosX==32)
  58   3                                                              {
  59   4                                                                      ucLcdPosY^=1,ucLcdPosX=0;
  60   4                                                                      }
  61   3                                      DispOneChar(ucLcdPosX++,ucLcdPosY,ucKeyState);
  62   3                              
  63   3                                      
  64   3                                      (*p)=(*p)*f1+(ucKeyState-'0')*1.0/f2; 
  65   3                                      //'0'的意思是把用户输入的字符转变为对应的数字,如果用户没有输入小数点,那么f1=10,f2=1,否则f1=1,f2的
             -值会每次都改变。 
  66   3                                      f2=(f2==1)?1:(f2*10); 
  67   3      
  68   3                              } 
  69   2                              //用户输入的不是数字,则可能是小数点或者运算符 
  70   2                               
  71   2                                      else if(ucKeyState=='.'&&flag) //是小数点,那么改变状态变量,准备接受操作数的小数部分 
  72   2                                              { 
  73   3                                                      flag=0;
  74   3                                                      f1=1; 
  75   3                                                      f2=10;                                                                                                                                                  
  76   3                                                      if(ucLcdPosX==16||ucLcdPosX==32)
  77   3                                                              {
  78   4                                                                      ucLcdPosY^=1,ucLcdPosX=0;
  79   4                                                                      } 
  80   3                                                      DispOneChar(ucLcdPosX++,ucLcdPosY,ucKeyState);          
  81   3                                                                      
  82   3                                                              //      DispOneChar(ucLcdPosX++,ucLcdPosY,'.');
  83   3                                                                      
  84   3      
  85   3                                              } 
  86   2                              else if(ucKeyState=='+'||ucKeyState=='-'||ucKeyState=='*'||ucKeyState=='/') // 是操作符,把操作符保存在
             -变量o里,同时改变指针p指向的变量,准备接受第二个操作数,并把状态变量设为始值 
  87   2                                              
  88   2                                              { 
  89   3                                                      flag=1;
  90   3                                                      op=ucKeyState;
  91   3                                                      
  92   3                                                      p=&p2; 
  93   3                                                      
  94   3                                                      f1=10; 
  95   3                                                      f2=1; 
  96   3                                                      
  97   3                                                      cls();
  98   3                                                      
  99   3                                                      ucLcdPosX=0,ucLcdPosY=0;
 100   3                                                      
 101   3                                              } 
 102   2                                      else if(ucKeyState=='a')
 103   2                                                      {
 104   3                                                              flag=1;
 105   3                                                              
 106   3                                                              cls();
 107   3                                                              p1=0,p2=0,p=&p1;
 108   3                                                              f1=10;f2=1;
 109   3                                                              ucLcdPosX=0;
 110   3                                                      }
 111   2      
 112   2                              
 113   2                    }
 114   1      
C51 COMPILER V8.02   KEYBOARD                                                              08/23/2007 12:54:42 PAGE 3   

 115   1      //NextPos();
 116   1                                        
 117   1      end01:;
 118   1      }
 119          
 120          unsigned char GetKey(void)
 121          {
 122   1         
 123   1      unsigned char kc,ucRetKc;
 124   1      unsigned char m;
 125   1      m=1;
 126   1      ucRetKc=XBYTE[0x8000]& 0x0f;
 127   1      if(ucRetKc!=0x0f)
 128   1      while(m<=0x10){
 129   2      if(m==0x01)ucRetKc=XBYTE[0x80f7]&0x0f;
 130   2      if(m==0x02)ucRetKc=XBYTE[0x80ef]&0x0f;
 131   2      if(m==0x04)ucRetKc=XBYTE[0x80df]&0x0f;
 132   2      if(m==0x08)ucRetKc=XBYTE[0x80bf]&0x0f;
 133   2      if(m==0x10)ucRetKc=XBYTE[0x807f]&0x0f;
 134   2      if(ucRetKc!=0x0f)
 135   2      {ucRetKc=ucRetKc<<4;
 136   3      kc=ucRetKc+m;
 137   3      goto end00;}
 138   2      m*=2;} 
 139   1      end00:
 140   1            
 141   1      switch (kc)                                     //按键所在的具体位置对应于相应的符号
 142   1        {
 143   2         case 0xE1: kc='+' ;
 144   2         break;
 145   2         case 0xD1: kc='9' ;
 146   2         break;
 147   2         case 0xB1: kc='8' ;                           //---   +  9  8  7   ---       
 148   2         break;
 149   2         case 0x71: kc='7';                                    //---   -  6  5  4   ---        
 150   2         break;
 151   2         case 0xE2: kc='-' ;                           //---   *  3  2  1   ---       
 152   2         break;
 153   2         case 0xD2: kc='6' ;                            //---   / =  .  0   ---        
 154   2         break;
 155   2         case 0xB2: kc='5' ;
 156   2         break;                                 
 157   2         case 0x72: kc='4' ;
 158   2         break;
 159   2         case 0xE4: kc= '*';
 160   2         break;
 161   2         case 0xD4: kc= '3';
 162   2         break;
 163   2         case 0xB4: kc='2' ;
 164   2         break;
 165   2         case 0x74: kc='1' ;
 166   2         break;
 167   2         
 168   2         case 0xE8: kc='/' ;
 169   2         break;
 170   2         case 0xD8: kc='=' ;
 171   2         break;
 172   2         case 0xB8: kc= '.';
 173   2         break;
 174   2         case 0x78: kc='0' ;
 175   2         break;
 176   2      case 0xF0: kc='a' ;
C51 COMPILER V8.02   KEYBOARD                                                              08/23/2007 12:54:42 PAGE 4   

 177   2         break;
 178   2      case 0xE0: kc='b' ;
 179   2         break;
 180   2      case 0xC0: kc='c' ;
 181   2         break;
 182   2      case 0x80: kc='d' ;
 183   2         break;
 184   2         default: kc='q';
 185   2        }
 186   1      
 187   1         return kc;
 188   1      
 189   1      }
C51 COMPILER V8.02   KEYBOARD                                                              08/23/2007 12:54:42 PAGE 5   

NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE
====                                    =====   ======  ====    ======  ====


P1 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0090H  1
P3 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00B0H  1
ucKeyState . . . . . . . . . . . . . .  PUBLIC   IDATA  U_CHAR   0000H  1
IE . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00A8H  1
size_t . . . . . . . . . . . . . . . .  TYPEDEF  -----  U_INT    -----  2
f1 . . . . . . . . . . . . . . . . . .  PUBLIC   DATA   U_INT    0000H  2
_DispOneChar . . . . . . . . . . . . .  EXTERN   CODE   PROC     -----  -----
f2 . . . . . . . . . . . . . . . . . .  PUBLIC   DATA   U_INT    0002H  2
IP . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00B8H  1
flag . . . . . . . . . . . . . . . . .  PUBLIC   DATA   INT      0004H  2
INT1 . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00B3H  1
p1 . . . . . . . . . . . . . . . . . .  PUBLIC   DATA   FLOAT    0006H  4
p2 . . . . . . . . . . . . . . . . . .  PUBLIC   DATA   FLOAT    000AH  4
SCON . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0098H  1
TCON . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0088H  1
cls. . . . . . . . . . . . . . . . . .  EXTERN   CODE   PROC     -----  -----
GetKey . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  kc . . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0000H  1
  ucRetKc. . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0006H  1
  m. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1
  end00. . . . . . . . . . . . . . . .  LABEL    CODE   LABEL    -----  -----
ISR_int1 . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  uiI. . . . . . . . . . . . . . . . .  * REG *  DATA   U_INT    0006H  2
  ucLcdPosX. . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0000H  1
  ucLcdPosY. . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0001H  1
  end01. . . . . . . . . . . . . . . .  LABEL    CODE   LABEL    -----  -----
op . . . . . . . . . . . . . . . . . .  PUBLIC   IDATA  U_CHAR   0001H  1
T2CON. . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00C8H  1
p. . . . . . . . . . . . . . . . . . .  PUBLIC   DATA   PTR      000EH  3
PSW. . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00D0H  1


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    726    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     17       3
   IDATA SIZE       =      2    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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