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

📄 sle4442.lst

📁 单片机用TDS-ICE仿真器的试验程序。
💻 LST
📖 第 1 页 / 共 2 页
字号:
 199                    unsigned char ByteNum   --- 要写入的字节数(1 - 256)
 200                        unsigned char *WriteBuf --- 写入数据缓冲区        
 201          输        出: 0 --- 写成功
 202                            1 --- 表示无效卡或者卡损坏
 203          注        意:要校验密钥正确,才能对卡的主存储器写入数据        
 204          *****************************************************************/
 205          unsigned char WriteCm(unsigned char StarAdr,unsigned char ByteNum,unsigned char *WriteBuf)
 206          {
 207   1              unsigned char i = 0;
 208   1      
 209   1              if (RstCard() == 1)                                                 /* 使卡复位*/
 210   1                      return 1;                                                           /* 如果复位失败返回1 */
 211   1      
 212   1              for(i = 0; i < ByteNum; i++)
 213   1              {
 214   2                      SendCommand(0x38,StarAdr,*WriteBuf);    //发送写主存储区命令
 215   2                      SendClock();                                                    //发送处理脉冲          
 216   2                      StarAdr++;                                                              //写入字节地址加1
 217   2                      WriteBuf++;                                                             //写入缓冲区指针加1
 218   2              }
 219   1                      return 0;
 220   1      }
 221          
 222          /******************************************************************
 223          函数名称:ReadPm
 224          功    能:读保护存储器,并把保护存储器的4字节的内容存在RecBuf中
 225          输        入:unsigned char *RecBuf  --- 接收数据缓冲区,长度为4个字节
 226          输    出:0 --- 读成功
 227                            1 --- 表示无效卡或者卡损坏    
 228          *******************************************************************/
 229          unsigned char ReadPm(unsigned char *RecBuf)
 230          {
 231   1              unsigned char i = 0;
 232   1      
 233   1              if (RstCard() == 1)                                     /* 使卡复位*/
 234   1                      return 1;                                               /* 如果复位失败返回1 */
 235   1      
 236   1              SendCommand(0x34,0x00,0x00);            //读保护存储器命令              
 237   1      
 238   1              IO = 1;                                                         // 置IO口为输入状态
 239   1              Delay10Us();                                            // 延时一下
 240   1      
 241   1              for(i = 0; i < 4; i++)                          //读保护存储器4个字节
C51 COMPILER V7.09   SLE4442                                                               09/17/2004 11:10:16 PAGE 5   

 242   1              {
 243   2                      *RecBuf=Readchar();
 244   2                      RecBuf++;                                               //接收缓冲区指针加1
 245   2              }
 246   1      
 247   1              SendClock();                                            //发送处理脉冲  
 248   1      
 249   1              return 0;
 250   1      }
 251          
 252          /********************************************************************
 253          函数名称:WritePm
 254          功    能:写保护数据存储器
 255          输        入:unsigned char StartAdr  --- 起始地址(0 - 31)
 256                        unsigned char ByteNum   --- 写入的字节数(1 - 32)
 257                            unsigned char *WriteBuf --- 写入数据缓冲区
 258          输        出:0 --- 写成功
 259                            1 --- 表示无效卡或者卡损坏    
 260          注        意: 首先校验密钥正确,才能对卡的护存储器写入数据,
 261                    其次写入的数据必须与卡中对应的数据相等才能写入
 262          *********************************************************************/
 263          unsigned char WritePm(unsigned char StartAdr,unsigned char ByteNum,unsigned char *WriteBuf)
 264          {
 265   1              unsigned char i;
 266   1      
 267   1              if (RstCard() == 1)                                                     /* 使卡复位*/
 268   1                      return 1;                                                               /* 如果复位失败返回1 */
 269   1      
 270   1              for (i = 0; i < ByteNum; i++)
 271   1              {
 272   2                      SendCommand(0x3c,StartAdr,*WriteBuf);   //写入一个字节
 273   2                      SendClock();                                                    //发送写命令处理脉冲
 274   2                      StartAdr++;                                                             //写入字节地址加1
 275   2                      WriteBuf++;                                                             //写入缓冲区指针加1
 276   2              }       
 277   1                      return 0;
 278   1      }
 279          
 280          /**********************************************************************
 281          函数名称:ReadPsw
 282          功    能:读加密存储器
 283          输        入:unsigned char *Psw  --- 用于装读到的加密存储器内容,长度为4个字节
 284                            Psw第一字节:                   错误计数器值
 285                            Psw第二字节到第四字节: 卡的密码值
 286          输        出:0 --- 读成功
 287                            1 --- 表示无效卡或者卡损坏
 288          注        意: 必须校验密码正确才能读到正确的密钥值,否则读到的密码值为00 00 00
 289          ***********************************************************************/
 290          unsigned char ReadPsw(unsigned char *Psw)
 291          {
 292   1              unsigned char i = 0;
 293   1      
 294   1              if (RstCard() == 1)                                     /* 使卡复位*/
 295   1                      return 1;                                               /* 如果复位失败返回1 */
 296   1      
 297   1              SendCommand(0x31,0,0);                          //读加密存储器命令
 298   1      
 299   1              for(i = 0; i < 4; i++)                          //读加密存储器的四个字节
 300   1              {
 301   2                      *Psw = Readchar();                      
 302   2                      Psw++;
 303   2              }       
C51 COMPILER V7.09   SLE4442                                                               09/17/2004 11:10:16 PAGE 6   

 304   1                      return 0;
 305   1      }
 306          
 307          /*********************************************************************
 308          函数名称:CheckPsw
 309          功    能:校验密码,把Psw中1,2,3字节的内容分别与加密存储器的1,2,3字节比较
 310          输        入:unsigned char *Psw  --- 待校验的密码值,长度为3个字节
 311          输    出: 3: 核对密码成功
 312                        0: 卡已报废
 313                            1: 只剩一次校验机会,校验密码失败
 314                        2: 只剩二次校验机会,校验密码失败
 315                            4: 卡为无效卡或已损坏
 316          **********************************************************************/
 317          unsigned char CheckPsw(unsigned char *Psw)
 318          {
 319   1              unsigned char ReadBuf[4];                       
 320   1              unsigned char i = 0;
 321   1      
 322   1              if (ReadPsw(ReadBuf) == 1)                      //读加密存储器
 323   1                      return 4;
 324   1      
 325   1              if(ReadBuf[0]==0x07)                    
 326   1              {
 327   2                      SendCommand(0x39,0,0x03);               //将EC写为0x03
 328   2                      SendClock();                                            //发送处理脉冲
 329   2              }
 330   1              else if(ReadBuf[0]==0x06 || ReadBuf[0]==0x05 || ReadBuf[0]==0x03)
 331   1              {
 332   2                      SendCommand(0x39,0,0x01);               //将EC写为0x01
 333   2                      SendClock();                                            //发送处理脉冲
 334   2              }
 335   1              else if(ReadBuf[0]==0x01 || ReadBuf[0]==0x02 || ReadBuf[0]==0x04)
 336   1              {
 337   2                      SendCommand(0x39,0,0x00);               //将EC写为0x00
 338   2                      SendClock();                                            //发送处理脉冲
 339   2              }
 340   1                              
 341   1              SendCommand(0x33,1,Psw[0]);                     //校验密码的第一个字节
 342   1              SendClock();                                                    
 343   1              SendCommand(0x33,2,Psw[1]);                     //校验密码的第二个字节
 344   1              SendClock();
 345   1              SendCommand(0x33,3,Psw[2]);                     //校验密码的第三个字节
 346   1              SendClock();
 347   1              
 348   1              SendCommand(0x39,0,0x07);                       //擦除错误计数器
 349   1              SendClock();
 350   1      
 351   1              SendCommand(0x31,0,0);                          //读加密存储器命令      
 352   1      
 353   1              for(i = 0;i < 4;i++)
 354   1              {
 355   2                      ReadBuf[i]=Readchar();                  //读加密存储器的四个字节
 356   2              }
 357   1              
 358   1              if(ReadBuf[0] == 0x07) return 3;        //剩下3次校验机会,校验密码成功
 359   1              else if(ReadBuf[0] == 0x06 || ReadBuf[0] == 0x05 || ReadBuf[0] == 0x03) return 2;
 360   1                                                                                      //剩下2次校验机会,校验密码失败
 361   1              else if(ReadBuf[0] == 0x04 || ReadBuf[0] == 0x02 || ReadBuf[0] == 0x01) return 1;
 362   1                                                                                      //剩下1次校验机会,校验密码失败          
 363   1              else return 0;                                          //剩下0次校验机会,卡报废
 364   1      }
 365          
C51 COMPILER V7.09   SLE4442                                                               09/17/2004 11:10:16 PAGE 7   

 366          /**********************************************************************
 367          函数名称:SetPsw
 368          功    能:修改加密存储器中的密码
 369          输        入:NewPsw -- 新密码缓冲区,长度为3个字节
 370          输        出:0 --- 读成功
 371                            1 --- 表示无效卡或者卡损坏
 372          注        意: 必须校验密码成功后才能修改密码, 否则密码写不进卡中
 373          ***********************************************************************/
 374          unsigned char SetPsw(unsigned char *NewPsw)
 375          {
 376   1              unsigned char i;
 377   1      
 378   1              if (RstCard() == 1)                                                     /* 使卡复位*/
 379   1                      return 1;                                                               /* 如果复位失败返回1 */
 380   1      
 381   1              for (i = 0; i < 3; i++)
 382   1              {
 383   2                      SendCommand(0x39,i + 1,*NewPsw);                //发送新的密码值
 384   2                      SendClock();                                                    //发送处理脉冲
 385   2                      NewPsw++;                                                               //密码值缓冲区指针加1
 386   2              }       
 387   1                      return 0;
 388   1      }
 389          
 390          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1110    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----      34
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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