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

📄 comm.lst

📁 基于RS232的键盘,也可以作为输入输出的操作面板,用于数控系统开发
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.04   COMM                                                                  01/23/2007 12:25:25 PAGE 1   


C51 COMPILER V7.04, COMPILATION OF MODULE COMM
OBJECT MODULE PLACED IN comm.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE comm.c OPTIMIZE(7,SPEED) BROWSE DEBUG OBJECTEXTEND CODE

stmt level    source

   1          #include <common.h>
   2          #include <head.h>
   3          
   4          BYTE ToHexchar( BYTE a )
   5          {
   6   1              a &= 0x0f;
   7   1              if ( a < 10 )
   8   1                      return a + '0';
   9   1              
  10   1              return a - 10 + 'A';
  11   1      }
  12          
  13          BYTE HexCharToInt( BYTE c )
  14          {
  15   1              if ( ((c) >= '0') && ((c) <= '9') )
  16   1                      return (c) - '0';
  17   1      
  18   1              if ( ((c) >= 'A') && ((c) <= 'F') )
  19   1                      return (c) - 'A' + 10;
  20   1      
  21   1              if ( ((c) >= 'a') && ((c) <= 'f') )
  22   1                      return (c) - 'a' + 10;
  23   1      
  24   1              return 0;
  25   1      }
  26          
  27          BYTE TwoHexCharToInt( BYTE c1, BYTE c2 )
  28          {
  29   1              return (HexCharToInt( c1 ) << 4) | HexCharToInt( c2 );
  30   1      }
  31          
  32          BYTE CalCheckCode( u_char idata *buf, BYTE len )
  33          {
  34   1              BYTE    i, ret;
  35   1              
  36   1              ret = 0;
  37   1              for( i = 0; i < len; i++ )
  38   1                      ret += buf[i];
  39   1              
  40   1              return ret;
  41   1      }
  42          
  43          void EnableSerialComm( void )
  44          {
  45   1              u_char  tmp;
  46   1      
  47   1              // 串行通讯初始化
  48   1              SCON = 0x40;    // 模式1, 允许接收
  49   1              T2CON = 0x30;   // RXD TXD 使用T2
  50   1              TR2 = 0;
  51   1      
  52   1              // 波特率公式:
  53   1              // baud = f/2/16/(65536-(RCAP2H,RCAP2L))
  54   1              // f = 40M
  55   1              // 1200: 0xfbee
C51 COMPILER V7.04   COMM                                                                  01/23/2007 12:25:25 PAGE 2   

  56   1              // 2400: 0xfdf7
  57   1              // 4800: 0xfefb
  58   1              // 9600: 0xff7d
  59   1      
  60   1      #if (SCH_PCB_VERSION == 1)
  61   1              tmp = ((BYTE)BAUD_RATE_H*2) + (BYTE)BAUD_RATE_L;
*** ERROR C202 IN LINE 61 OF COMM.C: 'P3_7': undefined identifier
  62   1      #endif
  63   1      #if (SCH_PCB_VERSION == 2)
                      tmp = CommBaudRateConst[P1>>6];
              #endif
  66   1      
  67   1              RCAP2H = CommBaudRateConst[tmp] >> 8;
*** ERROR C193 IN LINE 67 OF COMM.C: '>>': bad operand type
  68   1              RCAP2L = CommBaudRateeConst[tmp];
  69   1      
  70   1              TH2 = RCAP2H;
  71   1              TL2 = RCAP2L;           
  72   1      
  73   1              TR2 = 1;
  74   1      
  75   1              RE      = RECV;
*** ERROR C202 IN LINE 75 OF COMM.C: 'P3_3': undefined identifier
  76   1      
  77   1              REN = 1;                // 启动接收
  78   1              ES = 1;                 // 允许中断
  79   1      
  80   1              EA = 1;
  81   1      }
  82          
  83          void FillHalfByteToCommBuf( BYTE cc )
  84          {
  85   1              CommBuf.MsgData[CommBuf.MsgCnt++] = ToHexchar( cc );
  86   1      }
  87          
  88          void FillByteToCommBuf( BYTE cc )
  89          {
  90   1              CommBuf.MsgData[CommBuf.MsgCnt++] = ToHexchar( cc >> 4 );
  91   1              CommBuf.MsgData[CommBuf.MsgCnt++] = ToHexchar( cc );
  92   1      }
  93          
  94          void CommandProcessExtra( void )
  95          {
  96   1              FillByteToCommBuf( CalCheckCode( CommBuf.MsgData, CommBuf.MsgCnt ) );
  97   1              CommBuf.MsgData[CommBuf.MsgCnt++] = END_CHAR;
  98   1                              
  99   1              RE = SEND;
*** ERROR C202 IN LINE 99 OF COMM.C: 'P3_3': undefined identifier
 100   1              BufUseFlag = 1;
 101   1              CommBuf.SendIdx = 0;
 102   1              TxdStartFlag = 1;       
 103   1              RecvOkFlag = 0;
 104   1      
 105   1              TI = 1;
 106   1      }
 107          
 108          void ReadCommand( void )
 109          {
 110   1              BYTE    idx, tmp;
 111   1              BYTE    idata   *ptr;
 112   1              DWORD   dtmp;
 113   1      
C51 COMPILER V7.04   COMM                                                                  01/23/2007 12:25:25 PAGE 3   

 114   1              CommBuf.MsgData[0] = NO_ACK_CHAR;
 115   1              CommBuf.MsgCnt = CMD_HEAD_LEN;
 116   1              
 117   1              idx = CommBuf.MsgData[2] - '1';
 118   1              switch ( CommBuf.MsgData[4] )
 119   1              {
 120   2                      case READ_MOTOR_STATUS: // 读电机状态
 121   2                              if ( idx >= MAX_MOTOR_NUM )
 122   2                                      break;
 123   2      
 124   2                              // 正确回答
 125   2                              CommBuf.MsgData[0] = ACK_CHAR;  
 126   2      
 127   2                              // 填充电机方向
 128   2                              FillHalfByteToCommBuf( MotorStatus[idx].Dir & DIR_FLAG_MASK );
 129   2      
 130   2                              // 填充电机状态
 131   2                              tmp = MotorStatus[idx].Status & ZERO_RECORD_MASK ? 2 : 0;
 132   2                              tmp |= MotorStatus[idx].TotalPluseCnt ? 0 : 1;
 133   2                              FillHalfByteToCommBuf( tmp );
 134   2      
 135   2                              // 填充电机脉冲计数
 136   2                              dtmp = MotorStatus[idx].TotalPluseCnt >> 1;
 137   2      
 138   2                              ptr = (BYTE idata*)&dtmp + MSB;
 139   2                              if ( *ptr & 0x40 )
 140   2                                      *ptr |= 0x80;
 141   2                              FillByteToCommBuf( *ptr );
 142   2                              ptr++;
 143   2                              FillByteToCommBuf( *ptr );
 144   2                              ptr++;
 145   2                              FillByteToCommBuf( *ptr );
 146   2                              ptr++;
 147   2                              FillByteToCommBuf( *ptr );
 148   2                              break;
 149   2                      
 150   2                      case READ_VERSION:      // 读软件版本号
 151   2                              CommBuf.MsgData[0] = ACK_CHAR;  
 152   2                              FillByteToCommBuf( Version );
 153   2                              break;
 154   2              }
 155   1              
 156   1              CommandProcessExtra( );
 157   1      }
 158          
 159          void WriteCommand( void )
 160          {
 161   1              BYTE            idx;
 162   1              BYTE idata      *ptr;
 163   1              WORD            tmp;
 164   1      
 165   1              CommBuf.MsgData[0] = NO_ACK_CHAR;
 166   1              CommBuf.MsgCnt = CMD_HEAD_LEN;
 167   1              
 168   1              idx = CommBuf.MsgData[2] - '1';
 169   1              switch ( CommBuf.MsgData[4] )
 170   1              {
 171   2                      case WRITE_MOTOR_DATA:  // 写电机数据
 172   2                              if ( idx >= MAX_MOTOR_NUM )
 173   2                                      break;
 174   2                              
 175   2                              // 已运行
C51 COMPILER V7.04   COMM                                                                  01/23/2007 12:25:25 PAGE 4   

 176   2                              if ( MotorStatus[idx].Status & MOTOR_RUN_MASK )
 177   2                                      break;
 178   2      
 179   2                              // 保留零点记录标志,其余清除
 180   2                              MotorStatus[idx].Status &= ZERO_RECORD_MASK;
 181   2      
 182   2                              // 方向
 183   2                              MotorStatus[idx].Dir = HexCharToInt( CommBuf.MsgData[5] ) & DIR_FLAG_MASK;
 184   2                                                      
 185   2                              // 零位检测
 186   2                              if ( (HexCharToInt( CommBuf.MsgData[6] ) & 0x03) == 0x03 )
 187   2                                      break;
 188   2                              MotorStatus[idx].Status |= HexCharToInt( CommBuf.MsgData[6] ) & 0x01 ? ZERO_CHECK_MASK : 0;
 189   2                              MotorStatus[idx].Status |= HexCharToInt( CommBuf.MsgData[6] ) & 0x02 ? WORK_ZERO_CHECK_MASK : 0;
 190   2      

⌨️ 快捷键说明

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