?? 4442.c
字號:
//-----------------------函數聲明,變量定義--------------------------------------------
//-----------------------函數聲明,變量定義--------------------------------------------------------
#include <stdio.h>
#include <intrins.h>
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define OFF 1
#define ON 0
#define True 1
#define False 0
#define RMM_COMM 0x30 //讀主存命令字
#define WMM_COMM 0x38 //寫主存命令字
#define VER_COMM 0x33 //校驗密碼
#define RSM_COMM 0x31 //讀密碼存儲區
#define WSM_COMM 0x39 //寫密碼存儲區
#define RPM_COMM 0x34 //讀保護存儲區
#define WPM_COMM 0x3c //寫保護存儲區
//----------------------------------------------------------------------------
//------------------------------------------------------------------------------------
// 定義IC卡接口
sbit IC_RST =P1^0; // 將p1.0口設定為復位管腳
sbit IC_CLK =P1^1; // 用p1.1口模擬時鐘口
sbit IC_IO =P1^2; // 將p1.2口模擬數據口
sbit watch_PW =P1^3; // 將p1.3口作為電源監控,watch_PW=0,設備有損壞
sbit CT_PW =P1^4; // 將p1.4口作為電源控制,CT_PW=0接通電源,CT_PW=1斷開電源
sbit IC_INT0 =P3^2; // P3.2用于檢測有無卡插入,檢測到低電平,說明有卡插入
//------------------------------------------------------------------------------------
uchar Read_Buffer[16];
bit IC_In_Flag;
bit IC_Read_Flag;
//------------------------------------------------------------------------------------
//4442卡底層程序的外部函數聲明
//------------------------------------------------------------------------------------
void ReadMainMem(uchar addr,uchar idata *pt,uchar count); //讀IC卡主存
void WriteMainMem(uchar addr,uchar idata *pt); //寫IC卡主存
void ReadProtectMem(uchar idata *pt); //讀保護存儲器
void ProtectByte(uchar CardAdd,uchar idata *pt); //保護一字節,注意待保
//護的字節是已經寫入過的,地址只能在保護存儲區內
void SendComm(uchar a,uchar b,uchar c); //發送命令
void ReadMode(uchar idata *pt,uchar count);
void ProcessMode(void);
void 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 init();
//--------------------------------------------------------------------------------
// 函數名稱: ResetCard
// 函數功能: 卡復位子程序
//-------------------------------------------------------------------------------
void ResetCard(void)
{
uchar temp;
Delay5us();
IC_RST = 0;
IC_CLK = 0;
IC_IO = 1;
Delay5us();
IC_RST = 1;
Delay5us();
IC_CLK = 1;
Delay10us();
Delay10us();
Delay10us();
Delay10us();
IC_CLK = 0;
Delay5us();
IC_RST = 0;
Delay10us();
temp = ReadByte();
temp = ReadByte();
temp = ReadByte();
temp = ReadByte();
IC_CLK = 0;
Delay5us();
IC_IO = 1;
_nop_();
IC_CLK = 0;
Delay5us();
}
//-------------------------------------------------------------------------------------
// 函數名稱: BreakOperate
// 函數功能: 停止操作
//-----------------------------------------------------------------------------------
void BreakOperate(void)
{
IC_CLK = 0;
IC_RST = 0;
IC_IO = 0;
Delay5us();
IC_RST = 1;
IC_IO = 1;
Delay5us();
IC_RST = 0;
Delay5us();
CT_PW = 1;
}
//------------------------------------------------------------------------------------
// 函數名稱: StartComm()
// 函數功能: 啟動I2C總線子程序
//-----------------------------------------------------------------------------------
void StartComm(void)
{
IC_CLK = 0;
IC_IO = 1;
Delay5us();
IC_CLK = 1;
Delay5us();
IC_IO = 0;
Delay5us();
}
//-------------------------------------------------------------------------------
// 函數名稱: StopComm()
// 函數功能: 停止I2C總線數據傳送子程序
//-----------------------------------------------------------------------------
void StopComm(void)
{
IC_CLK = 0;
IC_IO = 0;
Delay5us();
IC_CLK = 1; //CLK: H
Delay5us();
IC_IO = 1; //IO : H
Delay10us();
}
//-----------------------------------------------------------------------------------
// 函數名稱: ReadByte
// 返回接收的數據
// 函數功能: 接收一字節子程序
//-----------------------------------------------------------------------------------
uchar ReadByte(void)
{
uchar i,ch;
ch = 0;
for (i = 8; i > 0; i--)
{
IC_CLK = 0;
ch = ch >> 1; //從低位讀起
if((uchar)IC_IO)
ch |= 0x80;
Delay5us();
IC_CLK = 1;
Delay5us();
}
return ch;
}
//----------------------------------------------------------------------------------
// 函數名稱: WriteByte
// 入口參數: ch
// 函數功能: 發送一個字節
//------------------------------------------------------------------------------------
void WriteByte(uchar ch)
{
uchar i;
for(i = 8; i > 0; i--)
{
IC_CLK = 0;
IC_IO = (bit)(ch & 0x01);
Delay5us();
IC_CLK = 1;
Delay10us();
ch = ch >> 1; //右移一位
}
}
//-------------------------------------------------------------------------------------
// 函數名稱: ReadMode
// 入口參數: pt地址指針,指向接收緩沖區,count要接收的數據個數
// 函數功能: 接收n位數據子程序
//----------------------------------------------------------------------------------
void ReadMode(uchar idata *pt,uchar count)
{
IC_CLK=0;
Delay5us();
do
{
*pt = ReadByte(); //讀入一個字節
pt++; //指針加一
}while(--count); //計數器減一,判斷
}
//------------------------------------------------------------------------
// 延時10us子程序,根據系統時鐘需要調整
//------------------------------------------------------------------------
void Delay10us(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//------------------------------------------------------------------------
// 延時5us子程序,根據系統時鐘需要調整
//------------------------------------------------------------------------
void Delay5us(void)
{
_nop_();
_nop_();
_nop_();
}
//------------------------------------------------------------------------
// 初始化子程序//------------------------------------------------------------------------
void init()
{
IC_INT0 = 1;
IC_Read_Flag = True;
}
//---------------------------------------------------------------------------------
// 函數名稱: ReadMainMem()
// 入口參數: addr: IC存儲區地址;
// pt: 地址指針,指向接收緩沖區;
// count: 接收數據的個數
// 函數功能: 讀存儲區
//-----------------------------------------------------------------------------------
void ReadMainMem(uchar addr,uchar idata *pt,uchar count)
{
SendComm(RMM_COMM,addr,0xff);
ReadMode(pt,count);
BreakOperate();
IC_Read_Flag = False;
}
//-----------------------------------------------------------------------------
// 函數名稱: SendComm()
// 入口參數: a: 命令字;
// b: 地址;
// c: 數據
// 函數功能: 發送一個完整的命令
//-------------------------------------------------------------------------------
void SendComm(uchar a,uchar b,uchar c)
{
StartComm(); //開始發送命令
WriteByte(a); //a: 發命令字
WriteByte(b); //b: 發地址
WriteByte(c); //c: 發數據
StopComm(); //結束發送命令
}
main()
{
init();
if((IC_INT0 == 0)&&(IC_Read_Flag == 1) == 1) //有卡插入,并且有讀標記
{
CT_PW = 0; //上電
Delay10us();
if(IC_Read_Flag == True)
{
ResetCard(); //
ReadMainMem(0xEF,&Read_Buffer[0],16);
BreakOperate();
Delay10us();
ResetCard();
}
Delay10us();
CT_PW = 1;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -