📄 yxktv.lst
字号:
665 1 { case 0x1:/*显示编号*/
666 2 IniPos=1;
667 2 ShowIni();
668 2 break;
669 2 case 0x2: /*读配置*/
670 2 if (KeyNo!=KOK) break;
671 2
672 2 SendIni();
673 2
674 2 IniPos=1;
C51 COMPILER V7.00 YXKTV 05/08/2006 17:58:08 PAGE 12
675 2 ShowIni();
676 2
677 2 break;
678 2 case 0x3: /*写配置*/
679 2 if (KeyNo!=KOK) break;
680 2
681 2 AddH=SerData[7];
682 2 AddL=SerData[8];
683 2 PwrT=SerData[9];
684 2 Config1=SerData[10];
685 2 Config2=SerData[11];
686 2 Config3=SerData[12];
687 2 WriteIni();
688 2 ReadIni();
689 2 IniPos=1;
690 2 ShowIni();
691 2 SendIni();
692 2 break;
693 2 case 0x4: /*延时关机*/
694 2 //PwrTimer=SerData[7]*256 + SerData[8];
695 2 break;
696 2 default: //认为是按模式扫描启动
697 2 InputClr();
698 2 ShowNums();
699 2 break;
700 2
701 2 }
702 1 }
*** WARNING C280 IN LINE 663 OF C:\WAVE\PEI\YXKTV\YXKTV.C: 'i': unreferenced local variable
703
704 /*解读串口命令*/
705 void ReadCmd()
706 { register uchar i,Crc;
707 1
708 1 if (bRcvChar==0)//是显示字符时不效验Crc
709 1 {
710 2 Crc=0;
711 2 for (i=0;i<SerN-4;i++) Crc=Crc^SerData[i+3]; /*计算CRC,Len后Crc前的XOR值*/
712 2 if(Crc!=SerData[SerN-1]) /*CRC效验不正确*/
713 2 { goto ReadClear;
714 3
715 3 }
716 2 }
717 1
718 1 LED=~LED;
719 1
720 1 if (!((SerData[3]==AddH) && (SerData[5]==AddL)))
721 1 if (!((SerData[3]==0)&&(SerData[5]==0)))
722 1 goto ReadClear1;
723 1
724 1 /*地址相同或00*/
725 1 SerN=0; //!bug 有不发送应答的处理
726 1 //所以先清除SerN,否则后继第一条指令丢失
727 1 SleepTimer=PwrT*120;
728 1
729 1 switch (SerData[4]) /*命令码*/
730 1 {
731 2 case 0x50:
732 2 ReadCmd50();
733 2 //InputN=6; //按键不能再输入 no 会影响启动扫描命令的InputClr
734 2 bRcvOk=0;
735 2 return;
C51 COMPILER V7.00 YXKTV 05/08/2006 17:58:08 PAGE 13
736 2
737 2 case 0x51://多键
738 2 case 0x52://单键
739 2 case 0x53://定额
740 2 InputMode=SerData[4]-0x50;
741 2 SendInfo(SerData[6],1);//带DataPos
742 2
743 2 bRcvOk=0;
744 2 return;/*不用break,保证SERN不改写为0*/
745 2
746 2 case 0x5A:
747 2 for (i=0;i<6;i++) LcdBuf[i]=SerData[6+i];
748 2 ShowNums();
749 2 InputN=0;
750 2 bEnter=0;
751 2 break;
752 2
753 2 case 0x5C://循环显示效果
754 2 bRcvOk=0;
755 2 bRcvChar=0;
756 2 if (SerData[3]!=0) SendAck();//开始启动应答
757 2 CharN=SerData[2]-6;
758 2 LcdClr(0);
759 2 LCDLED=0;
760 2 LedTimer=C_LED; //亮
761 2 bLoopShow=1;
762 2 LoopPos=0;
763 2 return;//!!
764 2
765 2 case 0x5D://全屏显示效果
766 2 bRcvOk=0;
767 2 bRcvChar=0;
768 2 if (SerData[3]!=0) SendAck();
769 2 bLoopShow=0;//!!
770 2 CharN=SerData[2]-6;
771 2 LcdClr(0);
772 2 Prints(CharData[0],CharData[1],&CharData[2],CharN);
*** WARNING C259 IN LINE 772 OF C:\WAVE\PEI\YXKTV\YXKTV.C: 'parameter': pointer: different mspace
773 2 LCDLED=0;
774 2 LedTimer=C_LED; //亮
775 2 return;//!!
776 2
777 2 case 0x5E://写缺省显示数据
778 2 bRcvOk=0;
779 2 bRcvChar=0;
780 2 if (SerData[3]!=0) SendAck();//开始启动应答
781 2 CharN=SerData[2]-6;
782 2 if (CharN>0)
783 2 {
784 3 CharData[0]=CharN;
785 3 CharData[1]=0;
786 3 WrBytes(0x80,&CharData[0],CharN+2);
*** WARNING C259 IN LINE 786 OF C:\WAVE\PEI\YXKTV\YXKTV.C: 'parameter': pointer: different mspace
787 3 };
788 2 ShowEprom();
789 2 return;//!!
790 2
791 2 case 0x55://停止输入
792 2 InputMode=0;
793 2 if (SerData[6]==2) LcdClr(4);
794 2 break;
795 2 default:
C51 COMPILER V7.00 YXKTV 05/08/2006 17:58:08 PAGE 14
796 2 break;
797 2 };
798 1
799 1 ReadClear:
800 1 bRcvOk=0;
801 1 SerN=0;
802 1 bRcvChar=0;//must!!!!
803 1 return;
804 1
805 1 ReadClear1:
806 1 switch (SerData[4]) /*命令码*/
807 1 {
808 2
809 2 case 0x51:/*多键带计时*/
810 2 case 0x52:
811 2 case 0x53: /*单键带计时,包含抢答*/
812 2 InputMode=SerData[4]-0x50;
813 2 i=SerData[6];
814 2 if ((SerData[2]==5)&&(i<0x80))
815 2 { i=i&0x0f;
816 3 if (i!=DataPos)
817 3 { //收到不同的DataPos时表示已经启动新的扫描
818 4 DataPos=i;
819 4 InputClr();
820 4 ShowNums();
821 4 }
822 3 }
823 2 }
824 1 goto ReadClear;
825 1 }
826
827 void InputClr()
828 { uchar i;
829 1 for (i=0;i<6;i++) LcdBuf[i]=0x0f;
830 1 InputN=0;
831 1 bDot=0;bEnter=0;
832 1 TimerA=0;
833 1 Money=0;
834 1 }
835
836 void SystemIni()
837 { register uchar i;
838 1
839 1 TMOD=0x21; /*定时器0工作于方式1,定时器1工作于方式0*/
840 1 PCON=0x80; /*波特率19200*/
841 1 SCON=0x50; /*串行口为方式1,10位异步收发模式*/
842 1
843 1 TH0=C_T0H;
844 1 TL0=C_T0L;
845 1
846 1 TH1=0xFD;
847 1 TL1=0xFD;
848 1
849 1 IT0=1; /*外中断为下降沿触发*/
850 1 IP=0; /*中断优先级全部设为低优先级*/
851 1 //PS=1;/*串口设为高优先级 No!除非使用不同的BankRam否则影响其他中断的@R0等操作*/
852 1 ET0=1;ES=1; /*开定时器0中断和串行口中断*/
853 1 ET1=0; //串口定时器1关
854 1 EX0=0; //INT0关
855 1
856 1 P1=0xff;
857 1 P2=0xff;
C51 COMPILER V7.00 YXKTV 05/08/2006 17:58:08 PAGE 15
858 1 InputClr();
859 1
860 1 if (InitOkNum!=0xA5)
861 1 { ReadIni();
862 2 InitOkNum=0xA5;
863 2 InitOkNum1=0x5A;
864 2 //LcdAll();DelayMs(200);DelayMs(200);//复位测试
865 2 }
866 1
867 1 LcdInit();
868 1
869 1 TimerN=C_TIMERN;
870 1 LoopT=C_LOOPT;
871 1 SerN=0;
872 1 bRcvOk=0;bSendOk=1;
873 1 InputMode=1;
874 1 SleepTimer=10;//PwrT*120;
875 1 SleepN=3;
876 1
877 1 P3=0xff; //S52有开机RXD=0的情况
878 1 REN=1;
879 1 TR0=1;TR1=1; /*启动定时器0和定时器1*/
880 1 EA=1;
881 1
882 1 }
*** WARNING C280 IN LINE 837 OF C:\WAVE\PEI\YXKTV\YXKTV.C: 'i': unreferenced local variable
883
884 void int0 (void) interrupt 0 using 1
885 {
886 1 IE0=0;
887 1 }
888
889 void timer0 (void) interrupt 1 using 1
890 { /*TR0=0;*/
891 1 TH0=C_T0H;
892 1 TL0=TL0+C_T0L;
893 1 if (--TimerN==0 )
894 1 { bTimer=1;
895 2 TimerN=C_TIMERN;}
896 1 if (--LoopT==0 )
897 1 { if (bLoopShow) bLoop=1;
898 2 LoopT=C_LOOPT;}
899 1
900 1 /*TR0=1;*/
901 1 TimerA++;
902 1 bKeyScan=1;/*键盘防抖*/
903 1 }
904
905 void Int1 (void) interrupt 2 using 1
906 {
907 1 IE1=0;
908 1 }
909
910 void timer1 (void) interrupt 3 using 1
911 {
912 1 //TR1=0;//不能关闭Timer1
913 1
914 1 }
915
916 /*串口数据接收*/
917 void RecvData() using BANK_SERI
918 {
C51 COMPILER V7.00 YXKTV 05/08/2006 17:58:08 PAGE 16
919 1 if (bRcvOk) return;
920 1
921 1 //IconSETUP=1;//test
922 1
923 1 switch (SerN)
924 1 {
925 2 case 0:
926 2 if (SBUF==0xAA) {
927 3 SerData[0]=SBUF;
928 3 SerN++;
929 3 }
930 2 break;
931 2 case 1:
932 2 if (SBUF==0x55) {
933 3 SerData[1]=SBUF;
934 3 SerN++;
935 3 } else{
936 3 SerN=0;
937 3 }
938 2
939 2 break;
940 2 case 2:
941 2 if ((SBUF>3)&&(SBUF<80)) {//长度
942 3 SerData[2]=SBUF;
943 3 SerN++;
944 3 } else{
945 3 SerN=0;
946 3 }
947 2 break;
948 2 case 5:
949 2 SerData[5]=SBUF;
950 2 SerN++;
951 2 if (SerData[4]>=0x5C)
952 2 { if ((SBUF==AddL)||(SBUF==0))
953 3 bRcvChar=1;
954 3 else
955 3 SerN=0; //保证不修改其他键盘的显示缓冲区
956 3 }
957 2 break;
958 2 default:
959 2 if (bRcvChar==0)
960 2 {
961 3 if (SerN < C_SERMAXN )
962 3 {
963 4 SerData[SerN]=SBUF;
964 4 // if ((SerN==5)&&(SerData[4]>=0x5C))
965 4 // bRcvChar=1;
966 4 SerN++;
967 4 }else
968 3 { SerN=0;}
969 3 } else
970 2 {//接收显示数据
971 3 if (SerN>73)
972 3 { SerN=73;
973 4 }
974 3 CharData[SerN-6]=SBUF;
975 3 SerN++;
976 3 };
977 2
978 2 if (SerN == (SerData[2]+3)) {/*[0]=AA [1]=55 [2]=Len*/
979 3 bRcvOk=1; }
980 2 break;
C51 COMPILER V7.00 YXKTV 05/08/2006 17:58:08 PAGE 17
981 2 }
982 1 }
983
984
985 /*发送的数据入串口Buf*/
986 void PushSendBuf(uchar i)
987 {
988 1 if (SerN >= C_SERMAXN) return;
989 1 SerData[SerN]=i;
990 1 SerN++;
991 1 SerBufN++;
992 1 }
993
994 /*开始发送数据包*/
995 void StartSendBuf()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -