📄 yxkeyv1.0.lst
字号:
523
524 void Int1 (void) interrupt 2 using 1
525 {
526 1 IE1=0;
527 1 }
528
529 void timer1 (void) interrupt 3 using 1
530 {
531 1 TR1=0;
532 1 }
533
534 /*串口数据接收*/
535 void RecvData() using BANK_SERI
536 {
537 1 if (bRcvOk) return;
538 1
539 1 switch (SerN)
540 1 {
541 2 case 0:
542 2 if (SBUF==0xAA) {
543 3 SerData[0]=SBUF;
544 3 SerN++;
545 3 }
546 2 break;
547 2 case 1:
548 2 if (SBUF==0x55) {
549 3 SerData[1]=SBUF;
550 3 SerN++;
C51 COMPILER V7.00 YXKEYV1_0 09/04/2004 15:45:57 PAGE 10
551 3 } else{
552 3 SerN=0;
553 3 }
554 2
555 2 break;
556 2 case 2:
557 2 if ((SBUF>3)&&(SBUF<14)) {//长度
558 3 SerData[2]=SBUF;
559 3 SerN++;
560 3 } else{
561 3 SerN=0;
562 3 }
563 2 break;
564 2 default:
565 2 if (SerN < C_SERMAXN )
566 2 {
567 3 SerData[SerN]=SBUF;
568 3 SerN++;
569 3 if (SerN == (SerData[2]+3)) {/*[0]=AA [1]=55 [2]=Len*/
570 4 bRcvOk=1;
571 4 }
572 3 }else{
573 3 SerN=0;
574 3 }
575 2 break;
576 2 }
577 1 }
578
579
580 /*发送的数据入串口Buf*/
581 void PushSendBuf(uchar i)
582 {
583 1 if (SerN >= C_SERMAXN) return;
584 1 SerData[SerN]=i;
585 1 SerN++;
586 1 SerBufN++;
587 1 }
588
589 /*开始发送数据包*/
590 void StartSendBuf()
591 {
592 1 TR=0;/*切换到发送状态*/
593 1 IconTX=1;
594 1 DelayMs(2);
595 1
596 1 SerHeadN=C_HEADN ;
597 1 SerN=0;
598 1 SBUF=0x55;
599 1 bSendOk=0;
600 1 }
601
602 /*串口发送中断调用的 串口数据发送*/
603 void SendData() using BANK_SERI
604 {
605 1 if (bSendOk) return;
606 1
607 1 /* if (SerHeadN>0) /*发送引导数据*/
608 1 /* { if (SerHeadN==1) SBUF=0x66 ;
609 1 else
610 1 if (SerHeadN==2) SBUF=0xFF ;
611 1 else SBUF=0x55;
612 1 SerHeadN--;
C51 COMPILER V7.00 YXKEYV1_0 09/04/2004 15:45:57 PAGE 11
613 1 return;
614 1 }
615 1 */
616 1 SBUF=SerData[SerN];
617 1 SerN++;
618 1 //if (SerN>=SerBufN)//Bug!最后一个字节不发送
619 1 if (SerN>SerBufN)
620 1 {
621 2 TR=1; /*切换到接收状态*/
622 2 bSendOk=1;
623 2 SerN=0;
624 2 SerBufN=0;
625 2 }
626 1 }
627
628 void serials(void) interrupt 4 using BANK_SERI
629 {
630 1 if(RI==1)
631 1 {
632 2 RI=0;
633 2 //if (TR==1) RecvData();/*有发送状态产生接受中断的情况*/
634 2 RecvData();
635 2 return;
636 2 }
637 1 if(TI==1)
638 1 {
639 2 TI=0;
640 2 SendData();
641 2 }
642 1 }
643
644 /*------------------------------*/
645 void KeyScan()
646 { uchar code KEYTAB[] =
647 1 { 0,0x0e,0x0f,0x0c,0x0d,1,4,7,0x0a,2,5,8,0,3,6,9,0x0b,0x10};
648 1
649 1 register uchar i,KeyTemp;
650 1
651 1 bKeyScan=0;
652 1
653 1 bKeyOk=0;
654 1 P1=0xff;
655 1 for (i=0;i<4;i++)
656 1 {
657 2 if (i==0) K0=0;
658 2 if (i==1) K1=0;
659 2 if (i==2) K2=0;
660 2 if (i==3) K3=0;
661 2 KeyTemp = i*4;
662 2 if (K4==0) {KeyTemp=KeyTemp+1;break;}
663 2 if (K5==0) {KeyTemp=KeyTemp+2;break;}
664 2 if (K6==0) {KeyTemp=KeyTemp+3;break;}
665 2 if (K7==0) {KeyTemp=KeyTemp+4;break;}
666 2 KeyTemp=0;
667 2 };
668 1 P1=P1Led;//重写
669 1
670 1 if (KeyTemp==0)
671 1 { KeyNo=0;
672 2 LED=1;
673 2 return;
674 2 }
C51 COMPILER V7.00 YXKEYV1_0 09/04/2004 15:45:57 PAGE 12
675 1 LED=0;
676 1 KeyTemp=KEYTAB[KeyTemp];
677 1 if (KeyTemp==KeyNo ) return;
678 1 KeyNo=KeyTemp;
679 1 bKeyOk=1;
680 1
681 1 }
682
683
684 /*---24c02--*/
685 void Start24()
686 { SDA=1;
687 1 NOP
688 1 SCL=1;//When CLK=1,SDA 1->0 =START!
689 1 NOP
690 1 SDA=0;
691 1 NOP
692 1 SCL=0;
693 1 NOP
694 1
695 1 }
696
697 void Stop24()
698 {
699 1 SDA=0;
700 1 NOP
701 1 SCL=1;
702 1 NOP
703 1 SDA=1;
704 1 NOP
705 1 }
706
707 unsigned char Rd24(void)
708 { register unsigned char i;
709 1 SDA=1;
710 1 /* SCL=1;a7=SDA;SCL=0;
711 1 SCL=1;a6=SDA;SCL=0;
712 1 SCL=1;a5=SDA;SCL=0;
713 1 SCL=1;a4=SDA;SCL=0;
714 1 SCL=1;a3=SDA;SCL=0;
715 1 SCL=1;a2=SDA;SCL=0;
716 1 SCL=1;a1=SDA;SCL=0;
717 1 SCL=1;a0=SDA;SCL=0;*/
718 1 ICData=0;
719 1 SCL=0;
720 1 for (i=0;i<8;i++)
721 1 { SCL=1; NOP /*实测5V下不延时也可*/
722 2 ICDataB0=SDA; NOP
723 2 SCL=0; NOP
724 2 if (i!=7) ICData=ICData<<1;
725 2 }
726 1 SDA=bAck;
727 1 SCL=1;NOP
728 1 SCL=0;NOP /*写应答位*/
729 1 return(ICData);
730 1 }
731
732 bit Wr24(unsigned char dd)
733 { register unsigned char i;
734 1 /* ACC=dd;
735 1 SDA=a7;SCL=1;SCL=0;
736 1 SDA=a6;SCL=1;SCL=0;
C51 COMPILER V7.00 YXKEYV1_0 09/04/2004 15:45:57 PAGE 13
737 1 SDA=a5;SCL=1;SCL=0;
738 1 SDA=a4;SCL=1;SCL=0;
739 1 SDA=a3;SCL=1;SCL=0;
740 1 SDA=a2;SCL=1;SCL=0;
741 1 SDA=a1;SCL=1;SCL=0;
742 1 SDA=a0;SCL=1;SCL=0; */
743 1 ICData=dd;
744 1 for (i=0;i<8;i++)
745 1 {
746 2 SDA=ICDataB7; NOP /*实测5V下不延时也可*/
747 2 SCL=1; NOP
748 2 SCL=0; NOP
749 2 ICData=ICData<<1;
750 2 }
751 1
752 1 SDA=1;SCL=1; /*等待应答0*/
753 1 for (i=0;i<100;i++)
754 1 { if (SDA==0) break;
755 2 }
756 1 bAck=SDA;
757 1 SCL=0;
758 1 return bAck;
759 1 }
760
761 bit RdBytes24(unsigned int iAddr,uchar iLen)
762 { unsigned char ddd,i;
763 1
764 1 ddd=((iAddr&0x7ff)/256)<<1;
765 1 Start24();
766 1 if (Wr24(0xa0|ddd)==1)
767 1 {bAck=0;goto RDSTOP;}//err
768 1 Wr24(iAddr);
769 1 NOP
770 1 Start24();Wr24(0xa1|ddd);
771 1
772 1 for (i=0;i<iLen;i++)
773 1 {
774 2 bAck=0;if (i==(iLen-1)) bAck=1;
775 2 IcBuf[i]=Rd24();
776 2 };
777 1 Stop24();
778 1 return bAck;
779 1
780 1 RDSTOP:
781 1 Stop24();
782 1 return bAck;
783 1 }
784
785 bit WrBytes24(unsigned int iAddr,uchar iLen)
786 {
787 1 unsigned char ddd,i;
788 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -