📄 memcard.lst
字号:
742 /*
743 功能:写SLE4428卡保护位
744 参数:
745 iOffset:写入数据起始地址
746 sBuffer:写入数据指针
747 iBufferLen:写入长度
748 返回:
749 TRUE
750 */
751 bit write_pbit_sle4428(uint iOffset,uchar iBufferLen,uchar* sBuffer)
752 {
753 1 uchar data i;
754 1 uint data ipOffset,iTemp;
755 1 uchar cTemp[2];
756 1 uchar* swBuffer;
757 1 if((iOffset<0)||(iOffset>1020))
758 1 return FALSE;
759 1 if((1021-iOffset)<iBufferLen)
760 1 return FALSE;
761 1 swBuffer=sBuffer;
762 1 ipOffset=iOffset;
763 1 answer_reset_4428();
764 1 for(i=0;i<iBufferLen;i++)
765 1 {
766 2 memcpy(cTemp,&ipOffset,2);
767 2 cTemp[0]=(cTemp[0]*64)|0x30;
768 2 byte_write_4428(cTemp[0]);
769 2 byte_write_4428(cTemp[1]);
770 2 byte_write_4428(*swBuffer++);
771 2 if(process_4428()!=TRUE)
772 2 return FALSE;
773 2 ipOffset++;
774 2 }
775 1 answer_reset_4428();
776 1 memcpy(cTemp,&iOffset,2);
777 1 cTemp[0]=(cTemp[0]*64)|0x0c;
778 1 byte_write_4428(cTemp[0]);
779 1 byte_write_4428(cTemp[1]);
780 1 byte_write_4428(0xff);
781 1 for(i=0;i<iBufferLen;i++)
782 1 {
783 2 iTemp=byte_read_wpbit_4428();
784 2 memcpy(cTemp,&iTemp,2);
785 2 if(cTemp[1]!=0x00)
786 2 return FALSE;
787 2 if(cTemp[0]!=*sBuffer++)
788 2 return FALSE;
789 2 }
790 1 return TRUE;
791 1 }
792
793 /*
794 功能:比较SLE4428密码
795 参数:
796 sPassword:密码存放指针
797 iPassLen:密码长度
798 返回:
799 TRUE
C51 COMPILER V6.12 MEMCARD 12/09/2002 13:03:11 PAGE 14
800 */
801 bit compare_password_sle4428(uchar* sPassword,uchar iPassLen)
802 {
803 1 uchar cTemp;
804 1 if(iPassLen!=2)
805 1 return FALSE;
806 1 cTemp=error_counter_4428();
807 1 if(cTemp!=0x00)
808 1 {
809 2 switch(cTemp)
810 2 {
811 3 case 0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff:
812 3 {
813 4 cTemp=cTemp&0xfe;
814 4 break;
815 4 }
816 3 case 0x02,0x06,0x0e,0x1e,0x3e,0x7e,0xfe:
817 3 {
818 4 cTemp=cTemp&0xfc;
819 4 break;
820 4 }
821 3 case 0x04,0x0c,0x1c,0x3c,0x7c,0xfc:
822 3 {
823 4 cTemp=cTemp&0xf8;
824 4 break;
825 4 }
826 3 case 0x08,0x18,0x38,0x78,0xf8:
827 3 {
828 4 cTemp=cTemp&0xf0;
829 4 break;
830 4 }
831 3 case 0x10,0x30,0x70,0xf0:
832 3 {
833 4 cTemp=cTemp&0xe0;
834 4 break;
835 4 }
836 3 case 0x20,0x60,0xe0:
837 3 {
838 4 cTemp=cTemp&0xc0;
839 4 break;
840 4 }
841 3 case 0x40,0xc0:
842 3 {
843 4 cTemp=cTemp&0x80;
844 4 break;
845 4 }
846 3 case 0x80:
847 3 {
848 4 cTemp=cTemp&0x00;
849 4 break;
850 4 }
851 3 default:
852 3 {
853 4 return FALSE;
854 4 }
855 3 }
856 2 }
857 1 byte_write_4428(0xf2);
858 1 byte_write_4428(0xfd);
859 1 byte_write_4428(cTemp);
860 1 if(process_4428()!=TRUE)
861 1 return FALSE;
C51 COMPILER V6.12 MEMCARD 12/09/2002 13:03:11 PAGE 15
862 1 byte_write_4428(0xcd);
863 1 byte_write_4428(0xfe);
864 1 byte_write_4428(*sPassword++);
865 1 if(process_4428()!=TRUE)
866 1 return FALSE;
867 1 byte_write_4428(0xcd);
868 1 byte_write_4428(0xff);
869 1 byte_write_4428(*sPassword);
870 1 if(process_4428()!=TRUE)
871 1 return FALSE;
872 1 byte_write_4428(0xf3);
873 1 byte_write_4428(0xfd);
874 1 byte_write_4428(0xff);
875 1 if(process_4428()!=TRUE)
876 1 return FALSE;
877 1 cTemp=error_counter_4428();
878 1 if(cTemp==0xff)
879 1 return TRUE;
880 1 return FALSE;
881 1 }
882
883 /*
884 功能:读取SLE4428密码
885 参数:
886 sPassword:密码存放指针
887 iPassLen:密码长度
888 返回:
889 TRUE
890 */
891 bit read_password_sle4428(uchar* sPassword,uchar iPassLen)
892 {
893 1 bit st;
894 1 if(iPassLen!=2)
895 1 return FALSE;
896 1 st=read_sle4428(1022,2,sPassword);
897 1 if(st!=1)
898 1 return FALSE;
899 1 return TRUE;
900 1 }
901
902 /*
903 功能:更改SLE4428密码
904 参数:
905 iPassLen:密码数量
906 sPassword:密码指针
907 返回:
908 TRUE
909 */
910 bit change_password_sle4428(uchar* sPassword,uchar iPassLen)
911 {
912 1 bit st;
913 1 if(iPassLen!=2)
914 1 return FALSE;
915 1 st=write_sle4428(1022,2,sPassword);
916 1 if(st!=1)
917 1 return FALSE;
918 1 return TRUE;
919 1 }
920
921 /*
922 功能:读SLE4428错误计数器
923 参数:无
C51 COMPILER V6.12 MEMCARD 12/09/2002 13:03:11 PAGE 16
924 返回:错误计数器值
925 */
926 ///////////////////////////////////////////////////////////////////////////////////////
927 ///////////以下为SLE4406的函数////////////////////////////////////////////////////////
928 //////////////////////////////////////////////////////////////////////////////////////
929 /*复位应答*/
930 void reset_4406(void)
931 {
932 1 RST=HIGH;
933 1 delay(DELAY_4406);
934 1 SCL = 0;
935 1 delay(DELAY_4406);
936 1 SCL = 1;
937 1 delay(DELAY_4406);
938 1 RST=LOW;
939 1 delay(DELAY_4406);
940 1 }
941
942 /*设置地址*/
943 void address_setting_4406(uchar iOffset)
944 {
945 1 uchar data i,j;
946 1 for(i=0;i<iOffset;i++)
947 1 {
948 2 for(j=0;j<8;j++)
949 2 {
950 3 SCL = 0;
951 3 delay(DELAY_4406);
952 3 SCL = 1;
953 3 delay(DELAY_4406);
954 3 }
955 2 }
956 1 }
957 //*******************************************************************************
958 //读一字节
959 uchar byte_read_4406(void)
960 {
961 1 uchar data i,cTemp=0;
962 1 SDA=HIGH;
963 1 for(i=0;i<8;i++)
964 1 {
965 2 cTemp=cTemp*2;
966 2 if(SDA==HIGH)
967 2 cTemp++;
968 2 SCL = 0;
969 2 delay(DELAY_4406);
970 2 SCL = 1;
971 2 delay(DELAY_4406);
972 2 }
973 1 return cTemp;
974 1 }
975
976 //写一字节
977 bit byte_write_4406(uchar cTemp)
978 {
979 1 uchar data i;
980 1 for(i=0;i<8;i++)
981 1 {
982 2 if((cTemp&0x80)==0x80)
983 2 {
984 3 SDA=HIGH;
985 3 delay(DELAY_4406);
C51 COMPILER V6.12 MEMCARD 12/09/2002 13:03:11 PAGE 17
986 3 if(SDA==LOW)
987 3 return FALSE;
988 3 }
989 2 else if((cTemp&0x80)==0x00)
990 2 {
991 3 SDA=LOW;
992 3 RST=HIGH;
993 3 delay(DELAY_4406);
994 3 RST=LOW;
995 3 delay(DELAY_4406);
996 3 SCL = 0;
997 3 delay(DELAY_4406);
998 3 SCL = 1;
999 3 delay(DELAY_4406);
1000 3 SDA=HIGH;
1001 3 delay(DELAY_4406);
1002 3 if(SDA==HIGH)
1003 3 return FALSE;
1004 3 }
1005 2 SCL = 0;
1006 2 delay(DELAY_4406);
1007 2 SCL = 1;
1008 2 delay(DELAY_4406);
1009 2 cTemp=cTemp<<1;
1010 2 }
1011 1 return TRUE;
1012 1 }
1013
1014
1015 /////////////////////////////////////////////////////////////////////////////////
1016 /*
1017 功能:读取sle4406中的数据
1018 参数:
1019 iOffset: 读取数据起始地址
1020 iReadLen: 读取数据长度
1021 sBuffer: 读取数据存放地址
1022 返回:
1023 操作状态
1024 */
1025 bit read_sle4406(uchar iOffset,uchar iReadLen,uchar* sBuffer)
1026 {
1027 1 uchar data i;
1028 1 if(iOffset<0||iOffset>12)
1029 1 return FALSE;
1030 1 if((13-iOffset)<iReadLen)
1031 1 return FALSE;
1032 1 reset_4406();
1033 1 address_setting_4406(iOffset);
1034 1 for(i=0;i<iReadLen;i++)
1035 1 *sBuffer++=byte_read_4406();
1036 1 return TRUE;
1037 1 }
1038
1039 /*
1040 功能:向sle4406中写入数据
1041 参数:
1042 iOffset: 写入数据起始地址
1043 iReadLen: 写入数据长度
1044 sBuffer: 写入数据地址
1045 返回:
1046 操作状态
1047 */
C51 COMPILER V6.12 MEMCARD 12/09/2002 13:03:11 PAGE 18
1048 bit write_sle4406(uchar iOffset,uchar iWriteLen,uchar* sBuffer)
1049 {
1050 1 uchar data i;
1051 1 if(iOffset<0||iOffset>12)
1052 1 return FALSE;
1053 1 if((13-iOffset)<iWriteLen)
1054 1 return FALSE;
1055 1 reset_4406();
1056 1 address_setting_4406(iOffset);
1057 1 for(i=0;i<iWriteLen;i++)
1058 1 if(byte_write_4406(*sBuffer++)!=TRUE)
1059 1 return FALSE;
1060 1 return TRUE;
1061 1 }
1062
1063 /*
1064 功能:读密码计数器值
1065 参数:无
1066 返回:
1067 计数器值 0~8
1068 */
1069 uchar password_counter_sle4406(void)
1070 {
1071 1 uchar data i;
1072 1 uchar data cTemp,counter=0;
1073 1 reset_4406();
1074 1 address_setting_4406(9);
1075 1 cTemp=byte_read_4406();
1076 1 for(i=0;i<8;i++)
1077 1 {
1078 2 if((cTemp&0x80)==0x80)
1079 2 counter++;
1080 2 cTemp=cTemp<<1;
1081 2 }
1082 1 return counter;
1083 1 }
1084 /*
1085 功能:读取sle4406密码
1086 参数:
1087 sPassword: 读取密码存放指针
1088 iPassLen: 密码长度
1089 返回:
1090 操作状态
1091 */
1092 bit read_password_sle4406(uchar* sPassword)
1093 {
1094 1 return(read_sle4406(10,3,sPassword));
1095 1 }
1096
1097 /*
1098 功能:修改sle4406密码
1099 参数:
1100 sPassword: 读取密码存放指针
1101 iPassLen: 密码长度
1102 返回:
1103 操作状态
1104 */
1105 bit change_password_sle4406(uchar* sPassword)
1106 {
1107 1 return(write_sle4406(10,3,sPassword));
1108 1 }
1109
C51 COMPILER V6.12 MEMCARD 12/09/2002 13:03:11 PAGE 19
1110 /*
1111 功能:校验sle4406密码
1112 参数:
1113 sPassword: 读取密码存放指针
1114 iPassLen: 密码长度
1115 返回:
1116 操作状态
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -