?? siemens_ic_sle4442.c
字號:
#define Siemens
//#include <at89x52.h>
#include "head.h"
uchar code Password_Bass[3]={0xad,0x6e,0x46};
//void nop(void);
void SendComm(uchar a,uchar b,uchar c); //發(fā)送命令
void ReadMode(uchar idata *pt,uchar count);
uchar ResetCard(void);
void BreakOperate(void);
void StartComm(void);
void StopComm(void);
uchar ReadByte(void);
void WriteByte(uchar ch);
void Delay10us(void);
void Delay5us(void);
void ReadMainMem(uchar addr,uchar idata *pt,uchar count);
void ReadSafeMemory(uchar *p);
void WriteSafeMemory(uchar Address,uchar Data);
uchar VerifyPassword(uchar *p);
void CalculatePassword(uchar *p);
void Process(uchar i);
uchar ResetCard(void)
{
uchar temp;
Delay5us();
card_rest = 0;
card_clk = 0;
card_dat = 1;
Delay5us();
Delay10us();
Delay10us();
card_rest = 1;
Delay5us();
card_clk = 1;
Delay10us();
Delay10us();
Delay10us();
Delay10us();
card_clk = 0;
Delay5us();
card_rest = 0;
Delay10us();
temp=ReadByte();
if(temp==0xa2)
{
temp = ReadByte();
temp = ReadByte();
temp = ReadByte();
card_clk = 0;
Delay5us();
card_dat = 1;
Delay5us();
card_clk = 0;
Delay5us();
return Siemens_IC_Sel4442;
}
else
{
return ATMEL_IC_24C01;
}
}
//-------------------------------------------------------------------------------------
// 函數(shù)名稱: BreakOperate
// 函數(shù)功能: 停止操作
//-----------------------------------------------------------------------------------
void BreakOperate(void)
{
card_clk = 0;
card_rest = 0;
card_dat = 0;
Delay5us();
card_rest = 1;
card_dat = 1;
Delay5us();
card_rest = 0;
Delay5us();
//CT_PW = 1;
}
//------------------------------------------------------------------------------------
// 函數(shù)名稱: StartComm()
// 函數(shù)功能: 啟動I2C總線子程序
//-----------------------------------------------------------------------------------
void StartComm(void)
{
card_clk = 0;
card_dat = 1;
Delay5us();
card_clk = 1;
Delay5us();
card_dat = 0;
Delay5us();
}
//-------------------------------------------------------------------------------
// 函數(shù)名稱: StopComm()
// 函數(shù)功能: 停止I2C總線數(shù)據(jù)傳送子程序
//-----------------------------------------------------------------------------
void StopComm(void)
{
card_clk = 0;
card_dat = 0;
Delay5us();
card_clk = 1; //CLK: H
Delay5us();
card_dat = 1; //IO : H
Delay10us();
}
//-----------------------------------------------------------------------------------
// 函數(shù)名稱: ReadByte
// 返回接收的數(shù)據(jù)
// 函數(shù)功能: 接收一字節(jié)子程序
//-----------------------------------------------------------------------------------
uchar ReadByte(void)
{
uchar i,ch;
ch = 0;
for (i = 0; i != 8; i++)
{
card_clk = 0;
ch = ch >> 1; //從低位讀起
if((uchar)card_dat)
ch |= 0x80;
else ch &= 0x7f;
Delay5us();
card_clk = 1;
Delay5us();
}
Delay10us();
Delay10us();
return ch;
}
//----------------------------------------------------------------------------------
// 函數(shù)名稱: WriteByte
// 入口參數(shù): ch
// 函數(shù)功能: 發(fā)送一個字節(jié)
//------------------------------------------------------------------------------------
void WriteByte(uchar ch)
{
uchar i;
for(i = 8; i > 0; i--)
{
card_clk = 0;
card_dat = (bit)(ch & 0x01);
Delay5us();
card_clk = 1;
Delay10us();
ch = ch >> 1; //右移一位
}
}
//-------------------------------------------------------------------------------------
// 函數(shù)名稱: ReadMode
// 入口參數(shù): pt地址指針,指向接收緩沖區(qū),count要接收的數(shù)據(jù)個數(shù)
// 函數(shù)功能: 接收n位數(shù)據(jù)子程序
//----------------------------------------------------------------------------------
void ReadMode(uchar idata *pt,uchar count)
{
//card_clk=0;
//StartComm();
//Delay5us();
do
{
*pt = ReadByte(); //讀入一個字節(jié)
pt++; //指針加一
}while(--count); //計數(shù)器減一,判斷
}
//------------------------------------------------------------------------
// 延時10us子程序,根據(jù)系統(tǒng)時鐘需要調(diào)整
//------------------------------------------------------------------------
void Delay10us(void)
{
feed_dog();;;;;
}
//------------------------------------------------------------------------
// 延時5us子程序,根據(jù)系統(tǒng)時鐘需要調(diào)整
//------------------------------------------------------------------------
void Delay5us(void)
{
feed_dog();
}
//******************處理過程**************//
void Process(uchar i)
{
//card_dat = 1;
card_clk = 0;
Delay5us();
card_dat = 0;
Delay5us();
for(;i>0;i--)
{
card_clk=1;
Delay5us();
card_clk = 0;
Delay5us();
}
card_dat = 1;
Delay5us();
card_clk=1;
Delay5us();
card_clk = 0;
Delay5us();
}
//---------------------------------------------------------------------------------
// 函數(shù)名稱: ReadMainMem()
// 入口參數(shù): addr: IC存儲區(qū)地址;
// pt: 地址指針,指向接收緩沖區(qū);
// count: 接收數(shù)據(jù)的個數(shù)
// 函數(shù)功能: 讀存儲區(qū)
//-----------------------------------------------------------------------------------
void ReadMainMem(uchar addr,uchar idata *pt,uchar count)
{
SendComm(RMM_COMM,addr,0xff);
ReadMode(pt,count);
BreakOperate();
}
void WriteMainMem(uchar addr,uchar idata *pt)
{
SendComm(WMM_COMM,addr,*pt);
Process(0xff);
}
//---------------------------------------------------------------------------------
// 函數(shù)名稱: VerifyPassword()校驗密碼
// 入口參數(shù):
// p: 地址指針,指向密碼存儲區(qū);
// 出口參數(shù): 0:失敗 1:成功
// 函數(shù)功能: 讀存儲區(qū)
//-----------------------------------------------------------------------------------
uchar VerifyPassword(uchar *p)
{
uchar temp[4];//暫存4字節(jié)保護密碼;
uchar i;
ResetCard();
ReadSafeMemory(temp);//讀安全代碼以取得錯誤計數(shù)器
if((temp[0]&0x07)!=0)
{if((temp[0]&0x07)==0x07) i=0x06;
if((temp[0]&0x07)==0x06) i=0x04;
if((temp[0]&0x07)==0x04) i=0x00;
WriteSafeMemory(0,i);
for(i=1;i<4;i++,p++)
{
SendComm(0x33,i,*p);
Process(0x02);
}
WriteSafeMemory(0,0xff);
ReadSafeMemory(temp);
if((temp[0]&0x07)==0x07) return(0x1);
}
return(0);
}
/**************讀安全存儲器************/
void ReadSafeMemory(uchar *p)
{
uchar i;
SendComm(0x31,0xff,0xff);
for(i=0;i<4;i++)
{*p=ReadByte();
p++;}
}
/*************寫安全存儲器***************/
void WriteSafeMemory(uchar Address,uchar Data)
{
SendComm(0x39,Address,Data);//Address=0,1,2,3
Process(0xff);
}
//-----------------------------------------------------------------------------
// 函數(shù)名稱: SendComm()
// 入口參數(shù): a: 命令字;
// b: 地址;
// c: 數(shù)據(jù)
// 函數(shù)功能: 發(fā)送一個完整的命令
//-------------------------------------------------------------------------------
void SendComm(uchar a,uchar b,uchar c)
{
StartComm(); //開始發(fā)送命令
WriteByte(a); //a: 發(fā)命令字
WriteByte(b); //b: 發(fā)地址
WriteByte(c); //c: 發(fā)數(shù)據(jù)
StopComm(); //結(jié)束發(fā)送命令
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -