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