⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at88scxx.lst

📁 Atmel公司推出了最新的加密芯片AT88SC0104C~25616C系列
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V7.50   AT88SCXX                                                              02/19/2008 15:50:58 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE AT88SCXX
OBJECT MODULE PLACED IN D:\AT88SCXX\出售的~1\SC-RWP~2\C程序~1\AT88SCXX.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE D:\AT88SCXX\出售的~1\SC-RWP~2\C程序~1\AT88SCXX.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg52.h>
   2          #include<intrins.h>
   3          #define _Nop()_nop_()            // 延时1us
   4          sbit SDA=P1^3;                   // 定义SDA
   5          sbit SCL=P1^2;                   // 定义SCL
   6          sbit pwr=P3^5;                   // 供电
   7          
   8          unsigned char GPA[20];      //GPA 单元使用频率高,应直接寻址
   9          
  10          unsigned char rwdata[0x14];//min=0x04(不读写) max=0x0c(读最大字节数为0x20H,写最大为0x10H)
  11                                           //前4字节用做命令,数据存放在rwdata[0x04]=>rwdata[0x13]
  12                                           //参数也可分配成0x0C,但后面一次只能读写8字节数据
  13                                           //所有从器件解密出的数据和写入器件的数据暂放在此
  14          
  15          //******************请填写GC************************************
  16          //GC_TABLE:
  17          unsigned char code  GC0[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//GC0
  18          unsigned char code  GC1[]={0x00,0x00,0x06,0x09,0x02,0x06,0x16,0x00};//GC1
  19          unsigned char code  GC2[]={0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};//GC2
  20          unsigned char code  GC3[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//GC3
  21          
  22          //******************请填写PASSWORD************************************
  23          //PASSWORD_TABLE:
  24          unsigned char code  PW_WRITE0[]={0x80,0x00,0x00};//WRITE PASSWORD 0
  25          unsigned char code  PW_READ0[]= {0x00,0x00,0x00};//READ  PASSWORD 0
  26          unsigned char code  PW_WRITE1[]={0x11,0x00,0x11};//WRITE PASSWORD 1
  27          unsigned char code  PW_READ1[]= {0x00,0x00,0x00};//READ  PASSWORD 1
  28          unsigned char code  PW_WRITE2[]={0x00,0x00,0x00};//WRITE PASSWORD 2
  29          unsigned char code  PW_READ2[]= {0x00,0x00,0x00};//READ  PASSWORD 2
  30          unsigned char code  PW_WRITE3[]={0x00,0x00,0x00};//WRITE PASSWORD 3
  31          unsigned char code  PW_READ3[]= {0x00,0x00,0x00};//READ  PASSWORD 3
  32          unsigned char code  PW_WRITE4[]={0x22,0x22,0x22};//WRITE PASSWORD 4
  33          unsigned char code  PW_READ4[]= {0x22,0x22,0x22};//READ  PASSWORD 4
  34          unsigned char code  PW_WRITE5[]={0x00,0x00,0x00};//WRITE PASSWORD 5
  35          unsigned char code  PW_READ5[]= {0x00,0x00,0x00};//READ  PASSWORD 5
  36          unsigned char code  PW_WRITE6[]={0x00,0x00,0x00};//WRITE PASSWORD 6
  37          unsigned char code  PW_READ6[]= {0x00,0x00,0x00};//READ  PASSWORD 6
  38          unsigned char code  PW_WRITE7[]={0xdd,0x42,0x97};//WRITE PASSWORD 7
  39          unsigned char code  PW_READ7[]= {0x00,0x00,0x00};//READ  PASSWORD 7
  40          
  41          
  42          void SMSTART(void);//功能:启动I2C
  43          void SMSTOP(void); //功能:停止I2C
  44          void delay_ms();   //功能:延时1ms
  45          void IIC_Initial(void);//上电后初始化IIC
  46          
  47          void Wait_For_AckPolling(void);
  48                             //功能:检查所发送的命令是否已被执行
  49                             //只有当AckPolling_return=1或bytecounter=0时,该程序才退出
  50          
  51          void GPA_CLOCK(unsigned char Datain,unsigned char times);
  52                             //GPA函数
  53                             //入口:Data_in
  54                             //出口:GPA[0]:GPA_byte
  55                             //参数:times  GPA函数计算的次数
C51 COMPILER V7.50   AT88SCXX                                                              02/19/2008 15:50:58 PAGE 2   

  56          
  57          void read(rd);
  58                             //功能:对at88scxx I2C读操作函数
  59                             //本程序中以read(rwdata)调用;
  60                             //入口:rwdata数组
  61                             //出口:rwdata数组
  62                             //rd数组长度可改
  63                             //cmd_send_counter发送命令次数,超出8次,本函数退出,并认为I2C线路上无器件
  64          
  65          void write(SDATA);
  66                             //功能:对at88scxx I2C写操作函数
  67                             //本程序中以write(rwdata)调用;
  68                             //入口:rwdata数组
  69                             //出口:rwdata数组
  70                             //rd数组长度可改
  71                             //cmd_send_counter发送命令次数,超出8次,本函数退出,并认为I2C线路上无器件
  72          
  73          
  74          unsigned char AUTHENTICATION(unsigned char GC_select);
  75                            //双向认证函数
  76                            //入口:GC_select:选择密钥套数
  77                            //出口:AAC:      认证结果
  78                            //过程:
  79                            //1.从器件读出CIx,产生随机数Q0,计算密钥;计算出Q1,将Q0、Q1发送给器件,计算出新的CIx,SKx
  80                            //2.用读回的CIx与计算出的CIx比较
  81                            //3.用计算出的SKx替代GCx,重复1过程
  82                            //AAC:认证错误计数器.AAC!=0xff表示双向认证未通过或无器件
  83                            //需产生随机数则应在程序里修改
  84          
  85          
  86          unsigned char verify_write_password(unsigned char pw_select);
  87                            //校验写密码组主函数,正确校验了写密码后开放读写
  88                            //pw_select:密码套数选择
  89                            //PAC:密码校验错误计数器.PAC!=0xff表示认证未通过或无器件
  90          
  91          void set_user_zone(unsigned char zone);
  92                            //选择用户区
  93                            //zone:用户区序号
  94          
  95          void read_user_zone(unsigned char rd_high_addr,unsigned char rd_low_addr,unsigned char rd_number);
  96                           //读出用户区密文数据,并解出明文数据
  97                           //rd_high_addr 用户区高字节地址
  98                           //rd_low_addr  用户区低字节地址
  99                           //rd_number    读取密文数据及解出明文数据的个数
 100                           //解密出的明文数据存放在rwdata[0x04]=>rwdata[0x13]
 101          
 102          void read_config_zone(unsigned char rd_high_addr,unsigned char rd_low_addr,unsigned char rd_number);
 103                           //当rd_low_addr往后不应滚动到0xb0
 104                           //如想读 0xb0<rd_low_addr<0xef 单元则应重新调用
 105          
 106          void encrypto_data(unsigned char encryptodatanumber);
 107                           //对明文数据进行加密
 108                           //encryptodatanumber加密数据的个数
 109                           //需加密的明文数据存放在 rwdata[4]至rwdata[0x13]
 110          
 111          void write_user_zone(unsigned char wr_high_addr,unsigned char wr_low_addr,unsigned char wr_number);
 112                           //功能:把已加密了的密文数据写到器件
 113                           //wr_high_addr 用户区高字节地址
 114                           //wr_low_addr  用户区低字节地址
 115                           //wr_number    写入数据的个数
 116                           //将存放在 rwdata[4]至rwdata[0x13]明文数据写入器件
 117          
C51 COMPILER V7.50   AT88SCXX                                                              02/19/2008 15:50:58 PAGE 3   

 118          void send_checksum();
 119                           //功能:发送校验和到器件(以密文形式写入数据后,需发送校验和)
 120          
 121          void write_config_zone(unsigned char wr_high_addr,unsigned char wr_low_addr,unsigned char wr_number);
 122                           //当rd_low_addr往后不应滚动到0xb0
 123                           //如想读 0xb0<rd_low_addr<0xef 单元则应重新调用
 124                           //熔丝断后不可写
 125          
 126          //****************明文读写部分******************************
 127          unsigned char verify_sc_plaintext(unsigned char sc_first_byte,unsigned char sc_second_byte,unsigned char s
             -c_third_byte);
 128                           //功能:校验安全密码(传输密码),该密码位置在write7_password
 129                           //在器件熔丝未断前,校验安全密码成功后,可以对器件配置区,用户区的随意读写
 130                           //sc_firsr_byte  密码的第1个字节数据
 131                           //sc_second_byte 密码的第2个字节数据
 132                           //sc_third_byte  密码的第3个字节数据
 133                           //如verify_sc_plaintext(0xDD,0x42,0x97)
 134                           //0xDD,0x42,0x97分别为密码的第123个字节数据
 135          
 136          void set_user_zone_plaintext(unsigned char zonep);
 137                           //选择用户区(明文)
 138                           //zonep:用户区序号
 139          
 140          void read_paintext(unsigned char rd_cmd,unsigned char A1,unsigned char A2,unsigned char N);
 141                           //读操作(明文)
 142                           //rd_cmd:0xb2 读用户区 /0xb6 读配置区  /0xb6 0x01 0x00 0x01 读熔丝
 143                           //A1    :高字节地址
 144                           //A2    :地字节地址
 145                           //N     :读取数据个数
 146          
 147          void write_paintext(unsigned char wr_cmd,unsigned char A1,unsigned char A2,unsigned char N);
 148                           //写操作(明文)
 149                           //rd_cmd:0xb0 写用户区 /0xb4 写配置区  /0xb4 0x01 ID 0x00  写熔丝
 150                           //A1    :高字节地址
 151                           //A2    :地字节地址
 152                           //N     :写数据个数
 153                           //注意:烧断熔丝时只能从ID=0x06=>0x04=>0x00
 154          
 155          
 156          ////////////////////////////////////////
 157          void main()
 158          {
 159   1      unsigned char j;
 160   1      unsigned char AAC;    //AAC=0xFF则表明校验GCx正确
 161   1      unsigned char PAC;    //PAC=0xFF则表明校验PWx正确
 162   1      pwr=0;                      //上电
 163   1      AAC=0;
 164   1      PAC=0;
 165   1      IIC_Initial();
 166   1      //goto MTZ_Test;
 167   1      //goto Set_AAC_PAC_FF;
 168   1      //goto RW_Config_User_Zone_Plaintext;
 169   1      //goto RW_User_Zone_Encryptoed;
 170   1      //goto RW_Config_Zone_Encryptoed;
 171   1      ////////////////////密文读写部分////////////////////////////////////////
 172   1      RW_User_Zone_Encryptoed:
 173   1      
 174   1      AAC=AUTHENTICATION(0x02);       //0x02使用02套密钥/
 175   1      PAC=verify_write_password(0x04);//0x04使用04套密码,只读可用verify_read_password(pw_select)
 176   1      set_user_zone(0x00);            //0x00进入00H用户区
 177   1      read_user_zone(0x00,0x00,0x10); //解密出的明文数据存放在rwdata[0x04]=>rwdata[0x13]
 178   1                                      //read_user_zone(rd_high_addr,rd_low_addr,rd_number)
C51 COMPILER V7.50   AT88SCXX                                                              02/19/2008 15:50:58 PAGE 4   

 179   1                                      //rd_high_addr:对于0104恒为0x00
 180   1                                      //rd_low_addr:读0104用户区的首地址
 181   1                                      //rd_number:读出的数据字节数
 182   1                                      //如read_user_zone(0x00,0x00,0x10)则读解0104下0x00H-0x0fH单元
 183   1      read_user_zone(0x00,0x10,0x10);
 184   1      
 185   1      for(j=0x04;j<0x0c;j++)
 186   1         {rwdata[j]=0x85;}
 187   1      for(j=0x0c;j<0x14;j++)
 188   1         {rwdata[j]=0x66;}            //明文数据存放在 rwdata[4]至rwdata[0x13]
 189   1      write_user_zone(0x00,0x00,0x10);//write_user_zone(wr_high_addr,wr_low_addr,wr_number)
 190   1      
 191   1      for(j=0x04;j<0x0c;j++)
 192   1         {rwdata[j]=0x28;}
 193   1      for(j=0x0c;j<0x14;j++)
 194   1         {rwdata[j]=0x66;}            //明文数据存放在 rwdata[4]至rwdata[0x13]
 195   1      write_user_zone(0x00,0x10,0x10);//write_user_zone(wr_high_addr,wr_low_addr,wr_number)
 196   1                                      //wr_high_addr:对于0104恒为0x00
 197   1                                      //wr_number:写入0104的数据字节数
 198   1                                      //如write_user_zone(0x00,0x00,0x10)则把数据写到0104下0x00H-0x0fH单元
 199   1      
 200   1      set_user_zone(0x00);            //再调用命令操作防止写数据掉电丢失
 201   1      pwr=1;                          //芯片下电,释放SDA SCL,RAM单元以做其他用
 202   1      while(1);
 203   1      
 204   1      ////////////////密文方式读写配置区///////////////////////////////////////////
 205   1      RW_Config_Zone_Encryptoed:
 206   1      
 207   1      AAC=AUTHENTICATION(0x02);       //0x02使用02套密钥/
 208   1      PAC=verify_write_password(0x07);//0x07使用07套密码,开放所有权限
 209   1      for(j=0x04;j<0x0c;j++)
 210   1         {rwdata[j]=0x28;}
 211   1      for(j=0x0c;j<0x14;j++)
 212   1         {rwdata[j]=0x66;}
 213   1      write_config_zone(0x00,0x40,0x10);//熔丝断后不可写
 214   1      read_config_zone(0x00,0x40,0x10);
 215   1      
 216   1      for(j=0x04;j<0x0c;j++)
 217   1         {rwdata[j]=0x18;}
 218   1      for(j=0x0c;j<0x14;j++)
 219   1         {rwdata[j]=0x16;}
 220   1      write_config_zone(0x00,0xb0,0x10); //low_addr+ wr_number不应超过B0,若要读写 0xb0后应另起一行
 221   1      read_config_zone(0x00,0xb0,0x10);
 222   1      
 223   1      for(j=0x04;j<0x0c;j++)
 224   1         {rwdata[j]=0x58;}
 225   1      for(j=0x0c;j<0x14;j++)
 226   1         {rwdata[j]=0x56;}
 227   1      write_config_zone(0x00,0xb0,0x10); //low_addr+ wr_number不应超过B0,若要读写 0xb0后应另起一行
 228   1      read_config_zone(0x00,0xb0,0x10);
 229   1      
 230   1      while(1);
 231   1      
 232   1      
 233   1      //////////////////明文读写部分,可执行F1算法/////////////////////////////
 234   1      /////////////////////////////////////////////////////////////
 235   1      MTZ_Test:
 236   1      rwdata[4]=0x88;
 237   1      rwdata[5]=0x66;                             //明文写
 238   1      write_paintext(0xb4,0x00,0x0a,0x02);        //write_paintext(0xb0 或 0xb4,A1,A2,N)
 239   1       read_paintext(0xb6,0x00,0x0a,0x02);        //明文读
 240   1                                                  //读回rwdata[4]=0x85;rwdata[5]=0x66;则表明通讯测试成功
C51 COMPILER V7.50   AT88SCXX                                                              02/19/2008 15:50:58 PAGE 5   

 241   1      while(1);
 242   1      
 243   1      ///////////////////////////////////////////////////////////
 244   1      Set_AAC_PAC_FF://恢复设置  ACC PAC
 245   1      rwdata[4]=0xff;
 246   1      write_paintext(0xb4,0x00,0x70,0x04);        //write_paintext(0xb0 或 0xb4,A1,A2,N)
 247   1      read_paintext(0xb6,0x00,0x70,0x10);         //明文读
 248   1      rwdata[4]=0xff;
 249   1      write_paintext(0xb4,0x00,0xd0,0x01);        //write_paintext(0xb0 或 0xb4,A1,A2,N)
 250   1       read_paintext(0xb6,0x00,0xd0,0x01);        //明文读
 251   1      while(1);
 252   1      
 253   1      ////////////////////////////////////////////////////////////
 254   1      RW_Config_User_Zone_Plaintext://明文读写配置区或用户区或熔丝
 255   1      PAC=verify_sc_plaintext(0xDD,0x42,0x97);//校验SC
 256   1      set_user_zone_plaintext(0x03);              //选区
 257   1      read_paintext(0xb2,0x00,0x00,0x10);         //明文读
 258   1                                                  //read_paintext(0xb2 或 0xb6,A1,A2,N)
 259   1      rwdata[4]=0x85;
 260   1      rwdata[5]=0x66;                             //明文写
 261   1      rwdata[6]=0x28;
 262   1      rwdata[7]=0x66;
 263   1      write_paintext(0xb0,0x00,0x00,0x04);        //write_paintext(0xb0 或 0xb4,A1,A2,N)
 264   1                                                  //如以明文写用户区,则AR PR应为0xFF
 265   1       read_paintext(0xb2,0x00,0x00,0x10);        //明文读
 266   1      while(1);
 267   1      
 268   1      }
*** WARNING C280 IN LINE 172 OF D:\AT88SCXX\出售的~1\SC-RWP~2\C程序~1\AT88SCXX.C: 'RW_User_Zone_Encryptoed': unreference
             -d label
*** WARNING C280 IN LINE 205 OF D:\AT88SCXX\出售的~1\SC-RWP~2\C程序~1\AT88SCXX.C: 'RW_Config_Zone_Encryptoed': unreferen
             -ced label
*** WARNING C280 IN LINE 235 OF D:\AT88SCXX\出售的~1\SC-RWP~2\C程序~1\AT88SCXX.C: 'MTZ_Test': unreferenced label
*** WARNING C280 IN LINE 244 OF D:\AT88SCXX\出售的~1\SC-RWP~2\C程序~1\AT88SCXX.C: 'Set_AAC_PAC_FF': unreferenced label
*** WARNING C280 IN LINE 254 OF D:\AT88SCXX\出售的~1\SC-RWP~2\C程序~1\AT88SCXX.C: 'RW_Config_User_Zone_Plaintext': unref
             -erenced label
 269          
 270          //******************delay_ms*********************************
 271          //功能:延时1ms
 272          //*****************************************************************
 273          void delay_ms()
 274          {
 275   1      unsigned char j;
 276   1           for(j=0x00;j<255;j++)
 277   1              {
 278   2                _Nop();_Nop();_Nop();
 279   2              }
 280   1      }
 281          
 282          //***********************IIC_Initial***********************************
 283          //功能:上电后初始化IIC

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -