?? iccard.h
字號:
#ifndef ICCARD_H
#define ICCARD_H
#define uint unsigned int
#define uchar unsigned char
#define ulongint unsigned long
#include <msp430x41x.h>
#define IC_SDA_1 P6OUT|=BIT0
#define IC_SDA_0 P6OUT&=~BIT0
#define IC_SCL_1 P6OUT|=BIT2
#define IC_SCL_0 P6OUT&=~BIT2
#define IC_RST_1 P6OUT|=BIT3
#define IC_RST_0 P6OUT&=~BIT3
#define MainMemRead 0x30 //讀主存儲器
#define MainMemUpdate 0x38 // 修改主存儲器
#define ProMemRead 0x34 // 讀保護存儲器
#define ProMemWrite 0x3c // 寫保護存儲器
#define SecMemRead 0x31 // 讀加密存儲器
#define SecMemUpdate 0x39 // 修改加密存儲器
#define DataCompare 0x33 // 比較校驗密碼
//****************************************************************************************************
void PowerOn(void);//上電
void PowerOff(void);//下電
//****************************************************************************************************
void Reset(void);//復位
void Start(void);//開始
void Stop(void);//結束
void WByte(uchar data);//寫一個字節
uchar RByte(void);// 讀一個字節
void DataRead(uchar com,uchar add,uchar len,uchar *buf);//讀數據
void DataWrite(uchar com,uchar add,uchar data);//寫數據
void SecVerify(uchar secdata1,uchar secdata2,uchar secdata3);//校驗密碼
//**************************************************************************************************
void PowerOn(void)//上電
{
IC_RST_0;
_NOP();
IC_SCL_0;
_NOP();
IC_SDA_0;
_NOP();_NOP();_NOP();
P6DIR|=BIT1;
P6OUT|=BIT1;
_NOP();
IC_SDA_1;
_NOP();
_NOP();
}
//**************************************************************************************************
void PowerOff(void)//下電
{
IC_RST_0;
_NOP();
IC_SCL_0;
_NOP();
IC_SDA_0;
_NOP();
_NOP();_NOP();_NOP();
P6DIR|=BIT1;
P6OUT&=~BIT1;
_NOP();
_NOP();
_NOP();
}
//***************************************************************************************************
void Reset(void) //GET ATR
{
uchar a,i,k;
//uchar DATABUFF[4];
P6DIR&=~BIT0;
IC_SCL_0;
_NOP();_NOP();_NOP();
IC_RST_1; //RESET
_NOP();_NOP();_NOP();
IC_SCL_1;
_NOP();_NOP();_NOP();
IC_SCL_0;
_NOP();_NOP();_NOP();
IC_RST_0;
_NOP();_NOP();_NOP();
a=0;
for(i=0;i<4;i++)
{
for(k=0;k<8;k++)
{
//IC_SDA_1;
a>>=1;
if((P6IN&BIT0)==BIT0)
a|=0x80;
else
a&=~0x80;
IC_SCL_1;
_NOP();_NOP();_NOP();
IC_SCL_0;
_NOP();_NOP();_NOP();
}
//DATABUFF[i]=a;
_NOP();
_NOP();
_NOP();
_NOP();
a=0;
}
P6DIR|=BIT0;
}
//***************************************************************************************************
void Start(void) //開始
{
IC_SCL_0;
_NOP();
IC_SDA_1;
_NOP();
IC_SCL_1;
_NOP();_NOP();_NOP();
IC_SDA_0;
_NOP();_NOP();_NOP();
IC_SCL_0;
_NOP();_NOP();_NOP();
}
//******************************************************************************************************
void Stop(void) //結束
{
IC_SDA_0;
_NOP();
IC_SCL_1;
_NOP();_NOP();_NOP();
IC_SDA_1;
_NOP();_NOP();_NOP();
IC_SCL_0;
_NOP();_NOP();_NOP();
}
//********************************************************************************************************
void WByte(uchar wdata)//寫一個字節
{
uchar i;
for(i=0;i<8;i++)
{
if((wdata&0x01)==0x01)
{IC_SDA_1;_NOP();_NOP();_NOP();}
else
{IC_SDA_0;_NOP();_NOP();_NOP();}
IC_SCL_1;
_NOP();_NOP();_NOP();
IC_SCL_0;
_NOP();_NOP();_NOP();
wdata>>=1;
}
}
//*********************************************************************************************************
uchar RByte(void)//讀一個字節
{
uchar i,data;
P6DIR&=~BIT0;
data = 0;
for (i=0;i<=7;i++)
{
data>>= 1;
if ((P6IN&BIT0)==BIT0)
data |= 0x80;
else
data &=~0x80;
_NOP();_NOP();_NOP();
IC_SCL_1;
_NOP();_NOP();_NOP();
IC_SCL_0;
_NOP();_NOP();_NOP();
}
P6DIR|=BIT0;
return (data);
}
//*****************************************************************************************************
void DataRead(uchar com,uchar add,uchar len,uchar *buf)
{
uchar i;
Start();
WByte(com);
WByte(add);
WByte(0);
Stop();
for(i=0;i<len;i++)
{
*buf++=RByte();
_NOP();_NOP();_NOP();
}
IC_RST_1;
_NOP();_NOP();_NOP();
IC_RST_0;
}
//******************************************************************************************************
void DataWrite(uchar com,uchar add,uchar data)//寫數據
{
Start();
WByte(com);
WByte(add);
WByte(data);
Stop();
P6DIR&=~BIT0;
do{
IC_SCL_1;
_NOP();_NOP();_NOP();
IC_SCL_0;
_NOP();_NOP();_NOP();
}
while(!((P6IN&BIT0)==BIT0));
_NOP();
P6DIR|=BIT0;
}
//******************************************************************************************************
void SecVerify(uchar secdata1,uchar secdata2,uchar secdata3)//密碼校驗
{
uchar mask,i;
uchar secbuf[4];
mask=1;
DataRead(SecMemRead,0,4,secbuf);
if(secbuf[0]>0)
{
for(i=0;i<3;i++)
{
if(secbuf[0]&mask) break;
mask<<=1;
}
}
secbuf[0]^=mask;
DataWrite(SecMemUpdate,0x00,secbuf[0]);
DataWrite(DataCompare,0x01,secdata1);
DataWrite(DataCompare,0x02,secdata2);
DataWrite(DataCompare,0x03,secdata3);
DataWrite(SecMemUpdate,0x00,0xff);
DataRead(SecMemRead,0,4,secbuf);
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -