📄 at88scxx.lst
字号:
880 write(pw);
881 delay_ms(); delay_ms();delay_ms();
882
883 pw[0]=0XB6;
884 pw[1]=0X00;
885 pw[2]=pw_select&0x0f;
886 pw[2]=pw[2]*0x08;
887 pw[2]=pw[2]+0xb4;
888 pw[3]=0x01;
889 read(pw);
890
891 GPA_CLOCK(0x00,0x05);//GPA[0]=0x00;GPA_CLOCK(5);
892 GPA_CLOCK(pw[2],0x01);//GPA[0]=pw[2];GPA_CLOCK(1);
893 GPA_CLOCK(0x00,0x05);//GPA[0]=0x00;GPA_CLOCK(5);
894 GPA_CLOCK(0x01,0x01);//GPA[0]=0x01;GPA_CLOCK(1);
895
896 pw[4]=pw[4]^GPA[0];
897 GPA_CLOCK(pw[4],0x01);//GPA[0]=pw[4];GPA_CLOCK(1);
898 GPA_CLOCK(0x00,0x05);//GPA[0]=0x00;GPA_CLOCK(5);
899
900 return pw[4];
901 }*/
902
903 //*******************set_user_zone************************
904 //选择用户区
905 //zone:用户区序号
906 //**********************************************************
907 void set_user_zone(unsigned char zone)
908 {
909 1 unsigned char zon[4];
910 1
911 1 GPA_CLOCK(zone,0x01);
912 1 zon[0]=0xb4;
C51 COMPILER V7.50 AT88SCXX 02/19/2008 15:50:58 PAGE 16
913 1 zon[1]=0x03;
914 1 zon[2]=zone;
915 1 zon[3]=0x00;
916 1 write(zon);
917 1 Wait_For_AckPolling();
918 1 }
919 //**************************read_user_zone**************************
920 //读出用户区密文数据,并解出明文数据
921 //rd_high_addr 用户区高字节地址
922 //rd_low_addr 用户区低字节地址
923 //rd_number 读取密文数据及解出明文数据的个数
924 //解密出的明文数据存放在rwdata[0x04]=>rwdata[0x13]
925 //******************************************************************
926 void read_user_zone(unsigned char rd_high_addr,unsigned char rd_low_addr,unsigned char rd_number)
927 {
928 1 unsigned char j;
929 1
930 1 rwdata[0]=0xb2;
931 1 rwdata[1]=rd_high_addr;
932 1 rwdata[2]=rd_low_addr;
933 1 rwdata[3]=rd_number;
934 1 read(rwdata);
935 1 Wait_For_AckPolling();
936 1
937 1 //初始化解密
938 1 GPA_CLOCK(0x00,0x05);
939 1 GPA_CLOCK(rd_low_addr,0x01);
940 1 GPA_CLOCK(0x00,0x05);
941 1 GPA_CLOCK(rd_number,0x01);
942 1
943 1 for(j=0;j<rd_number;j++)
944 1 {
945 2 rwdata[4+j]=rwdata[4+j]^GPA[0];
946 2 GPA_CLOCK(rwdata[4+j],0x01);
947 2 GPA_CLOCK(0x00,0x05);
948 2 }
949 1 }
950
951 //**************************read_config_zone**************************
952 //读出用户区密文数据,并解出明文数据
953 //rd_high_addr 用户区高字节地址
954 //rd_low_addr 用户区低字节地址
955 //rd_number 读取密文数据及解出明文数据的个数
956 //解密出的明文数据存放在rwdata[0x04]=>rwdata[0x13]
957 //******************************************************************
958 void read_config_zone(unsigned char rd_high_addr,unsigned char rd_low_addr,unsigned char rd_number)
959 {
960 1 unsigned char j;
961 1
962 1 rwdata[0]=0xb6;
963 1 rwdata[1]=rd_high_addr;
964 1 rwdata[2]=rd_low_addr;
965 1 rwdata[3]=rd_number;
966 1 read(rwdata);
967 1 Wait_For_AckPolling();
968 1
969 1 //初始化解密
970 1 GPA_CLOCK(0x00,0x05);
971 1 GPA_CLOCK(rd_low_addr,0x01);
972 1 GPA_CLOCK(0x00,0x05);
973 1 GPA_CLOCK(rd_number,0x01);
974 1
C51 COMPILER V7.50 AT88SCXX 02/19/2008 15:50:58 PAGE 17
975 1 for(j=0;j<rd_number;j++)
976 1 {
977 2 if(rd_low_addr>=0xb0)
978 2 {rwdata[4+j]=rwdata[4+j]^GPA[0];}
979 2 GPA_CLOCK(rwdata[4+j],0x01);
980 2 GPA_CLOCK(0x00,0x05);
981 2 }
982 1 }
983
984 //*************************encrypto_data*******************************
985 //对明文数据进行加密
986 //encryptodatanumber加密数据的个数
987 //需加密的明文数据存放在 rwdata[4]至rwdata[0x13]
988 //*********************************************************************
989 void encrypto_data(unsigned char encryptodatanumber)
990 {
991 1
992 1 unsigned char j;
993 1 unsigned char temp;
994 1 for(j=0;j<encryptodatanumber;j++)
995 1 {
996 2 GPA_CLOCK(0x00,0x05);
997 2 temp=rwdata[4+j];
998 2 rwdata[4+j]=rwdata[4+j]^GPA[0];
999 2 GPA_CLOCK(temp,0x01);
1000 2 }
1001 1 }
1002
1003 //***************send checksum********************
1004 //功能:发送校验和到器件(以密文形式写入数据后,需发送校验和)
1005 //**************************************************
1006 void send_checksum()
1007 {
1008 1 unsigned char dat6[6];
1009 1
1010 1 dat6[0]=0xb4;
1011 1 dat6[1]=0x02;
1012 1 dat6[2]=0x00;
1013 1 dat6[3]=0x02;
1014 1
1015 1 GPA_CLOCK(0x00,0x0f);
1016 1 dat6[4]=GPA[0];
1017 1 GPA_CLOCK(0x00,0x05);
1018 1 dat6[5]=GPA[0];
1019 1
1020 1 write(dat6);
1021 1 }
1022 //************************write_user_zone*********************************
1023 //功能:把已加密了的密文数据写到器件
1024 //wr_high_addr 用户区高字节地址
1025 //wr_low_addr 用户区低字节地址
1026 //wr_number 写入数据的个数
1027 //将存放在 rwdata[4]至rwdata[0x13]明文数据写入器件
1028 ////////////////////////////////////////////
1029 void write_user_zone(unsigned char wr_high_addr,unsigned char wr_low_addr,unsigned char wr_number)
1030 {
1031 1 GPA_CLOCK(0x00,0x05);
1032 1 GPA_CLOCK(wr_low_addr,0x01);
1033 1 GPA_CLOCK(0x00,0x05);
1034 1 GPA_CLOCK(wr_number,0x01);
1035 1
1036 1 rwdata[0]=0xb0;
C51 COMPILER V7.50 AT88SCXX 02/19/2008 15:50:58 PAGE 18
1037 1 rwdata[1]=wr_high_addr;
1038 1 rwdata[2]=wr_low_addr;
1039 1 rwdata[3]=wr_number;
1040 1 encrypto_data(wr_number);
1041 1 write(rwdata);
1042 1 delay_ms();delay_ms();delay_ms();delay_ms();delay_ms();
1043 1 send_checksum();
1044 1 Wait_For_AckPolling();
1045 1 }
1046
1047 //************************write_user_zone*********************************
1048 //功能:把已加密了的密文数据写到器件
1049 //wr_high_addr 用户区高字节地址
1050 //wr_low_addr 用户区低字节地址
1051 //wr_number 写入数据的个数
1052 //将存放在 rwdata[4]至rwdata[0x13]明文数据写入器件
1053 ////////////////////////////////////////////
1054 void write_config_zone(unsigned char wr_high_addr,unsigned char wr_low_addr,unsigned char wr_number)
1055 {
1056 1 unsigned char j;
1057 1 unsigned char temp;
1058 1 GPA_CLOCK(0x00,0x05);
1059 1 GPA_CLOCK(wr_low_addr,0x01);
1060 1 GPA_CLOCK(0x00,0x05);
1061 1 GPA_CLOCK(wr_number,0x01);
1062 1
1063 1 rwdata[0]=0xb4;
1064 1 rwdata[1]=wr_high_addr;
1065 1 rwdata[2]=wr_low_addr;
1066 1 rwdata[3]=wr_number;
1067 1 //encrypto_data(wr_number);
1068 1 for(j=0;j<wr_number;j++)
1069 1 {
1070 2 GPA_CLOCK(0x00,0x05);
1071 2 temp=rwdata[4+j];
1072 2 if(wr_low_addr>=0xb0)
1073 2 {rwdata[4+j]=rwdata[4+j]^GPA[0];}
1074 2 GPA_CLOCK(temp,0x01);
1075 2 }
1076 1
1077 1 write(rwdata);
1078 1 delay_ms();delay_ms();delay_ms();delay_ms();delay_ms();
1079 1 send_checksum();
1080 1 Wait_For_AckPolling();
1081 1 }
1082
1083
1084 //****************明文读写部分******************************
1085 //****************verify_sc_plaintext****************************
1086 //功能:校验安全密码(传输密码),该密码位置在write7_password
1087 //在器件熔丝未断前,校验安全密码成功后,可以对器件配置区,用户区的随意读写
1088 //sc_firsr_byte 密码的第1个字节数据
1089 //sc_second_byte 密码的第2个字节数据
1090 //sc_third_byte 密码的第3个字节数据
1091 //如verify_sc_plaintext(0xDD,0x42,0x97)
1092 //0xDD,0x42,0x97分别为密码的第123个字节数据
1093 //*****************************************************************
1094 unsigned char verify_sc_plaintext(unsigned char sc_first_byte,unsigned char sc_second_byte,unsigned char s
-c_third_byte)
1095 {
1096 1 unsigned char scdata[7];
1097 1 scdata[0]=0xBA;
C51 COMPILER V7.50 AT88SCXX 02/19/2008 15:50:58 PAGE 19
1098 1 scdata[1]=0x07;
1099 1 scdata[2]=0x00;
1100 1 scdata[3]=0x03;
1101 1 scdata[4]=sc_first_byte;
1102 1 scdata[5]=sc_second_byte;
1103 1 scdata[6]=sc_third_byte;
1104 1 write(scdata);
1105 1
1106 1 scdata[0]=0xb6;///读回PAC_WR7
1107 1 scdata[1]=0x00;
1108 1 scdata[2]=0xE8;
1109 1 scdata[3]=0x01;
1110 1 read(scdata);
1111 1 return scdata[4];
1112 1 }
1113
1114 //************************set_user_zone_plaintext***********************
1115 //选择用户区(明文)
1116 //zonep:用户区序号
1117 //*********************************************************************
1118 void set_user_zone_plaintext(unsigned char zonep)
1119 {
1120 1 unsigned char zon[4];
1121 1 zon[0]=0xb4;
1122 1 zon[1]=0x03;
1123 1 zon[2]=zonep;
1124 1 zon[3]=0x00;
1125 1 write(zon);
1126 1 }
1127
1128 //**************************read_paintext************************************
1129 //读操作(明文)
1130 //rd_cmd:0xb2 读用户区 /0xb6 读配置区 /0xb6 0x01 0x00 0x01 读熔丝
1131 //A1 :高字节地址
1132 //A2 :地字节地址
1133 //N :读取数据个数
1134 //*******************************************************************************
1135 void read_paintext(unsigned char rd_cmd,unsigned char A1,unsigned char A2,unsigned char N)
1136 {
1137 1 rwdata[0]=rd_cmd;//0xb2 或 0xb6
1138 1 rwdata[1]=A1; //A1
1139 1 rwdata[2]=A2; //A2
1140 1 rwdata[3]=N; //N
1141 1 read(rwdata);
1142 1 }
1143
1144 //**************************write_paintext************************************
1145 //写操作(明文)
1146 //rd_cmd:0xb0 写用户区 /0xb4 写配置区 /0xb4 0x01 ID 0x00 写熔丝
1147 //A1 :高字节地址
1148 //A2 :地字节地址
1149 //N :写数据个数
1150 //注意:烧断熔丝时只能从ID=0x06=>0x04=>0x00
1151 //*******************************************************************************
1152 void write_paintext(unsigned char wr_cmd,unsigned char A1,unsigned char A2,unsigned char N)
1153 {
1154 1 rwdata[0]=wr_cmd;//0xb0 或 0xb4
1155 1 rwdata[1]=A1; //A1
1156 1 rwdata[2]=A2; //A2
1157 1 rwdata[3]=N; //N
1158 1 write(rwdata);
1159 1 }
C51 COMPILER V7.50 AT88SCXX 02/19/2008 15:50:58 PAGE 20
1160
1161
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2925 ----
CONSTANT SIZE = 80 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 40 106
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 7 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -