用户登陆 用户注册
您的位置:首页>
技术文章>内容正文
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)