📄 icc2.c
字号:
/*------------------------ 例程1:通用IC卡读写程序 -------------------------*/
/*说明:该例程的功能是对多种IC卡(包括SIM4418/28、SIM4432/42、ATMEL16K卡)进行 读、写以及比较密码的操作*/
#include "HNCC.H"
xdata unsigned char m,n,co;
void ver(xdata char);
char iver(xdata char a,xdata char b);
void main(void)
{
xdata char ktype;
xdata char x=1,y=1,a,b,c,d,k,kn,i=0,k1,k2,l;
xdata char p[4],e[20],sys[3],v[10];
xdata char o[256];
/*清屏并显示首屏菜单*/
cls();
moveto(2,1);putstr("手持式IC卡读写器\n 读写卡程序V1.0");
moveto(8,1);putstr("1.SIM4418/4428卡\n2.SIM4432/4442卡\n3.ATMEL 16k卡");
/*等待按键,直到按下[1]、[2]、[3]其中一键,键值放变量ktype中*/
do{
ktype=key(0);
}while((ktype!='1')&&(ktype!='2')&&(ktype!='3'));
/*根据ktype的值设置卡类型并显示该类型*/
do{
cls();
moveto(1,1);putstr("卡类型:");
moveto(3,1);
switch(ktype){
case '1':
putstr("西门子4418/28");
cardtype(SIM441828);
break;
case '2':
putstr("西门子4432/42");
cardtype(SIM443242);
break;
case '3':
putstr("ATMEL 16K");
cardtype(ATMEL16K);
break;
}
moveto(6,1);
putstr("请选择:\n[1].读卡\n[2].写卡\n[3].比较密码\n[Enter].退出");
k=key(0);
/*按[1]键进行读卡操作*/
if(k=='1')
{
cls();
moveto(1,1);putstr("请输入页号:");
moveto(7,1);
if(ktype=='1')
putstr("4418/28卡(0--3)");
else if(ktype=='2')
putstr("4432/42卡(0)");
else if(ktype=='3')
putstr("atm 16k卡(0--7)");
do{
moveto(2,13);
k=key(1);
}while((k<'0')||(k>'7'));
cls();
moveto(3,5);putstr("请插卡!");
while(cardtest()); /*等待直到卡插入卡头*/
delay(5);
poweron();
cls();
moveto(3,3);putstr("正在读卡...");
l=k-0x30;
cardread(l,0,256,o); /*从卡上l页地址00H开始读256个字节数据到串o中*/
/*将读到串o中的256字节数据显示出来,并处理翻屏*/
i=0;
do{
cls();
for(b=0;b<16;b++)
{
ver(i);
moveto(x,y);
putch(m);putch(n);putch('H');
y+=4;
for(a=0;a<4;a++)
{
moveto(x,y);
ver(o[i]);
putch(' ');putch(m);putch(n);
i++;
y+=3;
}
x++;y=1;
}
do{
k=key(0);
}while((k!=0x8e)&&(k!=0x8f)&&(k!=0x8d));
if(k==0x8e)
i-=0x80;
x=1;y=1;
}while(k!=0x8d);
}
/*按下[2]键进行写卡操作*/
else if(k=='2')
{
if(cardtest()) co=0;
/*只有密码比较正确或卡型为ATEML16K卡才能写卡*/
if((co=='k')||(ktype=='3'))
{
cls();
moveto(1,1);putstr("请输入:");
moveto(4,1);putstr("页号(0---7):");
moveto(7,1);putstr("地址(00-FF):");
do{
moveto(5,14);putch('_');
moveto(5,14);
k=key(1);
}while((k<'0')||(k>'7'));
do{
moveto(8,14);putch('_');
moveto(8,14);
k1=key(1);
}while((k1<'0')||(k1>'Z'));
do{
moveto(8,15);putch('_');
moveto(8,15);
k2=key(1);
}while((k2<'0')||(k2>'Z'));
cls();
l=iver(k1,k2);
cardread(k-0x30,l,10,e);
i=iver(k1,k2);
for(a=0;a<10;a++)
{
moveto(a+1,2);
ver(i+a);
putch(m);putch(n);putch('H');putch(' ');
ver(e[a]);
putch(m);putch(n);putch(' ');
}
for(a=0;a<10;a++)
{
do{
moveto(a+1,10);putch('_');moveto(a+1,10);
k1=key(1);
if(k1==0x8d) break;
}while((k1<'0')||(k1>'Z'));
if(k1==0x8d) break;
do{
moveto(a+1,11);putch('_');moveto(a+1,11);
k2=key(1);
}while((k2<'0')||(k2>'Z'));
e[a]=iver(k1,k2);
}
cardwrit(k-0x30,i,10,e);
cls();
moveto(3,3);
putstr("完成写卡操作!");
}
else
{
cls();
moveto(6,4);putstr("未比较密码!");
bell(10);
}
key(0);
}
/*按下[3]键时进行密码比较操作*/
else if(k=='3')
{
cls();
moveto(3,5);putstr("请插卡!");
while(cardtest());
poweron();
cls();
moveto(1,1);putstr("请输入密码:");
moveto(4,7);keys(v);
if(ktype=='1')
c=cardcomp(4,v);
else if(ktype=='2')
c=cardcomp(6,v);
else
goto compend;
cls();
moveto(3,5);
if(!c)
{
putstr("密码正确!");
co='k';
}
else
{
putstr("密码错误!");
co=0;
bell(10);
}
compend:
key(0);
}
else if(k==0x8d)
break;
}while(1);
poweroff();
}
/*将一个8位十六进制数转换为两个ASCII码,放入m,n.如:(0x12)-->(0x31,0x32)*/
void ver(xdata char a)
{
char i;
i=a;
a>>=4;
a&=0x0f;
if(a>9) a+=0x7;
a+=0x30;
m=a;
i&=0x0f;
if(i>9) i+=0x7;
i+=0x30;
n=i;
}
/*将两个ASCII码转换为一个8位十六进制数.如:(0x41,0x42)-->(0xAB)*/
char iver(xdata char a,xdata char b)
{
if(a>'9') a-=0x7;
a-=0x30;
a<<=4;
if(b>'9') b-=0x7;
b-=0x30;
return(a+b);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -