USB接口IC读写器oem软件_AB密码完整解决方案/读写卡测试程序及源代码/c++builder源代码(2)

本文介绍使用OUR_MIFARE动态库进行Mifare卡的操作,包括读卡、写卡、修改密码等功能,并展示了如何加载动态库及调用相关函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

界面图

 

 

 

 

详细代码如下:

 

 

 

 

//---------------------------------------------------------------------------

//广州荣士电子有限公司,联系电话020-82318861,82322852,定制13826029618 网址http://www.icmcu.com


#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

//控制字定义
#define BLOCK0_EN  0x01
#define BLOCK1_EN  0x02
#define BLOCK2_EN  0x04
#define NEEDSERIAL 0x08
#define EXTERNKEY  0x10
#define NEEDHALT   0x20


//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
//轻松读卡
{
/*
技术支持:
网站:
*/

        unsigned char status;//存放返回值
        unsigned char myareano;//区号
        unsigned char authmode;//密码类型,用A密码或B密码
        unsigned char myctrlword;//控制字
 unsigned char mypicckey[6];//密码
        unsigned char mypiccserial[4];//卡序列号
        unsigned char mypiccdata[48]; //卡数据缓冲

        unsigned char (__stdcall *piccreadex)(unsigned char ctrlword,unsigned char *serial,unsigned char area,unsigned char keyA1B0,unsigned char *picckey,unsigned char *piccdata0_2);
        //判断动态库是否存在
        AnsiString FileName=ExtractFilePath(Application->ExeName);
        if(FileName.SubString(FileName.Length(),1) != "//")
        {
             FileName += "//";
        }
        FileName += "OUR_MIFARE.dll";
        if(!FileExists(FileName))
        {
                ShowMessage("无法在应用程序的文件夹找到OUR_MIFARE.dll");
                return;
        }
        //提取函数
        HINSTANCE hDll;
        hDll=LoadLibrary(FileName.c_str());
        piccreadex = (unsigned char (__stdcall *)(unsigned char,unsigned char *,unsigned char,unsigned char,unsigned char *,unsigned char *))GetProcAddress(hDll,"piccreadex");

        //控制字指定,控制字的含义请查看本公司网站提供的动态库说明
        myctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;

        //指定区号
        myareano = 8;//指定为第8区
        //批定密码模式
        authmode = 1;//大于0表示用A密码认证,推荐用A密码认证

        //指定密码
        mypicckey[0] = 0xff;
        mypicckey[1] = 0xff;
        mypicckey[2] = 0xff;
        mypicckey[3] = 0xff;
        mypicckey[4] = 0xff;
        mypicckey[5] = 0xff;

        status = piccreadex(myctrlword,mypiccserial,myareano,authmode,mypicckey,mypiccdata);

        FreeLibrary(hDll);
       
        //在下面设定断点,然后查看mypiccserial、mypiccdata,
        //调用完 piccreadex函数可读出卡序列号到 mypiccserial,读出卡数据到mypiccdata,
        //开发人员根据自己的需要处理mypiccserial、mypiccdata 中的数据了。
        //处理返回函数
        switch(status)
        {
                case 0:
                        ShowMessage("操作成功");
                        break;
                //......
                case 8:
                        ShowMessage("请将卡放在感应区");
                        break;

 

        }


        //返回解释
        /*
        #define ERR_REQUEST 8//寻卡错误
        #define ERR_READSERIAL 9//读序列吗错误
        #define ERR_SELECTCARD 10//选卡错误
        #define ERR_LOADKEY 11//装载密码错误
        #define ERR_AUTHKEY 12//密码认证错误
        #define ERR_READ 13//读卡错误
        #define ERR_WRITE 14//写卡错误

        #define ERR_NONEDLL 21//没有动态库
        #define ERR_DRIVERORDLL 22//动态库或驱动程序异常
        #define ERR_DRIVERNULL 23//驱动程序错误或尚未安装
        #define ERR_TIMEOUT 24//操作超时,一般是动态库没有反映
        #define ERR_TXSIZE 25//发送字数不够
        #define ERR_TXCRC 26//发送的CRC错
        #define ERR_RXSIZE 27//接收的字数不够
        #define ERR_RXCRC 28//接收的CRC错

 

        */

 


}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)
//让设备发出声音
{
/*
技术支持:
网站:
*/
        unsigned char (__stdcall *pcdbeep)(unsigned long xms);
        //判断动态库是否存在
        AnsiString FileName=ExtractFilePath(Application->ExeName);
        if(FileName.SubString(FileName.Length(),1) != "//")
        {
             FileName += "//";
        }
        FileName += "OUR_MIFARE.dll";
        if(!FileExists(FileName))
        {
                ShowMessage("无法在应用程序的文件夹找到OUR_MIFARE.dll");
                return;
        }

        //提取函数
        HINSTANCE hDll;
        hDll=LoadLibrary(FileName.c_str());
        pcdbeep = (unsigned char (__stdcall *)(unsigned long))GetProcAddress(hDll,"pcdbeep");
        pcdbeep(50);
        FreeLibrary(hDll);


}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
//轻松写卡
{
/*
技术支持:
网站:
*/
        int i;
        unsigned char status;//存放返回值
        unsigned char myareano;//区号
        unsigned char authmode;//密码类型,用A密码或B密码
        unsigned char myctrlword;//控制字
 unsigned char mypicckey[6];//密码
        unsigned char mypiccserial[4];//卡序列号
        unsigned char mypiccdata[48]; //卡数据缓冲

        unsigned char (__stdcall *piccwriteex)(unsigned char ctrlword,unsigned char *serial,unsigned char area,unsigned char keyA1B0,unsigned char *picckey,unsigned char *piccdata0_2);
        //判断动态库是否存在
        AnsiString FileName=ExtractFilePath(Application->ExeName);
        if(FileName.SubString(FileName.Length(),1) != "//")
        {
             FileName += "//";
        }
        FileName += "OUR_MIFARE.dll";
        if(!FileExists(FileName))
        {
                ShowMessage("无法在应用程序的文件夹找到OUR_MIFARE.dll");
                return;
        }
        //提取函数
        HINSTANCE hDll;
        hDll=LoadLibrary(FileName.c_str());
        piccwriteex = (unsigned char (__stdcall *)(unsigned char,unsigned char *,unsigned char,unsigned char,unsigned char *,unsigned char *))GetProcAddress(hDll,"piccwriteex");
        //控制字指定,控制字的含义请查看本公司网站提供的动态库说明
        myctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;

        //指定区号
        myareano = 8;//指定为第8区
        //批定密码模式
        authmode = 1;//大于0表示用A密码认证,推荐用A密码认证

        //指定密码
        mypicckey[0] = 0xff;
        mypicckey[1] = 0xff;
        mypicckey[2] = 0xff;
        mypicckey[3] = 0xff;
        mypicckey[4] = 0xff;
        mypicckey[5] = 0xff;

        //指定卡数据
        for(i = 0;i<48;i++)
        {
                mypiccdata[i] = i;
        }
        //写卡
        status = piccwriteex(myctrlword,mypiccserial,myareano,authmode,mypicckey,mypiccdata);

        FreeLibrary(hDll);
        //在下面设定断点,然后查看mypiccserial、mypiccdata,
        //调用完 piccreadex函数可读出卡序列号到 mypiccserial,读出卡数据到mypiccdata,
        //开发人员根据自己的需要处理mypiccserial、mypiccdata 中的数据了。
        //处理返回函数
        switch(status)
        {
                case 0:
                        ShowMessage("操作成功");
                        break;
                //......
                case 8:
                        ShowMessage("请将卡放在感应区");
                        break;


        }


        //返回解释
        /*
        #define ERR_REQUEST 8//寻卡错误
        #define ERR_READSERIAL 9//读序列吗错误
        #define ERR_SELECTCARD 10//选卡错误
        #define ERR_LOADKEY 11//装载密码错误
        #define ERR_AUTHKEY 12//密码认证错误
        #define ERR_READ 13//读卡错误
        #define ERR_WRITE 14//写卡错误

        #define ERR_NONEDLL 21//没有动态库
        #define ERR_DRIVERORDLL 22//动态库或驱动程序异常
        #define ERR_DRIVERNULL 23//驱动程序错误或尚未安装
        #define ERR_TIMEOUT 24//操作超时,一般是动态库没有反映
        #define ERR_TXSIZE 25//发送字数不够
        #define ERR_TXCRC 26//发送的CRC错
        #define ERR_RXSIZE 27//接收的字数不够
        #define ERR_RXCRC 28//接收的CRC错
        */

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
//修改单区密码,只改A或B密码,不能改密码权限访问字,且一次只能改A或B密码中的一个。
{

/*
技术支持:
网站:
*/

        unsigned char status;//存放返回值
        unsigned char myareano;//区号
        unsigned char authmode;//密码类型,用A密码或B密码
        unsigned char myctrlword;//控制字

 unsigned char mypiccnewkey[6];//新密码
        unsigned char mypiccserial[4];//卡序列号
        unsigned char mypiccoldkey[6];//旧密码

        unsigned char (__stdcall *piccchangesinglekey)(unsigned char ctrlword,unsigned char *serial,unsigned char area,unsigned char keyA1B0,unsigned char *piccoldkey,unsigned char *piccnewkey);
        //判断动态库是否存在
        AnsiString FileName=ExtractFilePath(Application->ExeName);
        if(FileName.SubString(FileName.Length(),1) != "//")
        {
             FileName += "//";
        }
        FileName += "OUR_MIFARE.dll";
        if(!FileExists(FileName))
        {
                ShowMessage("无法在应用程序的文件夹找到OUR_MIFARE.dll");
                return;
        }

        //提取函数
        HINSTANCE hDll;
        hDll=LoadLibrary(FileName.c_str());
        piccchangesinglekey = (unsigned char (__stdcall *)(unsigned char ,unsigned char *,unsigned char ,unsigned char ,unsigned char *,unsigned char *))GetProcAddress(hDll,"piccchangesinglekey");

        //控制字指定,控制字的含义请查看本公司网站提供的动态库说明
        myctrlword = 0;

        //指定区号
        myareano = 8;//指定为第8区
        //批定密码模式
        authmode = 1;//大于0表示用A密码认证,推荐用A密码认证

        //指定旧密码
        mypiccoldkey[0] = 0xff;
        mypiccoldkey[1] = 0xff;
        mypiccoldkey[2] = 0xff;
        mypiccoldkey[3] = 0xff;
        mypiccoldkey[4] = 0xff;
        mypiccoldkey[5] = 0xff;

        //指定新密码,注意:指定新密码时一定要记住,否则有可能找不回密码,导致该卡报废。
        mypiccnewkey[0] = 0xff;
        mypiccnewkey[1] = 0xff;
        mypiccnewkey[2] = 0xff;
        mypiccnewkey[3] = 0xff;
        mypiccnewkey[4] = 0xff;
        mypiccnewkey[5] = 0xff;

        status = piccchangesinglekey(myctrlword,mypiccserial,myareano,authmode,mypiccoldkey,mypiccnewkey);

        FreeLibrary(hDll);
        //返回值处理
        switch(status)
        {
                case 0:
                        ShowMessage("操作成功");
                        break;
                //......
                case 8:
                        ShowMessage("请将卡放在感应区");
                        break;

        }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)
//读取设备编号,可做为软件加密狗用,也可以根据此编号在公司网站上查询保修期限
{
/*
技术支持:
网站:
*/

        unsigned char devno[4];//设备编号
        unsigned char (__stdcall *pcdgetdevicenumber)(unsigned char *devicenumber);
        //判断动态库是否存在
        AnsiString FileName=ExtractFilePath(Application->ExeName);
        if(FileName.SubString(FileName.Length(),1) != "//")
        {
             FileName += "//";
        }
        FileName += "OUR_MIFARE.dll";
        if(!FileExists(FileName))
        {
                ShowMessage("无法在应用程序的文件夹找到OUR_MIFARE.dll");
                return;
        }

        //提取函数
        HINSTANCE hDll;
        hDll=LoadLibrary(FileName.c_str());
        pcdgetdevicenumber = (unsigned char (__stdcall *)(unsigned char *))GetProcAddress(hDll,"pcdgetdevicenumber");


        if(!pcdgetdevicenumber(devno))
        {
                FreeLibrary(hDll);
                ShowMessage(IntToStr(devno[0]) + "-" + IntToStr(devno[1]) + "-" + IntToStr(devno[2]) + "-" + IntToStr(devno[3]));
        }
        else
        {
                FreeLibrary(hDll);
        }

}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button6Click(TObject *Sender)
{//修改单区密码,可同时改A、B密码、密码权限访问字


        unsigned char status;//存放返回值
        unsigned char myareano;//区号
        unsigned char authmode;//密码类型,用A密码或B密码
        unsigned char myctrlword;//控制字
 unsigned char mypiccoldkey[6];//旧密码
        unsigned char mypiccserial[4];//卡序列号
        unsigned char mypiccdata[17]; //其中新A密码6个字节;密码权限访问字4个字节;新B密码6个字节;指定更改项目的标志为1个字节,
                                      //这个字节为3是表示同时更改A、B、 密码权限访问字,为2表示密码权限访问字不更改,只改A、B密码,为0表示只改A密码

        unsigned char (__stdcall *piccchangesinglekeyex)(unsigned char ctrlword,unsigned char *serial,unsigned char area,unsigned char keyA1B0,unsigned char *piccoldkey,unsigned char *piccnewkey);

        AnsiString FileName=ExtractFilePath(Application->ExeName);
        if(FileName.SubString(FileName.Length(),1) != "//")
        {
             FileName += "//";
        }
        FileName += "OUR_MIFARE.dll";
        if(!FileExists(FileName))
        {
                ShowMessage("无法在应用程序的文件夹找到OUR_MIFARE.dll");
                return;
        }

        HINSTANCE hDll;
        hDll=LoadLibrary(FileName.c_str());
        piccchangesinglekeyex = (unsigned char (__stdcall *)(unsigned char ,unsigned char *,unsigned char ,unsigned char ,unsigned char *,unsigned char *))GetProcAddress(hDll,"piccchangesinglekeyex");

        myctrlword =EXTERNKEY;//用函数中输入的密码认证
        myareano = 8;//改第8区的密码
        authmode = 0xaa;//用A密码认证

        //旧密码
        mypiccoldkey[0] = 0xff;
        mypiccoldkey[1] = 0xff;
        mypiccoldkey[2] = 0xff;
        mypiccoldkey[3] = 0xff;
        mypiccoldkey[4] = 0xff;
        mypiccoldkey[5] = 0xff;

        //新A密码
        mypiccdata[0] = 0xff;
        mypiccdata[1] = 0xff;
        mypiccdata[2] = 0xff;
        mypiccdata[3] = 0xff;
        mypiccdata[4] = 0xff;
        mypiccdata[5] = 0xff;

        //密码权限访问字,出厂卡为 FF 07 80 69
        mypiccdata[6] = 0xff;
        mypiccdata[7] = 0x07;
        mypiccdata[8] = 0x80;
        mypiccdata[9] = 0x69;

        //新B密码
        mypiccdata[10] = 0xff;
        mypiccdata[11] = 0xff;
        mypiccdata[12] = 0xff;
        mypiccdata[13] = 0xff;
        mypiccdata[14] = 0xff;
        mypiccdata[15] = 0xff;

        //指定更改项目的标志
        mypiccdata[16] = 0x2;//只改A密码和B密码,暂时不改密码权限访问字

        status = piccchangesinglekeyex(myctrlword,mypiccserial,myareano,authmode,mypiccoldkey,mypiccdata);
        FreeLibrary(hDll);
        switch(status)
        {
                case 0:
                        ShowMessage("操作成功");
                        break;
                //......
                case 8:
                        ShowMessage("请将卡放在感应区");
                        break;

                case 30:
                        ShowMessage("密码权限访问字错误");
                        break;
        }

}
//---------------------------------------------------------------------------

 

 

 

 

 

RFID读模块原理图是ORCAD的,有PDF预览,PCB是PADS的,还有BOM烧写说明,标注图等。其中UART输出是量产过的 韦根输出的只是看示波器波形是对的,没有实际应用;里面有源代码,编写前提是是CODE小于1K RAM小于64字节。 原理图原理就是CD4060产生125KHZ的方波,经过推挽电路进行功率放大,高频电流进入LC串联谐振电路,345uH和4.7NF的谐振频率正好是125KHZ,这时电容两端电压会到十几伏,如果用CBB电容,会到二十多伏,这时读距离会到10CM以上。当有接近线圈时,线圈两端会有曼彻斯特编码的调幅波。通过二极管以及电容的检波和滤波,产生的小信号送入LM358进行放大和整形,变成单片机可以读取的曼彻斯特编码信号。 关于硬件电路设计上,CD4060在3.3V时 4M以下的晶振都可以起振,但2M的晶振体积很大,所以用了4M。实验发现ATTINY13的频率随着工作电压的变化会有很大的变化,所以不能用RC校准了,正好CD4060会输出4M,所以用来当系统时钟,保证时序的精确性。这样模块在3.3V 5V都能工作。 ATTINY13接不了无缘晶振 只能接有源的~ 它只有一个CLKIN脚~有源晶振价格就贵了。 另外ATTINY13只有5个IO口 1个用于中断 1个用于UART输出 1个用于CLKIN 1个用于上电波特率配置 1个用于曼彻斯特编码输入 正好用完了 RFID读模块 模块正反面 串口收到5个字节 前4个字节就是号 程序中,根据曼彻斯特原理,找到长电平和短电平,根据跳变沿分析出0数据还是1数据。然后寻找消息头,后面的数据进行 行 列奇偶校验,从而分析出号。 程序上电时,通过ADC引脚读取外部电阻的分压配置,从而初始化出4中波特率。然后进行读操作。实际应用中,要保证读的稳定,当靠近线圈时,要只发一次数据。要很好的去抖。代码不能超过1K。现在代码正好1024个字节。关于奇偶校验算法,异或和要比对2取余简洁,但我测试时发现异或和代码长度大于对2取余,所以用了对2取余。 RFID读模块原理图+PCB+代码+调试至附件下载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值