📄 main.lst
字号:
1155 2 if (DelayRate < MAXDELAYRATE && CmdCnt > 0)
1156 2 {
1157 3 DelayRate++;
1158 3 DelayRateLocked = FALSE;
1159 3 }
1160 2 #endif
1161 2
1162 2 RecvState = RECV_STX;
1163 2
1164 2 if (!SendReady && LLfReady)
1165 2 {
1166 3 if (RepCnt < MAXREPCNT)
1167 3 {
1168 4 RepCnt++;
1169 4 CALL_isr_UART();
1170 4 }
C51 COMPILER V7.06 MAIN 02/25/2005 08:31:59 PAGE 20
1171 3 else
1172 3 {
1173 4 RepCnt = 0;
1174 4 Quit = FALSE;
1175 4 SendReady = TRUE;
1176 4 }
1177 3 }
1178 2 }
1179 1 }
1180
1181
1182 /****************************************************************************
1183 * *
1184 * Function: isr_UART *
1185 * *
1186 * Input: - *
1187 * Output: - *
1188 * *
1189 * Description: *
1190 * *
1191 * Diese Interrupt-Funktion wird vom UART aufgerufen und bearbeitet das *
1192 * serielle Protokoll. *
1193 * *
1194 ****************************************************************************/
1195
1196 void isr_UART (void) interrupt 4 using 1
1197 {
1198 1 uchar c ;
1199 1 //uchar oldRecvState, chk;
1200 1
1201 1 if (RI)
1202 1 {
1203 2 c = SBUF ;
1204 2
1205 2 LED = !LED;
1206 2
1207 2 RI = 0 ;
1208 2
1209 2 if (FrameEnd==1)
1210 2 {
1211 3
1212 3 if( !(ChkSum ^=c) )
1213 3 {
1214 4 FrameOk = 1;
1215 4
1216 4 }
1217 3
1218 3 else
1219 3 FrameOk = 0 ;
1220 3
1221 3 FrameEnd = 0 ;
1222 3 }
1223 2
1224 2 if (FrameHead&(c !=ETX)&!FrameEnd)
1225 2 {
1226 3 PcData[DataNum++] = c ;
1227 3 ChkSum ^= c;
1228 3 DataLen++;
1229 3 ChkSum1 = ChkSum;
1230 3 if(DataLen == 42)
1231 3 {
1232 4 FrameEnd = 0;
C51 COMPILER V7.06 MAIN 02/25/2005 08:31:59 PAGE 21
1233 4 FrameHead = 0;
1234 4 ChkSum = 0;
1235 4 DataLen = 0;
1236 4 }
1237 3
1238 3 }
1239 2
1240 2 if( c == STX )
1241 2 {
1242 3
1243 3 Pt = PcData;
1244 3 if(ChkSum1 != STX) DataLen =0 ;
1245 3 FrameHead = 1;
1246 3 FrameEnd = 0;
1247 3 DataNum = 0;
1248 3 ChkSum = 0;
1249 3 }
1250 2
1251 2 if( c == ETX )
1252 2 {
1253 3 /* if(ChkSum1 != ETX )
1254 3 {
1255 3 FrameEnd = 1;
1256 3 FrameHead = 0;
1257 3 }
1258 3 */
1259 3 FrameEnd = 1;
1260 3 FrameHead = 0;
1261 3
1262 3 }
1263 2
1264 2
1265 2 }
1266 1
1267 1
1268 1 }
1269
1270 /***************************************************************************/
1271
1272 unsigned char AsiToHex(unsigned char ch1,unsigned char ch2)
1273 {
1274 1 unsigned char i,j,num1,num2,HexNum;
1275 1 i = ch1; j = ch2;
1276 1 if ((i>=0x30)&&(i<=0x39))
1277 1 {
1278 2 i-=0x30 ;
1279 2 num1 = i<<4 ;
1280 2 }
1281 1 else
1282 1 {
1283 2 i-= 0x41;
1284 2 num1 = i ;
1285 2 switch (num1)
1286 2 {
1287 3 case 0 : num1 = 0xa0; break;
1288 3 case 1 : num1 = 0xb0; break;
1289 3 case 2 : num1 = 0xc0; break;
1290 3 case 3 : num1 = 0xd0; break;
1291 3 case 4 : num1 = 0xe0; break;
1292 3 case 5 : num1 = 0xf0; break;
1293 3 }
1294 2
C51 COMPILER V7.06 MAIN 02/25/2005 08:31:59 PAGE 22
1295 2 }
1296 1
1297 1
1298 1
1299 1 if((j>=0x30)&&(j<=0x39))
1300 1 {
1301 2 j-= 0x30;
1302 2 num2 = j ;
1303 2 }
1304 1
1305 1 else
1306 1 {
1307 2 j-= 0x41;
1308 2 num2 = j ;
1309 2 switch (num2)
1310 2 {
1311 3 case 0 : num2 = 0x0a; break;
1312 3 case 1 : num2 = 0x0b; break;
1313 3 case 2 : num2 = 0x0c; break;
1314 3 case 3 : num2 = 0x0d; break;
1315 3 case 4 : num2 = 0x0e; break;
1316 3 case 5 : num2 = 0x0f; break;
1317 3 }
1318 2
1319 2 }
1320 1
1321 1
1322 1
1323 1 HexNum = num1+num2;
1324 1
1325 1 return HexNum ;
1326 1
1327 1 }
1328
1329
1330 void TransAsiHex(unsigned char *PtData1,unsigned char *PtData2,unsigned char cnt)
1331 {
1332 1 unsigned char *Pt0,*Pt1;
1333 1 unsigned char i,cnt0,ch1,ch2;
1334 1
1335 1 Pt0 = PtData1;
1336 1 Pt1 = PtData2;
1337 1 cnt0 = cnt/2;
1338 1 for(i=0;i<cnt0;i++)
1339 1 {
1340 2 ch1 = *Pt0++;
1341 2 ch2 = *Pt0++;
1342 2 *Pt1 = AsiToHex(ch1,ch2);
1343 2 Pt1++;
1344 2 }
1345 1 }
1346
1347
1348 void TransHexAsi(unsigned char *PtData1,unsigned char *PtData2,unsigned char cnt)
1349 {
1350 1 unsigned char *Pt0,*Pt1;
1351 1 unsigned char i,cnt0,ch1;
1352 1
1353 1 Pt0 = PtData1;
1354 1 Pt1 = PtData2;
1355 1 cnt0 = cnt;
1356 1 for(i=0;i<cnt0;i++)
C51 COMPILER V7.06 MAIN 02/25/2005 08:31:59 PAGE 23
1357 1 {
1358 2 ch1 = *Pt0;
1359 2 HexToAsi(ch1,Pt1);
1360 2 Pt0++;
1361 2 Pt1++; Pt1++;
1362 2
1363 2 }
1364 1 }
1365
1366 void HexToAsi(unsigned char ch,unsigned char *Ptm)
1367 {
1368 1 unsigned char i,j;
1369 1 unsigned char *Pt0;
1370 1 Pt0 = Ptm;
1371 1 i = ch;
1372 1 i = (i&0xf0)>>4;
1373 1 if(i<=9)
1374 1 i+=0x30;
1375 1 else
1376 1 {
1377 2 switch(i)
1378 2 {
1379 3 case 0x0a: i = 0x41; break;
1380 3 case 0x0b: i = 0x42; break;
1381 3 case 0x0c: i = 0x43; break;
1382 3 case 0x0d: i = 0x44; break;
1383 3 case 0x0e: i = 0x45; break;
1384 3 case 0x0f: i = 0x46; break;
1385 3 }
1386 2 }
1387 1
1388 1 *Pt0 = i;
1389 1 j = ch;
1390 1 j = ch&0x0f;
1391 1 if(j<=9)
1392 1 j += 0x30;
1393 1 else
1394 1
1395 1 {
1396 2
1397 2
1398 2 switch(j)
1399 2 {
1400 3 case 0x0a: j = 0x41; break;
1401 3 case 0x0b: j = 0x42; break;
1402 3 case 0x0c: j = 0x43; break;
1403 3 case 0x0d: j = 0x44; break;
1404 3 case 0x0e: j = 0x45; break;
1405 3 case 0x0f: j = 0x46; break;
1406 3 }
1407 2 }
1408 1
1409 1 Pt0++;
1410 1 *Pt0 = j;
1411 1
1412 1 }
1413
1414 void SendDataToPc(uchar *Ptm,uchar cnt)
1415 {
1416 1 unsigned char i;
1417 1 unsigned char checksum = 0;
1418 1
C51 COMPILER V7.06 MAIN 02/25/2005 08:31:59 PAGE 24
1419 1 SBUF = STX ;
1420 1 while(!TI);
1421 1 TI = 0;
1422 1 for(i=0; i<cnt ; i++)
1423 1 {
1424 2 SBUF = *Ptm ;
1425 2 while(!TI);
1426 2 TI = 0;
1427 2 checksum ^= *Ptm;
1428 2 ++Ptm;
1429 2
1430 2 }
1431 1
1432 1 SBUF = ETX ;
1433 1 while(!TI);
1434 1 TI = 0;
1435 1
1436 1 SBUF = checksum ;
1437 1 while(!TI);
1438 1 TI = 0;
1439 1
1440 1 }
1441
1442
1443 // 将 PtData1:PC ASCII 码 命令帧转换为 HEX 数据 并
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -