做一个IC卡的写卡小程序!改写以下的C程序为DELPHI,你就可以得到500分! (300分)

  • 主题发起人 主题发起人 卷起千堆雪tyn
  • 开始时间 开始时间

卷起千堆雪tyn

Unregistered / Unconfirmed
GUEST, unregistred user!
大体要求:
打开一个*.ep文件,将其写入IC卡;
首先判断是否插入IC卡,并口操作,如果是低电平,则有IC卡插入;若是高电平,则一直判断;
然后,先写到IC卡的缓存,每次写256个字节,作为一页,然后写到主存,直到全部写完。
详细内容见以下 : (请发到EMAIL : forevertyn@263.net)
将以下的C改为DELPHI,或者自己做一个写IC卡的DELPHI程序;有问题在线呼叫。

[red]写一个DELPHI程序,包括并口电平的判断,写入缓存,再写入主存!参照以下的C程序。[/red]

IC卡相关 :
命令字 保留位 页地址 字节地址
???缓存器:84H或者87H XXXX XXXXXXXXXXX BF8A-BFA0
主存器 83H或者86H 0000 PA10-PA0 XXXXXXXXX

#include <dos.h>
#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<fcntl.h>
/*int cmd; 命令字
char pad2; 高页面地址,低四位有效
char pad1; 低页面地址,高7位有效
char pad0; 字节地址,
char data 发送数据
选通 cs
自动换行 sck
允许输入 si*/
void s_dat(char data);
void bufiwrite(char pad0,char data); /*一字节数据写入缓存器中*/
/*调bufiwrite()写一页(256字节)到缓存器后,再调bufwrite()写入到主存储器中*/
void bufwrite(char pad2,char pad1);
/*缓存器到主存储器的页写,每页256字节,每写一页pad1加2,pad1进位pad2加1*/
char bufread(char pad2,char pad1,char pad0);
char r_dat();
main(int argc,char **argv)
{ FILE *fp;
char *file="3121.ep";
char tmp,add0=0,add1=0,add2=0;
int i,num;
char j,n;

i=0xc4; /*初始化*/
outportb(0x37a);

/*判断有无ic卡 i=0有,1无*/
i=outportb(0x379);
i=i&amp;0x40;

if(argc!=2)
printf("the excutive is error. file name ep name/n" );
strcpy(file,argv[1]);
printf("argv is %s/n",argv[1]);
printf("file is %s/n",file);
strcpy(file,"this is strcpy");
printf("the strcopy file is %s/n",file);
if((fp=fopen(file,"rb"))==NULL)
{ printf("the file ep does not exist ");
getch();
exit(0);}
num=filelength(fp);
n=num/256;
if(num%256!=0)
n++;
n=30;
for(j=0;j<n;j++)
{ for(i=0;i<256;i++)
{ tmp=getc(fp);
bufiwrite(add0,tmp);
add0++;}
bufwrite(add2,add1);
delay(400);
if(add1==0xfe)
{add1=0;
add2++;}
add1=add1+2;
}
}

void bufwrite(char pad2,char pad1)
{
char tmp;
tmp=inportb(0x37a);
tmp=tmp|0x01;
outportb(0x37a,tmp); /*clr cs*/
tmp=tmp|0x02;
outportb(0x37a,tmp); /*clr sck*/
s_dat(0x86); /*送命令字56h*/
s_dat(pad2);
s_dat(pad1);
s_dat(0);
tmp=tmp&amp;0xfe;
outportb(0x37a,tmp);
tmp=tmp&amp;0xfd;
outportb(0x37a,tmp);
return;
}

char bufread(char pad2,char pad1,char pad0)
{ char tmp,data;
tmp=inportb(0x37a);
tmp=inportb(0x37a);
tmp=tmp|0x01;
outportb(0x37a,tmp); /*clr cs*/
tmp=tmp|0x02;
outportb(0x37a,tmp); /*clr sck*/
s_dat(0x52); /*送命令字56h*/
s_dat(pad2);
s_dat(pad1);
s_dat(pad0);
s_dat(0);
s_dat(0);
s_dat(0);
s_dat(0);
data=r_dat();
tmp=tmp&amp;0xfe;
outportb(0x37a,tmp);
tmp=tmp&amp;0xfd;
outportb(0x37a,tmp);
return(data);
}



void bufiwrite(char pad0,char data)
{
int i;
char tmp;
tmp=inportb(0x37a);
tmp=tmp|0x01;
outportb(0x37a,tmp); /*clr cs*/
tmp=tmp|0x02;
outportb(0x37a,tmp); /*clr sck*/
s_dat(0x87); /*送命令字56h*/
s_dat(0);
s_dat(0);
s_dat(pad0);
s_dat(data);
tmp=tmp&amp;0xfe;
outportb(0x37a,tmp);
tmp=tmp&amp;0xfd;
outportb(0x37a,tmp);
return;
}

void s_dat(char data1)
{ int i;
char tmp=0,tmp1;
for(i=0;i<8;i++)
{ tmp=inportb(0x37a);
tmp=tmp|0x02; /*clr sck*/
outportb(0x37a,tmp);
tmp1=data1&amp;0x80;
if(tmp1) /*si=1*/
{
tmp=tmp&amp;0xf7;
/* outportb(0x37a,tmp);*/
}
else /*si=0*/
{
tmp=tmp|0x08;
/* outportb(0x37a,tmp); */
}
outportb(0x37a,tmp);
tmp=tmp&amp;0xfd;
outportb(0x37a,tmp);
data1=data1<<1;
}
return;
}

char r_dat()
{ int i;
char data,tmp,j;
data=0;
tmp=inportb(0x37a);
for(i=0;i<8;i++)
{ tmp=tmp|0x02; /*clr sck*/
outportb(0x37a,tmp);
tmp=tmp&amp;0xfd;
outportb(0x37a,tmp);
j=inportb(0x379);
j=j&amp;0x20;
if(j)
data=data+1;
data=data<<1;
}
return(data);
}

 
這些在dos下才能直接寫端口的,在windows可用spcomm
 
读写IC卡是很简单的事,我买的读卡器自带了API!你用它的API就可三分钟搞定了!
 
你用的什么读卡器,他不提供API吗?另外你用的什么卡,CPU卡和MEMORY卡不一样,MEMORY卡之间也不一样
如果是在单片机系统里,也应该有读卡器的通讯协议。
如果你想自己做一个读卡器,我劝你算了吧,要想做全累死你
 
卷起千堆雪tyn,你的问太深,我看不懂。不过你能帮忙看看我的关于远程屏幕操作的那个问题吗?先谢了!
 
没接触过IC卡,帮不了你
 
不好调试,没有ic卡机
sorry[:(]
 
我的读卡器和你的接口不同, 可以翻译一下, 但没法调试.
 
{
大体要求:
打开一个*.ep文件,将其写入IC卡;
首先判断是否插入IC卡,并口操作,如果是低电平,则有IC卡插入;若是高电平,则一直判断;
然后,先写到IC卡的缓存,每次写256个字节,作为一页,然后写到主存,直到全部写完。
详细内容见以下 : (请发到EMAIL : forevertyn@263.net)
将以下的C改为DELPHI,或者自己做一个写IC卡的DELPHI程序;有问题在线呼叫。

写一个DELPHI程序,包括并口电平的判断,写入缓存,再写入主存!参照以下的C程序。

IC卡相关 :
命令字 保留位 页地址 字节地址
???缓存器:84H或者87H XXXX XXXXXXXXXXX BF8A-BFA0
主存器 83H或者86H 0000 PA10-PA0 XXXXXXXXX

}

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

procedure outportb(addr : Word; value : Byte);
asm
mov dx, addr
mov al, value
out dx, al
end;

function inportb(addr : Word) : Byte;
asm
mov dx, addr
in al, dx
mov result, al
end;


{
cmd : Word; //命令字
pAd2 : Byte; //高页面地址,低四位有效
PAd1 : Byte; //低页面地址,高7位有效
pAd0 : Byte; //字节地址,
Data : Byte; //发送数据

选通 cs
自动换行 sck
允许输入 si
}

procedure s_dat(data : Byte);//void s_dat(char data);
var
i : Integer;
tmp : Byte;
tmp1 : Byte;
begin
tmp := 0;

for i := 0 to 7 do
begin
tmp := inportb($37a);
tmp := tmp or $02;
outportb($37a, tmp);

tmp1 := data and $80;

if tmp1 <> 0 then
tmp := tmp and $f7
else
tmp := tmp or $08;

outportb($37a, tmp);

tmp := tmp and $fd;
outportb($37a, tmp);
data := data shl 1;
end;
end;

function r_dat() : Byte; //char r_dat();
var
i : Integer;
data : Byte;
tmp,
j : Byte;
begin
tmp := inportb($37a);

for i := 0 to 7 do
begin
tmp := tmp or $02;
outportb($37a, tmp);
tmp := tmp and $FD;
outportb($37a, tmp);
j := inportb($379);
j := j and $20;
if j <> 0 then data := data + 1;
data := data shl 1;
end;

result := data;
end;

//void bufiwrite(char pad0,char data);
procedure bufIWrite(pAd0 : Byte; data : Byte);
var
tmp : Byte;
begin
tmp := inportb($37a);
tmp := tmp or $01;
outportb($37a, tmp);
tmp := tmp or $02;
outportb($37a, tmp);

s_dat($87);
s_dat(0);
s_dat(0);
s_dat(pad0);
s_dat(data);

tmp := tmp and $fe;
outportb($37a, tmp);
tmp := tmp and $fd;
outportb($37a, tmp);
end;

//void bufwrite(char pad2,char pad1);
procedure bufWrite(pAd2, pAd1 : Byte);
var
tmp : Byte;
begin
tmp := inportb($37a);
tmp := tmp and $01;
outportb($37a, tmp);

tmp := tmp or $02;
outportb($37a, tmp);

s_dat($86);
s_dat(pad2);
s_dat(pad1);
s_dat(0);

tmp := tmp and $fe;
outportb($37a, tmp);
tmp := tmp and $fd;
outportb($37a, tmp);
end;

//char bufread(char pad2,char pad1,char pad0);
function bufRead(pAd2, pAd1, pAd0 : Byte) : Byte;
var
tmp : Byte;
begin
tmp := inportb($37a); //????

tmp := inportb($37a);
tmp := tmp or $01;
outportb($37a, tmp);
tmp := tmp or $002;
outportb($37a, tmp);

s_dat($52);
s_dat(pad2);
s_dat(pad1);
s_dat(pad0);
s_dat(0);
s_dat(0);
s_dat(0);
s_dat(0);
result := r_dat();

tmp := tmp and $fe;
outportb($37a, tmp);
tmp := tmp and $fd;
outportb($37a, tmp);
end;

var
hFile : file;
szFileName : string = '3121.ep';
tmp : Byte;
Add0 : Byte = 0;
Add1 : Byte = 0;
Add2 : Byte = 0;

j, nLen : Integer;
i, nBlock : Integer;

begin

{ 这部分代码有问题没有翻译}


tmp := $c4; ///*初始化*/
outportb($37a, tmp);

// /*判断有无ic卡 i=0有,1无*/
tmp := inportb($379);
tmp := tmp and $40;
if tmp=0 then
begin
//有
end
else
begin
//无
end;

if ParamCount <> 2 then Writeln('the excutive is error. file name ep name');
szFileName := ParamStr(1);

AssignFile(hFile, szFileName);
{$I-}
Reset(hFile, 1);
{$I+}
if IOResult = 0 then
begin
nLen := FileSize(hFile);
nBlock := nLen div 256;

if (nLen mod 256) <> 0 then Inc(nBlock);
// n=30; ????

for i := 0 to nBlock-1 do
begin
for j := 1 to 256 do
begin
BlockRead(hFile, tmp, 1);
bufiwrite(add0 ,tmp);
Inc(add0);
end;

bufWrite(add2, add1);
Sleep(400);

if add1 = $fe then
begin
add1 := 0;
Inc(add2);
end;

add1 := add1 + 2;
end;
end
else
begin
Writeln(Format('the file %s does not exist.', [szFileName]));
end

end.
 
to;卷起千堆雪tyn,我也正在做ic卡,使用深圳明华,驱动很全的阿,没有你这么复杂阿?
http://www.delphibbs.com/delphibbs/dispq.asp?lid=717921
多交流!
 
后退
顶部