📄 yxkeyv1.0.lst
字号:
258 2 PwrT=IcBuf[2];
259 2 Config1=IcBuf[3];
260 2 Config2=IcBuf[4];
261 2 Config3=IcBuf[5];
262 2 }
263 1
264 1 }
265
266
267
268 void SendIni()
269 { uchar data i,Crc;
270 1
271 1 EA=0;SerN=0;TR=0;
272 1
273 1 PushSendBuf(0xAA);
274 1 PushSendBuf(0x55);
275 1 PushSendBuf(0x0b);
276 1 PushSendBuf(AddH);
277 1 PushSendBuf(0x50);
278 1 PushSendBuf(AddL);
279 1 PushSendBuf(02);
280 1 PushSendBuf(AddH);
281 1 PushSendBuf(AddL );
282 1 PushSendBuf(PwrT);
283 1 PushSendBuf(Config1);
284 1 PushSendBuf(Config2);
285 1 PushSendBuf(Config3);
286 1
287 1 Crc=0;
288 1 for (i=1;i<SerData[2];i++)
289 1 Crc=Crc^SerData[i+2];
290 1
291 1 PushSendBuf(Crc);
292 1 EA=1;
293 1 StartSendBuf();
294 1
295 1 }
296
297
298
299 void TimerFunc()
300 { bTimer=0;
301 1
302 1 LED2=~LED2;
303 1 //SendMoreKey();
C51 COMPILER V7.00 YXKEYV1_0 09/04/2004 15:45:57 PAGE 6
304 1 }
305
306 /*多键结果*/
307 void SendMoreKey()
308 { uchar data i,Crc;
309 1 EA=0;SerN=0;TR=0;
310 1
311 1 PushSendBuf(0xAA);
312 1 PushSendBuf(0x55);
313 1 PushSendBuf(0x0C);
314 1 PushSendBuf(AddH);
315 1 if (bEnter) PushSendBuf(0x52);else PushSendBuf(0x51);
316 1 PushSendBuf(AddL);
317 1 PushSendBuf(LcdBuf[0]);
318 1 PushSendBuf(LcdBuf[1]);
319 1 PushSendBuf(LcdBuf[2]);
320 1 PushSendBuf(LcdBuf[3]);
321 1 PushSendBuf(LcdBuf[4]);
322 1 PushSendBuf(LcdBuf[5]);
323 1 PushSendBuf(TimerA /256 );
324 1 PushSendBuf(TimerA);
325 1
326 1 Crc=0;
327 1 for (i=1;i<SerData[2];i++)
328 1 Crc=Crc^SerData[i+2];
329 1
330 1 PushSendBuf(Crc);
331 1 EA=1;
332 1 StartSendBuf();
333 1
334 1 }
335
336 /*单键结果*/
337 void SendOneKey()
338 { uchar data i,Crc;
339 1 EA=0;SerN=0;TR=0;
340 1
341 1 PushSendBuf(0xAA);
342 1 PushSendBuf(0x55);
343 1 PushSendBuf(0x05);//len
344 1 PushSendBuf(AddH);
345 1 PushSendBuf(0x53);
346 1 PushSendBuf(AddL);
347 1 PushSendBuf(LcdBuf[5]);
348 1 //PushSendBuf(TimerA /256 );
349 1 //PushSendBuf(TimerA);
350 1
351 1 Crc=0;
352 1 for (i=1;i<SerData[2];i++)
353 1 Crc=Crc^SerData[i+2];
354 1
355 1 PushSendBuf(Crc);
356 1 EA=1;
357 1 StartSendBuf();
358 1
359 1 }
360
361
362 /*处理系统命令*/
363 void ReadCmd50()
364 { //uchar data i;
365 1 switch (SerData[6]) /*子命令码*/
C51 COMPILER V7.00 YXKEYV1_0 09/04/2004 15:45:57 PAGE 7
366 1 { case 0x1:/*显示编号*/
367 2 break;
368 2 case 0x2: /*读配置*/
369 2 if ((KeyNo!=KOK)&&(KeyNo!=KK7)) break;
370 2
371 2 SendIni();
372 2
373 2 break;
374 2 case 0x3: /*写配置*/
375 2 if ((KeyNo!=KOK)&&(KeyNo!=KK7)) break;
376 2
377 2 AddH=SerData[7];
378 2 AddL=SerData[8];
379 2 PwrT=SerData[9];
380 2 Config1=SerData[10];
381 2 Config2=SerData[11];
382 2 Config3=SerData[12];
383 2 WriteIni();
384 2 ReadIni();
385 2 SendIni();
386 2 break;
387 2
388 2 case 0x4: /*延时关机*/
389 2 PwrTimer=SerData[7]*256 + SerData[8];
390 2 break;
391 2 default: //认为是按模式扫描启动
392 2 InputClr();
393 2 break;
394 2 }
395 1 //Beep();
396 1 }
397
398 /*解读串口命令*/
399 void ReadCmd()
400 { register uchar i,Crc;
401 1
402 1
403 1 Crc=0;
404 1 for (i=0;i<SerN-4;i++) Crc=Crc^SerData[i+3]; /*计算CRC,Len后Crc前的XOR值*/
405 1 if(Crc!=SerData[SerN-1]) /*CRC效验不正确*/
406 1 { goto ReadClear;
407 2
408 2 }
409 1
410 1 LED2=~LED2;
411 1 P1=P1Led;
412 1
413 1 if (!((SerData[3]==AddH) && (SerData[5]==AddL)))
414 1 if (!((SerData[3]==0)&&(SerData[5]==0)))
415 1 goto ReadClear;/*地址相同或00*/
416 1
417 1 SerN=0; //!bug 有不发送应答的处理
418 1 //所以先清除SerN,否则后继第一条指令丢失
419 1
420 1 switch (SerData[4]) /*命令码*/
421 1 {
422 2 case 0x50:
423 2 ReadCmd50();
424 2 //InputN=6; //按键不能再输入 no 会影响启动扫描命令的InputClr
425 2 bRcvOk=0;
426 2 return;
427 2
C51 COMPILER V7.00 YXKEYV1_0 09/04/2004 15:45:57 PAGE 8
428 2 case 0x51:/*多键带计时,包含抢答*/
429 2 case 0x52:
430 2 if (SerData[2]==4)//len
431 2 SendMoreKey();
432 2 bRcvOk=0;
433 2 return;/*不用break,保证SERN不改写为0*/
434 2
435 2 case 0x53: /*单键不带计时*/
436 2 if (SerData[2]==4)//len
437 2 SendOneKey();
438 2 bRcvOk=0;
439 2 return;
440 2
441 2 case 0x5A: //显示数字
442 2 InputN=0;
443 2 bEnter=0;
444 2 break;
445 2
446 2 default:
447 2 break;
448 2 };
449 1
450 1 ReadClear:
451 1 SerN=0;
452 1 bRcvOk=0;
453 1 return;
454 1 }
455
456 void InputClr()
457 { uchar i;
458 1 for (i=0;i<6;i++) LcdBuf[i]=0x0f;
459 1 for (i=0;i<3;i++) KeyBuf[i]=0xff;
460 1 InputN=0;
461 1 bDot=0;bEnter=0;
462 1 TimerA=0;
463 1 }
464
465 void SystemIni()
466 { register uchar i;
467 1
468 1 TMOD=0x21; /*定时器0工作于方式1,定时器1工作于方式0*/
469 1 PCON=0x80; /*波特率19200*/
470 1 SCON=0x50; /*串行口为方式1,10位异步收发模式*/
471 1
472 1 TH0=C_T0H;
473 1 TL0=C_T0L;
474 1
475 1 TH1=0xFD;
476 1 TL1=0xFD;
477 1 TR0=1;TR1=1; /*启动定时器0和定时器1*/
478 1 IT0=1; /*外中断为下降沿触发*/
479 1 IP=0; /*中断优先级全部设为低优先级*/
480 1 //PS=1;/*串口设为高优先级 No!除非使用不同的BankRam否则影响其他中断的@R0等操作*/
481 1 EX0=1; /*开发各个中断*/
482 1 ET0=1;ES=1; /*开定时器0中断和串行口中断*/
483 1
484 1 TR=1; /*系统先置为接收状态*/
485 1
486 1 if ((InitOkNum!=0xAA) | (InitOkNum2!=0x55))
487 1 { ReadIni();
488 2 InitOkNum=0xAA;
489 2 InitOkNum2=0x55;
C51 COMPILER V7.00 YXKEYV1_0 09/04/2004 15:45:57 PAGE 9
490 2 }
491 1 P1Led=0xff;
492 1
493 1 PwrTimer=PwrT*120;
494 1 TimerN=C_TIMERN;
495 1 SerN=0;
496 1 bRcvOk=0;bSendOk=1;
497 1
498 1 LED=0;
499 1 //for (i=0;i<20;i++) DelayMs(200);//复位测试
500 1
501 1 InputClr();
502 1 REN=1;
503 1 EA=1;
504 1
505 1 }
*** WARNING C280 IN LINE 466 OF C:\WAVE\PEI\YXKEY\YXKEYV1.0.C: 'i': unreferenced local variable
506
507 void int0 (void) interrupt 0 using 1
508 {
509 1 IE0=0;
510 1 }
511
512 void timer0 (void) interrupt 1 using 1
513 { /*TR0=0;*/
514 1 TH0=C_T0H;
515 1 TL0=TL0+C_T0L;
516 1 if (--TimerN==0 )
517 1 { bTimer=1;
518 2 TimerN=C_TIMERN;}
519 1 /*TR0=1;*/
520 1 TimerA++;
521 1 bKeyScan=1;/*键盘防抖*/
522 1 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -