用户登陆 用户注册
您的位置:首页> 技术文章>内容正文
IC逻辑加密卡的程序
[正文]:* iccard.h 前一阵子做了个ic卡读写程序,可以读写sle4442系统逻辑加密卡的,本来想在网上找一个,没找到,自己写了一个,为了让后来人可以轻松一点,所以就奉献给大家:) 注释比较少(本人的坏习惯),看起来有点累,不过建议你在自己看之前先熟悉一下sle4442的协议。
程序是经过测试的,在我的931上工作的很好,有什么问题,发信给我 ploto_zhu@etang.com  */ #ifndef ic_card_h #define ic_card_h #include <reg931.h> #define  rdmainmem   0x30        // outgoing data #define  updmainmem  0x38        // processing  #define  rdprtmem     0x34        // outgoing data #define  wrprtmem    0x3c        // processing #define  rdsecmem     0x31        // outgoint data #define  updsecmem   0x39        // processing #define  cmpverdat   0x33        // processing sbit ccio  = p0^3; sbit ccrst = p0^1; sbit ccclk = p0^2; sbit ccin  = p2^7; #ifndef uchar #define uchar unsigned char  #endif  void ic_reset(uchar *buffer); void readmainmemory(uchar addrfrom,uchar* buffer,uchar ulen); void readprotectedmem(uchar rdbuf[4]) ; void updatemainmemory(uchar addr,uchar value) ; void writeprotectedmem(uchar addr, uchar value)  ; void readsecmemory(uchar buffer[4])  ; void updatesecmem(uchar addr, uchar value)   ; bit compareverifdata(uchar value[3])   ; #endif /* ---------------------   iccard.c ----------*/ #include "iccard.h" #include <reg931.h> /*  2005-9-4 常州中天科技有限公司 祝启忠*/ #ifndef uchar  #define uchar unsigned char  #endif //sbit ccrst=p0^1; //sbit ccclk=p0^2; //sbit ccio=p0^3; //void sendtopc(uchar*); //void sendbuffer(char* buf,char len) ; void delay(int x) 123;     int i;     for(i=(x<<1);i>0;i--); 125; void oneplus() 123;     ccclk=1;     delay(20);     ccclk=0;     delay(20); 125; unsigned char readbyte() 123;     uchar tempbyte;     uchar value;     uchar i;     value=0;     for(i=0;i<8;i++)     123;         ccclk=1;         tempbyte=(unsigned char)ccio;         delay(10);         ccclk=0;         delay(10);         value |= (tempbyte<<i);     125;     return value; 125; void icsendbyte(uchar byte) 123;     uchar tempbyte;     uchar i;     for(i=0;i<8;i++)     123;         tempbyte= ((byte>>i) & 0x01);         ccio=(bit)tempbyte;         delay(8);         ccclk=1;         delay(10);         ccclk=0;         delay(8);     125; 125; void ic_reset(uchar *buffer) 123;     uchar len;     ccclk=0;     ccrst=0;     ccio=1;     delay(800);     ccrst=1;     delay(10);     ccclk=1;     delay(10);     ccclk=0;     delay(50);     ccrst=0;     delay(10);     for(len = 0;len <4;len++)         buffer[len]=readbyte();      125; void sendcommand(uchar cmd[3]) 123;     uchar i;     //start condition     //当时钟线为高的时候,io线从1到0     ccclk=0;     ccio=1;     delay(4);     ccclk=1;     delay(8);     ccio=0;     delay(8);     ccclk=0;     delay(5);  //start condition     //data     //ic卡在时钟的上升沿读取数据     for(i=0;i<3;i++)         icsendbyte(cmd[i]);     //stop condition     //当时钟线为高的时候, io从0到1     ccio=0;     delay(10);     ccclk=1;     delay(10);     ccio=1;     //命令发送结束     delay(10); 125; //读取主存储器 void readmainmemory(uchar addrfrom,uchar* buffer,uchar ulen) 123;     unsigned int len;     uchar buf[3];     buf[0]=rdmainmem;     buf[1]=addrfrom;     buf[2]=0;     sendcommand(buf); //    sendtopc(" send ok");     //开始读取数据     ccclk=0;     delay(10);     for(len=0;len<256-addrfrom;len++)     123;             if(len < ulen)         123;             buffer[len]=readbyte(); //            sendbuffer(&buffer[len],1);         125;         else         123;                 buf[0]=readbyte(); //            sendbuffer(buf,1);    //要给脉冲,但丢弃数据         125;     125; //    sendtopc("read ok");     // 给个结束标志     oneplus(); 125; //读取保护内容,一共32位,4个字节 void readprotectedmem(uchar rdbuf[4]) 123;     uchar len;     uchar buf[3];     buf[0]=rdprtmem;     buf[1]=buf[2]=0;//addrfrom;     sendcommand(buf);     //开始读取数据     ccclk=0;     delay(10);     for(len=0;len<4;len++)     123;             rdbuf[len]=readbyte();     125;     // 给个结束标志     oneplus(); 125; //更新主存储器的内容 void updatemainmemory(uchar addr,uchar value) 123;     uchar len;     uchar buf[3];     buf[0]=updmainmem;     buf[1]=addr;     buf[2]=value;     sendcommand(buf);     //给脉冲     ccclk=0;     delay(10);     ccio=0;     delay(10);     for(len=0;len<254;len++)     123;             oneplus();     125;     ccio=1;     delay(10);     oneplus();     //    oneplus(); 125; //更新保护存储器中的内容 void writeprotectedmem(uchar addr, uchar value) 123;     uchar len;     uchar buf[3];     buf[0]=wrprtmem;     buf[1]=addr;     buf[2]=value;     sendcommand(buf);     //给脉冲     ccclk=0;     delay(3);     ccio=0;     delay(10);     for(len=0;len<254;len++)     123;             oneplus();     125;     ccio=1;     delay(10);     oneplus(); 125; //读取安全区的内容 void readsecmemory(uchar buffer[4]) 123;     uchar len;     uchar buf[3];     buf[0]=rdsecmem;     buf[1]=buf[2]=0xff;//addrfrom;     sendcommand(buf);     //开始读取数据     ccclk=0;     delay(10);     for(len=0;len<4;len++)     123;             buffer[len]=readbyte();     125;     // 给个结束标志     ccio=1;     delay(10);     oneplus(); 125; //更新安全区的内容 void updatesecmem(uchar addr, uchar value) 123;     uchar len;     uchar buf[3];     buf[0]=updsecmem;     buf[1]=addr;     buf[2]=value;     sendcommand(buf);     //给脉冲     ccclk=0;     delay(10);     ccio=0;     delay(10);     for(len=0;len<254;len++)     123;             oneplus();     125;     ccio=1;     delay(10);     oneplus(); 125; //比较密码 bit compareverifdata(uchar value[3]) 123;     uchar len;     uchar buf[4];     readsecmemory(buf);     if(buf[0]== 0)         return 0;     //正确,计数一次 //    if(buf[0]     for(len =0;len <3;len++)         if(buf[0] & (1 << len) )         123;             buf[0] &= ~(1<<len);             break;         125;     updatesecmem(0,buf[0]);   //    sendtopc("update ok");     for(len = 0;len < 3;len++)     123;          buf[0]=cmpverdat;         buf[1]=len+1;         buf[2]=value[len];         sendcommand(buf);                  //给脉冲         ccclk=0; //        delay(5);         ccio=0;         delay(10);         oneplus();         oneplus();         ccio=1;         delay(10);         oneplus();     125;     updatesecmem(0,0xff);     readsecmemory(buf);     if(buf[0] & 0x07 == 0x07)         return 1;        else          return 0; 125;


网站首页 培训课程 维修指南
技术文章 家电专栏 供应信息
求购信息 培训资讯 展会信息
电脑专栏 教程下载 资料下载
常用软件 PLC教程 PLC资料
变频伺服 低压电器 维修资料
人机界面 自控仪表 工控机类
文章标题: 搜文章
中国工控资源网手机版 2012
电话:010-67577139 13811659603
培训咨询QQ:657167934 471895637 销售咨询QQ:623769457
联系邮箱:zggkzyw@163.com
 京ICP备11002135号
报时(2026-04-06 13:12:41) 流量统计