📄 comm.lst
字号:
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 + -