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