📄 eic_c.c
字号:
#include<AT892051.h>
#define PIN_IO P3_5 /* P1_2 */
#define PIN_PGM P1_4 /* P1_3 */
#define PIN_FUS P1_3 /* P1_4 */
#define PIN_CLK P1_2 /* P1_5 */
#define PIN_RST P1_1 /* P1_6 */
#define PIN_VCC P1_0 /* P1_7 */
#define IC_IN P3_3
#define IC_FZ 0x00 /* ;2 厂商代码区 */
#define IC_IZ 0x02 /* ;8 发行者区 *8 发行商代码区 */
#define IC_SC 0x0A /* ;2 主密码区 */
#define IC_SCAC 0x0C /* ;1 主密码错误计数区 */
#define IC_CPZ 0x0D /* ;8 代码保护区 *5 卡批号和编号 */
#define IC_SC1 0x15 /* ;2 一区密码 *1604 */
#define IC_SCAC1 0x17 /* ;1 一区密码错误计数 */
#define IC_EZ1 0x18 /* ;2 一区密钥 */
#define IC_E1AC 0x1A /* ;1 一区密钥错误计数 */
#define IC_AZ1 0x1B /* ;N 应用区一 */
#define ISSUE_DATE 0x1E /* ;4 发卡日期 */
#define ISSUE_TIME 0x22 /* ;3 发卡时间 */
#define USER_NAME 0x25 /* ;8 用户姓名 */
#define USER_ID 0x2D /* ;9 身份证号码 */
#define CARD_MONEY0 0x36 /* ;4 余额 */
#define CARD_LEVEL0 0x3B /* ;1 级别 */
#define CARD_CONSU0 0x3C /* ;4 消费金额 */
#define CARD_MONEY1 0x41 /* ;4 余额 备份 */
#define CARD_LEVEL1 0x46 /* ;1 级别 */
#define CARD_CONSU1 0x47 /* ;4 消费金额 */
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar data Rec_Buf[20]; /* 接收缓冲区 */
uchar data Send_Buf[20]; /* 发送缓冲区 */
uchar data Pause_Buf[10]; /* 数据暂存缓冲区 */
uchar data Rec_Leng; /* 所接收数据的长度 */
uchar data Send_Leng; /* 已发送数据的长度 */
uchar data Count_Times; /* 次数计数 */
uchar data Count_Ms; /* 毫秒计数 */
uchar data Online_Count; /* IC卡在线计数 */
uchar data Timeout_Count; /* 通讯超时计数 */
uchar data Old_Rec; /* 上次所接收到的数据 */
uchar data Old_Send; /* 上次所发送到的数据 */
uchar data Password[2]; /* 密码缓冲区 */
uchar data IC_NO; /* IC卡卡型 */
uint data Delay_Count; /* 延时计数 */
bdata bit Send_Flag; /* 发送数据标志 */
bdata bit Ic_Online; /* IC卡在线标志 */
bdata bit Rec_Full; /* 接收完一帧数据标志 */
bdata bit Back_Up; /* 数据须备份标志 */
bdata bit Time_Out; /* 通信超时标志 */
bdata bit Ic_Inset; /* IC卡插入标志 */
bdata bit Err_Ic; /* 错卡标志 */
bdata bit Compare_Flag; /* 密码正确与否标志 */
bdata bit Debug_Flag; /* 调试程序标志 */
void My_Start( );
void My_Work( );
void My_End( );
void Powoff_Ic( );
void Powon_Ic( );
void Delay_Ms( int delay_time );
void Delay_Us( int delay_time );
void Work_Ic( );
void Test_Ic( );
void No_Input( );
void Find_Addr( int aim_addr );
void Read_Ic( int aim_addr, char aim_leng );
void Erase_Ic( int aim_addr, char aim_leng );
void Write_Ic( int aim_addr, char aim_leng );
void Compare_Password( int aim_addr );
bit Write_Test( );
void Compare_Aim( );
main( )
{
My_Start( );
My_Work( );
My_End( );
}
void My_Start( )
/* 初始化子程序 */
{
int my_count = 0x7FFF;
while( my_count != 0x00 )
{
my_count --;
}
PIN_VCC = 1;
TMOD = 0x21; /*定时器0和1为16位定时器方式*/
TL0 = 0x66;
TH0 = 0xFC;
TL1 = 0xFD;
TH1 = 0xFD; /*波特率为9600bps(晶振为11.0592MHz)*/
SCON = 0x50; /*方式3,置SM2,REN(允许串行接收),清TB8,RB8和中断标志*/
IE = 0x92;
TR0 = 1;
TR1 = 1;
PS = 1;
Powoff_Ic( );
}
void Extern_Int0() interrupt 0
/* 外部中断0 */
{
;
}
void Time_Int0() interrupt 1
/* 定时器中断0 */
{
TR0 = 0;
TL0 = 0x66;
TH0 = 0xFC;
TR0 = 1;
Delay_Count --;
Count_Ms ++;
if( !IC_IN )
{
if( !Ic_Online )
{
Online_Count ++;
if( Online_Count > 0xE0 )
{
Ic_Inset = 1;
Ic_Online = 1;
Timeout_Count = 0;
}
}
}
else
{
Ic_Online = 0;
Online_Count = 0;
}
if( Ic_Online )
{
if( !Time_Out )
{
if( Count_Ms > 0xFA )
Timeout_Count ++;
if( Timeout_Count > 0x14 )
Time_Out = 1;
}
}
}
void Extern_Int1() interrupt 2
/* 外部中断1 */
{
;
}
void Time_Int1() interrupt 3
/* 定时器中断1 */
{
;
}
void Communication_Int0() interrupt 4
/* 串口通讯中断0 */
{
uchar comm_char;
if( RI )
{
comm_char = SBUF;
RI = 0;
if( !Rec_Full )
{
if( comm_char == 0x7B )
{
if( Old_Rec == 0x7B )
{
Rec_Buf[Rec_Leng++] = comm_char;
comm_char =0x00;
}
}
else
{
if( Old_Rec == 0x7B )
{
Rec_Leng = 00;
Rec_Buf[Rec_Leng++] = Old_Rec;
}
Rec_Buf[Rec_Leng++] = comm_char;
}
Old_Rec = comm_char;
}
if( Rec_Leng > 0x05 )
{
if( Rec_Leng == Rec_Buf[2] );
Rec_Full = 1;
}
}
else
{
TI = 0;
if( Send_Flag )
{
if( Send_Leng < Send_Buf[2] + 1 )
{
SBUF = Send_Buf[Send_Leng++];
}
else
{
Send_Flag = 0;
Send_Leng = 0;
}
}
}
Time_Out = 0;
}
void Powoff_Ic( )
/* IC卡下电子程序 */
{
Delay_Ms( 300 );
PIN_IO = 0;
PIN_PGM = 0;
PIN_FUS = 0;
PIN_CLK = 0;
PIN_RST = 0;
Delay_Ms( 5 );
PIN_VCC = 1;
Delay_Ms( 200 );
}
void Powon_Ic( )
/* IC卡上电子程序 */
{
if( !Ic_Online )
return;
PIN_RST = 0;
PIN_CLK = 0;
Delay_Ms( 5 );
PIN_VCC = 0;
PIN_IO = 0;
}
void Delay_Ms( int delay_time )
/* 延时N毫秒子程序 */
{
Delay_Count = delay_time;
while( Delay_Count != 0 )
{
;
}
}
void Delay_Us( int delay_time )
/* 延时N微秒子程序 */
{
delay_time -= 4;
while( delay_time > 0)
delay_time--;
}
void My_Debug( )
/* 调试子程序 */
{
int aim_addr;
aim_addr = IC_SC * 8;
Powon_Ic( );
Password[0] = 0x23;
Password[1] = 0x23;
while( !Debug_Flag );
Compare_Password( aim_addr );
if( Write_Test( ) )
{
Compare_Flag = 1;
}
else
{
Compare_Flag = 1;
}
Rec_Buf[3] = 0x01;
Rec_Buf[4] = 0x00;
Work_Ic( );
Rec_Buf[3] = 0x02;
Rec_Buf[4] = 0x00;
Work_Ic( );
Powoff_Ic( );
}
void My_Work( )
{
/*My_Debug( );*/
while( 1 )
{
if( Ic_Inset )
{
Ic_Inset = 0;
Powon_Ic( );
Delay_Ms( 200 );
Powoff_Ic( );
Delay_Ms( 100 );
Powon_Ic( );
Test_Ic( );
}
if( Ic_Online )
{
if( ( !PIN_VCC ) && Time_Out )
{
Powoff_Ic( );
}
if( Rec_Full )
{
Rec_Full = 0;
if( PIN_VCC )
Powon_Ic( );
Work_Ic( );
}
}
else
{
if( Rec_Full )
{
No_Input( );
}
}
}
}
void Work_Ic( )
/* 对IC卡操作子程序 */
{
uchar ctrl_1, ctrl_0;
int aim_addr;
char aim_leng;
if( Err_Ic )
{
No_Input( );
return;
}
ctrl_1 = Rec_Buf[3];
ctrl_0 = Rec_Buf[4];
switch( ctrl_1 )
{
case 0x01 :
{
switch( ctrl_0 )
{
case 0x00 :
{
aim_addr = IC_IZ * 8;
aim_leng = 0x06;
}
break;
case 0x01 :
{
}
break;
case 0x02 :
{
}
break;
case 0x03 :
{
}
break;
case 0x04 :
{
}
break;
case 0x05 :
{
}
break;
case 0x06 :
{
}
break;
case 0x07 :
{
}
break;
case 0x08 :
{
}
break;
case 0x09 :
{
}
break;
case 0x0A :
{
}
break;
case 0x0B :
{
}
break;
case 0x0C :
{
}
break;
case 0x0D :
{
}
break;
default :
break;
}
Write_Ic( aim_addr, aim_leng );
}
break;
case 0x02 :
{
switch( ctrl_0 )
{
case 0x00 :
{
aim_addr = 8;
aim_leng = 0x0A;
}
break;
case 0x01 :
{
}
break;
case 0x02 :
{
}
break;
case 0x03 :
{
}
break;
case 0x04 :
{
}
break;
case 0x05 :
{
}
break;
case 0x06 :
{
}
break;
case 0x07 :
{
}
break;
case 0x08 :
{
}
break;
case 0x09 :
{
}
break;
case 0x0A :
{
}
break;
case 0x0B :
{
}
break;
case 0x0C :
{
}
break;
case 0x0D :
{
}
break;
default :
break;
}
Read_Ic( aim_addr, aim_leng );
}
break;
case 0x03 :
{
switch( ctrl_0 )
{
case 0x00 :
{
}
break;
case 0x01 :
{
}
break;
case 0x02 :
{
}
break;
case 0x03 :
{
}
break;
case 0x04 :
{
}
break;
case 0x05 :
{
}
break;
case 0x06 :
{
}
break;
case 0x07 :
{
}
break;
case 0x08 :
{
}
break;
case 0x09 :
{
}
break;
case 0x0A :
{
}
break;
case 0x0B :
{
}
break;
case 0x0C :
{
}
break;
case 0x0D :
{
}
break;
default :
break;
}
}
break;
default :
break;
}
}
void No_Input( )
/* 回答未插IC卡子程序 */
{
data char count;
for( count = 0; count < 0x10; count++ )
{
Send_Buf[count] = count;
}
Send_Buf[2] = 0x06;
Send_Leng = 0x00;
Send_Flag = 1;
SBUF = 0x99;
}
void Test_Ic( )
/* 检测IC卡子程序 */
{
}
void My_End( )
/* 程序结束子程序 */
{
}
void Reset_Ic( )
/* IC卡复位子程序 */
{
PIN_RST = 1;
PIN_CLK = 1;
Delay_Us( 8 );
PIN_CLK = 0;
Delay_Us( 8 );
PIN_RST = 0;
Delay_Us( 8 );
}
void Find_Addr( int aim_addr )
/* IC卡定位子程序 */
{
int count;
Reset_Ic( );
for( count = 0; count < aim_addr; count ++ )
{
PIN_CLK = 1;
Delay_Us( 8 );
PIN_CLK = 0;
Delay_Us( 8 );
}
}
void Read_Ic( int aim_addr, char aim_leng )
/* 从IC卡中读数据子程序 */
{
char count;
char num;
uchar the_char;
Find_Addr( aim_addr );
PIN_RST = 0;
PIN_PGM = 0;
PIN_FUS = 1;
PIN_CLK = 0;
Delay_Us( 8 );
for( count = 0; count < aim_leng; count ++ )
{
the_char = 0;
for( num = 0; num < 0x08; num ++ )
{
PIN_IO = 1;
Delay_Us( 8 );
if( PIN_IO )
the_char |= 0x01;
PIN_CLK = 1;
Delay_Us( 8 );
PIN_CLK = 0;
if( num != 0x07 )
the_char <<= 1;
}
Pause_Buf[count] = the_char;
}
}
void Erase_Ic( int aim_addr, char aim_leng )
/* 檫除IC卡中的数据子程序 */
{
int count;
char num;
Find_Addr( aim_addr );
PIN_RST = 0;
PIN_FUS = 1;
for( count = 0; count < aim_leng; count ++ )
{
PIN_PGM = 1;
PIN_IO = 1;
Delay_Us( 8 );
PIN_CLK = 1;
Delay_Ms( 2 );
PIN_PGM = 0;
Delay_Ms( 3 );
PIN_CLK = 0;
Delay_Us( 8 );
for(num = 0; num < 0x08; num ++ )
{
PIN_CLK = 1;
Delay_Us( 8 );
PIN_CLK = 0;
Delay_Us( 8 );
}
}
}
void Write_Ic( int aim_addr, char aim_leng )
/* 向IC卡中写数据子程序 */
{
int count;
char num;
uchar the_char, *the_data;
Erase_Ic( aim_addr, aim_leng );
Find_Addr( aim_addr );
PIN_RST = 0;
PIN_FUS = 1;
the_data = Pause_Buf;
for( count = 0; count < aim_leng; count ++ )
{
the_char = *the_data;
the_data ++;
for( num = 0; num < 0x08; num ++ )
{
if( !(the_char & 0x80) )
{
PIN_IO = 1;
Delay_Us( 8 );
if( PIN_IO )
{
while( 1 )
{
PIN_PGM = 1;
PIN_IO = 0;
Delay_Us( 8 );
PIN_CLK = 1;
Delay_Ms( 2 );
PIN_PGM = 0;
Delay_Ms( 3 );
PIN_CLK = 0;
PIN_PGM = 0;
Delay_Us( 8 );
if( !PIN_IO )
break;
}
}
}
the_char <<= 1;
PIN_CLK = 1;
Delay_Us( 8 );
PIN_CLK = 0;
}
}
}
void Compare_Aim( )
/* 比较IC卡中的数据子程序 */
{
uchar test_code;
char count, num;
for( count = 0; count < 2; count ++ )
{
test_code = Password[count];
for( num = 0; num < 8; num ++ )
{
PIN_CLK = 1;
Delay_Us( 8 );
if( test_code & 0x80 )
{
PIN_IO = 1;
}
else
{
PIN_IO = 0;
}
test_code <<= 1;
Delay_Us( 8 );
PIN_CLK = 0;
Delay_Us( 8 );
}
}
}
bit Write_Test( )
/* IC卡写测试子程序 */
{
uchar count,num;
if( IC_NO == 0 )
{
num = 8;
}
else
if( IC_NO == 1 )
{
num = 4;
}
for( count = 0; count < num; count ++ )
{
PIN_CLK = 1;
Delay_Us( 8 );
PIN_CLK = 0;
PIN_IO = 1; /* 读出SCAC或ECAC中的第一位 */
Delay_Us( 8 );
if( PIN_IO )
break; /* 为'1'则密码正确 */
if( count == num - 1 )
return( 0 );
}
PIN_PGM = 1; /* 写该位为'0' */
PIN_IO = 0;
Delay_Us( 8 );
PIN_CLK = 1;
Delay_Ms( 2 );
PIN_PGM = 0;
Delay_Ms( 3 );
PIN_CLK = 0;
PIN_IO = 1; /* 校验是否写正确 */
Delay_Us( 8 );
if( PIN_IO )
return( 0 );
PIN_PGM = 1; /* 擦除SCAC或ECAC */
PIN_IO = 1 ;
Delay_Us( 8 );
PIN_CLK =1;
Delay_Ms( 2 );
PIN_PGM = 0;
Delay_Ms( 3 );
PIN_CLK =0;
Delay_Us( 8 );
return( PIN_IO );
}
void Compare_Password( int aim_addr )
/* 比较IC卡的密码子程序 */
{
EA = 0;
TR0 = 0;
aim_addr--;
Find_Addr( aim_addr );
Compare_Aim( );
EA = 1;
TR0 = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -