?? sle4442_b.c
字號:
/*******************************************************************************
* 標題: 藍海微芯LJD-SY-5200單片機開發系統演示程序 *
* 文件: SLE4442.C *
* 日期: 2006-8-9 *
* 版本: 1.0 *
* 作者: 藍海微芯 *
* 網站: http://www.ljd-2008.com *
********************************************************************************
* 描述: *
* IC卡程序模塊 *
* *
* 30H-----------讀主存儲區 *
* 34H-----------讀保護存儲區 *
* 38H-----------寫主存儲區 *
* 3CH-----------寫保護存儲區 *
* 31H-----------讀保密存儲區 *
* 33H-----------比較驗證數據 *
* 39H-----------更新保密存儲區 *
* *
* *
********************************************************************************
* 【版權】 Copyright(C)微芯科技 http://www.bluemcu.com All Rights Reserved *
* 【聲明】 此程序僅用于學習與參考,引用請注明版權和作者信息! *
*******************************************************************************/
#include<reg51.h> /*=== 頭文件包含 ===*/
#include<intrins.h>
#include<absacc.h>
#include <IC_CARD_B.h>
#define uchar unsigned char
#define uint unsigned int
bdata uchar wbyte;
sbit wbyte_0=wbyte^0;
uchar RSTANSER[4]; /*4字節復位應答*/
uchar ICCOMMAND[3]; /*3字節命令*/
uchar ICADDRESS; /*1字節地址*/
uchar ICDATAIN; /*1字節數據*/
uchar ICLENTH; /*1字節讀寫長度*/
uchar ICCODE[3]={0xff,0xff,0xff}; /*3字節密碼*/
uchar ICDATA[32]; /*32字節讀寫數據*/
void icdelay();
void cardpulse();
uchar cardrbyte();
void cardwbyte(uchar ss);
void rst_ans();
void sendcommand(uchar comm,uchar address,uchar odata);
void rdmm();
void rdpm();
void wrmm();
void wrpm();
void rdsm();
uchar rdsm_ec();
void sendpsc();
void wrsm(uchar ec);
void updatepsc();
uchar verifi();
/*main()
{
uchar i;
uchar EOC;
_nop_();
P1_4=1;
P1_4=0;
for(i=0;i<0x20;i++)
ICDATA[i]=0xf0; //要寫的數據
EOC=rdsm_ec(); //讀錯誤計數器
EOC=verifi(); //校驗密碼
EOC=rdsm_ec();
wrmm(); //寫主存儲區
rdmm(); //再讀主存儲區
while(1);
}*/
/********************************************************************
函 數 名:icdelay()
功 能:延時10us
說 明:
入口參數:
返 回 值:
設 計:藍海微芯
***********************************************************************/
void icdelay()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/********************************************************************
函 數 名:cardpulse()
功 能:產生時鐘脈沖
說 明:
入口參數:
返 回 值:
設 計:藍海微芯
***********************************************************************/
void cardpulse()
{
SCL=1;
icdelay();
SCL=0;
icdelay();
}
/********************************************************************
函 數 名:cardbyte()
功 能:從SLE4442讀取一字節數據
說 明:
入口參數:
返 回 值:ACC
設 計:藍海微芯
***********************************************************************/
uchar cardrbyte()
{
uchar i;
ACC=0;
SDA=1;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
A_7=SDA;
cardpulse();
}
return ACC;
}
/********************************************************************
函 數 名:cardwbyte()
功 能:向SLE4442寫一字節命令或數據
說 明:
入口參數:uchar ss
返 回 值:
設 計:藍海微芯
***********************************************************************/
void cardwbyte(uchar ss)
{
uchar i;
wbyte=ss;
for(i=0;i<8;i++)
{
SDA=wbyte_0;
wbyte=wbyte>>1;
cardpulse();
}
}
/********************************************************************
函 數 名:rst_ans()
功 能:復位與應答(4個字節的復位應答)
說 明:
入口參數:
返 回 值:
設 計:藍海微芯
***********************************************************************/
void rst_ans()
{
uchar i;
RST=0;
SCL=0;
icdelay();
RST=1;
icdelay();
SCL=1;
icdelay();
SCL=0;
icdelay();
RST=0;
icdelay();
for(i=0;i<4;i++)
RSTANSER[i]=cardrbyte();
}
/********************************************************************
函 數 名:sendcommand()
功 能:發送命令
說 明:3字節 命令字+地址+數據
入口參數:uchar comm uchar address uchar odata
返 回 值:
設 計:藍海微芯
***********************************************************************/
void sendcommand(uchar comm,uchar address,uchar odata)
{
SCL=1; /*start condition*/
icdelay();
SDA=0;
icdelay();
SCL=0;
cardwbyte(comm);
cardwbyte(address);
cardwbyte(odata);
SCL=0; /*stop condition*/
SDA=0;
icdelay();
SCL=1;
icdelay();
SDA=1;
icdelay();
SCL=0;
icdelay();
}
/********************************************************************
函 數 名:rdmm()
功 能:讀主存儲區
說 明:將數據讀取到數組ICDATA[]
入口參數:
返 回 值:
設 計:藍海微芯
***********************************************************************/
void rdmm()
{
uchar i;
rst_ans();
sendcommand(0x30,0x20,0);
for(i=0;i<0x20;i++)
ICDATA[i]=cardrbyte();
}
/********************************************************************
函 數 名:rdpm()
功 能:讀保護存儲區
說 明:
入口參數:
返 回 值:
設 計:藍海微芯
***********************************************************************/
void rdpm()
{
uchar i;
rst_ans();
sendcommand(0x34,0,0);
for(i=0;i<0x4;i++)
ICDATA[i]=cardrbyte();
}
/********************************************************************
函 數 名:wrmm()
功 能:寫主存儲區
說 明:
入口參數:
返 回 值:
設 計:藍海微芯
***********************************************************************/
void wrmm()
{
uchar i,j;
uchar addr=0;
rst_ans();
for(i=0;i<0x20;i++)
{
addr=0x20+i;
sendcommand(0x38,addr,ICDATA[i]);
for(j=0xff;j>0;j--) /*256個時鐘脈沖擦除數據*/
cardpulse();
}
}
/********************************************************************
函 數 名:wrpm()
功 能:寫保護存儲區
說 明:
入口參數:
返 回 值:
設 計:藍海微芯
***********************************************************************/
void wrpm()
{
uchar i;
rst_ans();
for(i=0;i<0x20;i++)
{
sendcommand(0x3c,i,ICDATA[i]);
for(i=0;i<0xff;i++) /*256個時鐘脈沖擦除數據*/
cardpulse();
}
}
/********************************************************************
函 數 名:rdsm()
功 能:讀保密存儲區
說 明:
入口參數:
返 回 值:
設 計:藍海微芯
***********************************************************************/
void rdsm()
{
uchar i;
rst_ans();
for(i=0;i<0x20;i++)
sendcommand(0x31,0,0);
for(i=0;i<0x4;i++)
ICDATA[i]=cardrbyte();
}
/********************************************************************
函 數 名:rdsm_ec()
功 能:讀錯誤計數器
說 明:
入口參數:
返 回 值:erro
設 計:藍海微芯
***********************************************************************/
uchar rdsm_ec()
{
uchar erro;
rst_ans(); /*RSTANSER[]={0xa2,0x13,0x10,0x91}*/
sendcommand(0x31,0,0);
erro=cardrbyte();
return erro;
}
/********************************************************************
函 數 名:wrsm()
功 能:更新保密存儲區
說 明:
入口參數:uchar ec
返 回 值:
設 計:藍海微芯
***********************************************************************/
void wrsm(uchar ec)
{
uchar i;
rst_ans();
sendcommand(0x39,0,ec);
for(i=0xff;i>0;i--) /*256個時鐘脈沖擦除數據*/
cardpulse();
}
/********************************************************************
函 數 名:updatepsc()
功 能:更新密碼
說 明:
入口參數:
返 回 值:
設 計:藍海微芯
***********************************************************************/
void updatepsc()
{
uchar i;
uchar j;
rst_ans();
for(i=0;i<0x03;i++)
{
sendcommand(0x39,(i+1),ICCODE[i]);
for(j=0xff;j>0;j--) /*256個時鐘脈沖擦除數據*/
cardpulse();
}
}
/********************************************************************
函 數 名:sendpsc()
功 能:比較校驗數據
說 明:
入口參數:
返 回 值:
設 計:藍海微芯
***********************************************************************/
void sendpsc()
{
uchar i;
uchar j;
uchar adrs=0;
rst_ans();
for(i=0;i<0x03;i++)
{
adrs=i+1;
sendcommand(0x33,adrs,ICCODE[i]);
for(j=123;j>0;j--)
cardpulse();
}
}
/********************************************************************
函 數 名:verifi()
功 能:校驗密碼
說 明:
入口參數:
返 回 值:uchar EC
設 計:藍海微芯
***********************************************************************/
uchar verifi()
{
uchar EC=0;
uchar temp;
EC=rdsm_ec(); /*讀錯誤計數器*/
EC=EC&0x07;
switch(EC)
{
case 0x00:
break;
case 0x07:
temp=0x03;
break;
case 0x06:
temp=0x02;
break;
case 0x05:
temp=0x01;
break;
case 0x04:
temp=0x00;
break;
case 0x03:
temp=0x01;
break;
temp=0;
}
if(!EC==0)
{
wrsm(temp); /*更新保密存儲區*/
sendpsc(); /*比較驗證數據*/
wrsm(0x07); /*更新保密存儲區*/
EC=rdsm_ec(); /*讀錯誤計數器*/
EC=EC&0x07;
}
return EC;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -