⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scdlldemounit.pas

📁 对带LED显示的非接触IC卡读写器的控制
💻 PAS
📖 第 1 页 / 共 2 页
字号:
     if iRe<>4 then
     Begin Application.MessageBox('读写机上无卡,请放卡......','系统提示-查询卡'
                                  ,MB_OK+MB_ICONWARNING); Exit; end;

     //读卡的物理序列号
     GetMem(pSNR,16);
     iRe:=SC_GetSnr(rHandle,pSNR);
     if iRe <> 0 then
     Begin Application.MessageBox('没有读到序列号......','系统提示-读序列号'
                                  ,MB_OK+MB_ICONWARNING);  Exit; end;
     
     SNRET.Text := String(pSNR);
     SNRET.Update;
     FreeMem(pSNR,16);

end;

procedure TDemoFrm.WriteBtnClick(Sender: TObject);
var
   pSNR:Pchar;
   iMode:integer;
   iSector:integer;
   pKey:Pchar;
   iBlock:integer;
   pData:Pchar;
begin
     WriteBtn.Enabled := False;
     //打开通讯口
     iRe:=InitPort(ComPortCBB.ItemIndex +1,rHandle);
     if iRe <> 0 then
     Begin Application.MessageBox('无法打开串口,可能是以下原因造成的,请检查....'+
                                  #13+#13+'1.计算的串口(COM口)被其他设备占,请先关闭其它程序重试......'+#13+#13+
                                  '2.读写机的通讯电缆没有与计算机连接,请检查......','系统提示-串口操作'
                                  ,MB_OK+MB_ICONWARNING);  WriteBtn.Enabled := True; Exit; end; //打开串口失败,提示后,退出

     //查询读写机上是否有卡,有卡继续下一步操作,无卡退出
     iRe := SC_Request(rHandle); //寻卡
     if iRe<>4 then
     Begin Application.MessageBox('读写机上无卡,请放卡......','系统提示-查询卡'
                                  ,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end;

     //读卡的物理序列号
     GetMem(pSNR,32);
     iRe:=SC_GetSnr(rHandle,pSNR);
     if iRe <> 0 then
     Begin Application.MessageBox('没有读到序列号......','系统提示-读序列号'
                                  ,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end;

     SNRET.Text := String(pSNR);

     //选择卡
     iRe:=SC_SelectSnr(rHandle,pSNR);
     if iRe <> 0 then
     Begin Application.MessageBox('请重新将卡放入感应区,再进行操作......','系统提示-选择卡'
                                  ,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end;

     //核对卡密钥,核对正确后,才可进行读写
     //GetMem(pSNR,64);
     iMode := 60;
     iSector := 0;
     pKey := Pchar('FFFFFFFFFFFF');
     iRe:= SC_Authentication( rHandle,iMode,iSector,pKey);
     if iRe <> 0 then
     Begin Application.MessageBox('核对密钥不正确......','系统提示-选择卡'
                                  ,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end;

     iBlock := 1;
     //pData := Pchar('11223344556677889900AABBCCDDEEFF');
     pData := Pchar(DataET.Text);
     iRe:= SC_RFWrite( rHandle,iBlock,pData);

     if iRe <> 0 then
     Begin Application.MessageBox('写入数据不正确......','系统提示-选择卡'
                                 ,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end;

     //读卡数据 进行 数据核对
     GetMem(pData,64);
     iBlock := 1;
     iRe:= SC_RFRead(rHandle, iBlock, pData);
     if String(pData) = DataET.Text  then
     Begin
          Application.MessageBox('写卡完成','系统提示-写卡',MB_OK+MB_ICONWARNING);
     end else Begin
          Application.MessageBox('数据核对不正确......','系统提示-数据核对',MB_OK+MB_ICONWARNING);
     end;

     FreeMem(pData,64);
     FreeMem(pSNR,32);
     WriteBtn.Enabled := True;
     WriteBtn.SetFocus;

     iRe:=ClosePort(rHandle);
end;

procedure TDemoFrm.ReadBtnClick(Sender: TObject);
Var
   pSNR:Pchar;
   iMode:integer;
   iSector:integer;
   pKey:Pchar;
   iBlock:integer;
   pData:Pchar;
begin
     ReadBtn.Enabled := False;
     //打开通讯口
     iRe:=InitPort(ComPortCBB.ItemIndex +1,rHandle);
     if iRe <> 0 then
     Begin Application.MessageBox('无法打开串口,可能是以下原因造成的,请检查....'+
                                  #13+#13+'1.计算的串口(COM口)被其他设备占,请先关闭其它程序重试......'+#13+#13+
                                  '2.读写机的通讯电缆没有与计算机连接,请检查......','系统提示-串口操作'
                                  ,MB_OK+MB_ICONWARNING); ReadBtn.Enabled := True;  Exit; end; //打开串口失败,提示后,退出

     //查询读写机上是否有卡,有卡继续下一步操作,无卡退出
     iRe := SC_Request(rHandle); //寻卡
     //Memo1.Lines.Add( IntToStr(iRe) );
     if iRe<>4 then
     Begin Application.MessageBox('读写机上无卡,请放卡......','系统提示-查询卡'
                                  ,MB_OK+MB_ICONWARNING); ReadBtn.Enabled := True; Exit; end;

     //读卡的物理序列号
     GetMem(pSNR,32);
     iRe:=SC_GetSnr(rHandle,pSNR);
     SNRET.Text := String(pSNR);
     SNRET.Update;
     //选择卡
     iRe:=SC_SelectSnr(rHandle,pSNR);
     if iRe <> 0 then
     Begin Application.MessageBox('请重新将卡放入感应区,再进行操作......','系统提示-选择卡'
                                  ,MB_OK+MB_ICONWARNING);ReadBtn.Enabled := True; Exit; end;

     //核对卡密钥,核对正确后,才可进行读写
     //GetMem(pSNR,64);
     iMode := 60;
     iSector := 0;
     pKey := Pchar('FFFFFFFFFFFF');
     iRe:= SC_Authentication( rHandle,iMode,iSector,pKey);
     if iRe <> 0 then
     Begin Application.MessageBox('核对密钥不正确......','系统提示-选择卡'
                                  ,MB_OK+MB_ICONWARNING); ReadBtn.Enabled := True; Exit; end;

     //读卡数据
     GetMem(pData,64);
     iBlock := 1;
     iRe:= SC_RFRead(rHandle, iBlock, pData);
     DataET.Clear;
     sleep(1);
     DataET.Text := String(pData);
     FreeMem(pData,64);
     FreeMem(pSNR,32);
     iRe:=ClosePort(rHandle);
     ReadBtn.Enabled := True;
end;

procedure TDemoFrm.Timer1Timer(Sender: TObject);
Var
     pData:Pchar;
     idot :integer;
begin
     DSPDataET.Text :=  Format('%-.8d',[StrToInt(DspDataET.Text)+1]);
     pData:= Pchar(DSPDataET.Text );
     idot := StrToInt(dotEt.Text);
     iRe:= SC_LEDDSP( rHandle,pData,idot);

end;

procedure TDemoFrm.Button14Click(Sender: TObject);
begin
    DspDataET.Text := '00000001';
    Timer1.Enabled := True;
end;

procedure TDemoFrm.Button15Click(Sender: TObject);
begin
     iRe := SC_Beep(rHandle,0,StrToInt(Edit2.Text));
     sleep(100);
     iRe := SC_Beep(rHandle,0,StrToInt(Edit2.Text));

end;

procedure TDemoFrm.Button16Click(Sender: TObject);
begin

     iRe := SC_Beep(rHandle,0,25);
     sleep(1000); //延时的时间要大于,SC_Beep 的时间,否则会造成只蜂鸣一声
     iRe := SC_Beep(rHandle,0,25);

end;

procedure TDemoFrm.Button17Click(Sender: TObject);
var
   pSNR:Pchar;
   iMode:integer;
   iSector:integer;
   pKey:Pchar;
   iBlock:integer;
   pData:Pchar;
   sKeyData:String;
begin
    //-------------密钥修改流程-------------------------------------------------
    //Mifare One 卡为16个扇区,每个扇区共4块,其中最后一个为密钥块。
    //
    //         000000000000  FF078069 FFFFFFFFFFFF
    //密钥块由     KeyA        控制字       KeyB     构成,KeyA和KeyB各12位
    // 密钥的修改流程:
    //                 1.先核对扇区密钥,正确后进行下步操作
    //                 2.读出扇区整块数据,正确后进行下步操作
    //                 3将前12位替换成新密钥,后面的数据无需改动,
    //                  在写回密钥块,写入则正确密钥修改成功
    //----------------------------------------------------------------------
    

     //核对卡密钥 
     iMode := 60;
     iSector := StrToInt(SectorCBB.Text);
     pKey := Pchar( KeyCBB.Text );
     iRe:= SC_Authentication( rHandle,iMode,iSector,pKey);
     if iRe <> 0 then
     Begin Application.MessageBox('核对密钥不正确......','系统提示-选择卡'
                                  ,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end;

     //读卡密钥块的
     GetMem(pData,64);
     iBlock := StrToInt(SectorCBB.Text)*4+3 ; //得出扇区的密码块
     iRe:= SC_RFRead(rHandle, iBlock, pData);
     sKeyData := String(pData);
     Memo1.Lines.Add(sKeyData);

     sKeyData := Trim(NewKeyCBB.Text) +Copy(sKeyData,13,20);//将原来前12位密钥替换为新的12位密钥,后面的数据不变

     iBlock := StrToInt(SectorCBB.Text)*4+3 ; //得出扇区的密码块
     pData := Pchar(sKeyData);
     iRe:= SC_RFWrite( rHandle,iBlock,pData);

     if iRe <> 0 then
     Begin Application.MessageBox('写入数据不正确......','系统提示-选择卡'
                                 ,MB_OK+MB_ICONWARNING); WriteBtn.Enabled := True; Exit; end;

     //读卡数据 进行 数据核对
     GetMem(pData,64);
     //iBlock := 1;
     iBlock := StrToInt(SectorCBB.Text)*4+3 ; //得出扇区的密码块
     iRe:= SC_RFRead(rHandle, iBlock, pData);
     Memo1.Lines.Add(String(pData));

     if iRe = 0 then
     Begin
          Application.MessageBox('更改密钥成功!        ','系统提示-写卡',MB_OK+MB_ICONWARNING);
     end else Begin
          Application.MessageBox('数据核对不正确......','系统提示-数据核对',MB_OK+MB_ICONWARNING);
     end;

     FreeMem(pData,64);
     FreeMem(pSNR,32);

end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -