📄 ic.c
字号:
unsigned char ii=0;
unsigned char temp0[2]={0,0};
temp0[1]=(unsigned char)(Information);
temp0[0]=(unsigned char)(Information>>8);
aa=&temp0[0];
for(ii=0;ii<2;ii++,aa++)
{
WriteMainMemory(Address+ii,aa);
}
}
/*************IC数据测试(只校验金额)*****************/
/***************************************************
* 名称: IC_test()
* 说明:
* 功能: 测试数据与备份数据是否一致
* 调用:
* 输入:
* 返回值:返回正确的数据
*****************************************************/
unsigned int IC_test(void)
{
unsigned int Temp32=0;//(32,33)数据
unsigned int Temp34=0;//(34,35) 备份数据
unsigned int Midder=0;//
Temp32=IC_information(32);
Temp34=IC_information(34);
if(Temp32==Temp34)
return (Temp32);
else
{
WR_IC_information(Temp34,32);//先检测(32,33)数据 //把(34,35)数据写入前者,如果正常,则把两者数据全改成(32,33)
Midder=IC_information(32); //再读出(32,33)
}
if(Midder==Temp34)
{
WR_IC_information(Temp32,32);
WR_IC_information(Temp32,34);
return(Temp32);
}
else
{
WR_IC_information(Temp32,34);
Midder=IC_information(34);//再读出(34,35)
if(Midder==Temp32)
{
WR_IC_information(Temp34,32);
WR_IC_information(Temp34,34);
return(Temp34);
}
else
return (0);
}
}//end
/**************************************************
**************************************************
*******测试该机的区域码,如果该机没有区域码,
*******将写把首次插入的卡做为其区域码
/**************************************************/
/**************************************************/
/**************************************************/
void test_User(void)
{
unsigned int kk=0;
unsigned int MM=0;
kk=read_area(); //读存储的区域码 (eeprom)
MM=IC_information(241); //读卡内的区域码 (sel4442)
if(kk>65000) //如果没有,则记录第一次写入的区域码
{
write_area(MM); //写入区域码到识别位
IC_error=0xaa;
kk=MM;
}
if(MM==kk)
{
// money=IC_test(); //读出卡内的余额(32,33)
IC_error=0xaa; //允许工作
if(money==0) //判断money==0,是卡错还是金额为0
{
kk=IC_information(34); //读出卡内的余额(34,35)
MM=IC_information(32);
if(kk==MM)
money=0; //金额为0
else
IC_error=0x55; //非法卡,卡错
}
}
else IC_error=0x55; // 区域码不对,非法卡
}//end
/*******************************************/
//ic卡启用的特效,闪烁三次,伴有鸣笛,显示数字
/*******************************************/
void IC_START(void)
{
uchar xxx=0;
for(;xxx<3;xxx++)
{
show_ic_start();
BELL(1);
}
}
/*******************************************/
//计算天数
/*******************************************/
void count_day(void)
{
uchar temp_day[2]={0,0};
temp_day[0]=DAY/100;
temp_day[1]=DAY%100;
show_data(5,temp_day[0]);//显示高位
// delayms(500);//达到显示效果
show_data(6,temp_day[1]);//显示低位
}
/*******************************************/
//操作IC。
/*******************************************/
void ic_modify(void)
{
unsigned char *ss;
unsigned char pp=0;
unsigned char *tt;
unsigned char *uu;
uchar day_NO=0; //天数
unsigned char Fresh_psw[3]={0xff,0xff,0xff};//卡初始密码
unsigned char Psw[3]={0x8F,0x8B,0xA1}; //卡密码
DDRE|=0X07;
PORTE|=0X07;
tt=&pp;
if(IC_power()) //测试卡是否上电
{
power_on();
ResetIC();
ReadMainMemory(248,tt,1); //读取卡类型码
//22永解 33一次解 44密码卡 55用户卡
if((pp==22)||(pp==33)||(pp==44)||(pp==55)) //表示上旧卡
{
ss=&Psw[0];
IC_test_ok=VerifyPassword(ss); //把IC卡密码正确标志改为全局变量IC_test_ok
}
else //否则为新卡,与原始密码较验
{
ss=&Fresh_psw[0];
IC_test_ok=VerifyPassword(ss); //把IC卡密码正确标志改为全局变量IC_test_ok
IC_error=0x55; //非法卡标志
}
switch(pp) //测试卡类型
{
case 22: //永久解码卡,内部使用
{
if(IC_test_ok==1) //校验成功
{
if(IC_chok==0xaa)
{
IC_chok=0x55;
write_IC(IC_chok);
//start_signal=0x55; //停止IC标志
write_area(65535); //初始化区域码
IC_error=0xaa;
BELL(1);
DelayMs(400);
//BELL(1);
}
}
else
IC_error=0x55; //非法卡标志
} break; //22
case 33: //一次性解锁卡
{
// j=VerifyPassword(ss);
if(IC_test_ok==1) //校验成功
{
if(IC_chok==0xaa)
{
IC_chok=0x55;
WriteMainMemory(248,0);//清第248字节的区位码标志,作废该卡
WriteSafeMemory(1,Fresh_psw[0]);
WriteSafeMemory(2,Fresh_psw[1]);
WriteSafeMemory(3,Fresh_psw[2]); //修改密码:FFFFFF
write_IC(IC_chok);
write_area(65535); //初始化区域码
//start_signal=0x55;//停止IC标志
BELL(1);
DelayMs(400);
BELL(1);
}
}
else
IC_error=0x55; //非法卡标志
} break; //33
case 44: //发行卡的密钥卡
{
if(IC_test_ok==1) //校验成功
{
money_mather=IC_information(32);//读密钥卡储值
//temp_arrea =IC_information(241); //读密钥卡地址
//write_area(temp_arrea);//一旦插入密钥卡,便把该卡的地址写入到该机
//IC_chok=0;
IC_chok=0xff;
write_IC(IC_chok);
// issue_signal=4; //进入发卡界面程序
}
else
IC_error=0x55; //非法卡标志
} break;
case 55: //用户卡
{
if(IC_test_ok==1) //校验成功
{
if(IC_chok==0x55)
{
//start_signal=0xaa;//启动IC标志
IC_chok=0xaa;//加锁
write_IC(0xaa);
}
money=IC_test();
test_User();
money22=money;
}
else //如果密码不对,且该卡为用户卡,则显示时间,但不能使用
{
IC_error=0x55; //非法卡标志
}
} break; //55
}//switch|(pp)
} //power=1
else
{
IC_test_ok=0; //一旦卡下电便清除验校标志
if(IC_chok==0x55) //解锁状态(0表示加锁,非0解锁)
IC_error=0xaa; //允许工作标志
else
{
//IC_error=2; //为加锁状态 并且卡没有上电 "请插卡标志"
//xunhuan=1; //为了一次消除显示区
money=0;
}
}
}
/****************************操作IC卡***********************/
void ic_comporation(void)
{
if(IC_test_ok==0)
ic_modify();
else if(IC_power()==0) //从有卡到无卡,执行下面程序
{
IC_test_ok=0; //一旦卡下电便清除验校标志
if(IC_chok==0xaa) //加锁状态(0xaa表示加锁,0x55解锁)
{
money=0;
show_ic_money();
}
else
{
money=0;
/*************无卡的标致开始******************/
Write_VFD_Specificly(12,0x10);//
Write_VFD_Specificly(13,0x18);//
Write_VFD_Specificly(14,0x00);//
Write_VFD_Specificly(15,0x00);//
Write_VFD_Specificly(16,0x18);//
Write_VFD_Specificly(17,0x00);//
/*************无卡的标致结束******************/
}
}
}//end
/*******************************************/
//显示卡的状态
/*******************************************/
void show_ic_state(void)
{
if(IC_show_switch==0x55)//IC状态显示打开
{
if(IC_power()) //测试卡是否上电
{
if((money>0)&&(IC_error=0x55)) //为用户卡,但卡非法
{
show_ic_money(); //显示金额
}
else if((money==0)&&(IC_error=0x55)) //为非法卡
{
show_ic_error(); //显示FFFF
}
else if((money>0)&&(IC_error=0xaa)) //合法卡
{
show_ic_money(); //显示金额
}
}
else if((IC_chok==0xaa)&&(IC_test_ok==0)) //无卡且加锁
{
/*************显示0******************/
show_data(5,0);
show_data(6,0);
// Write_VFD_Specificly(12,0x10);//
// Write_VFD_Specificly(13,0x18);//
// Write_VFD_Specificly(14,0x00);//
// Write_VFD_Specificly(15,0x00);//
// Write_VFD_Specificly(16,0x18);//
// Write_VFD_Specificly(17,0x00);//
/*************显示0******************/
}
else if((IC_chok==0x55)&&(IC_test_ok==0))//无卡且解锁
{
/*************无卡的标致开始******************/
Write_VFD_Specificly(12,0x10);//
Write_VFD_Specificly(13,0x18);//
Write_VFD_Specificly(14,0x00);//
Write_VFD_Specificly(15,0x00);//
Write_VFD_Specificly(16,0x18);//
Write_VFD_Specificly(17,0x00);//
/*************无卡的标致结束******************/
}
IC_show_switch=0xaa; //显示关,只显示一次
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -