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

📄 main0.c

📁 mifarea卡程序mifarea卡程序mifarea卡程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/*Fstk.C*//*Fstk's C file*/
/* last update: 2005-04-30 */
#include<v51rx2.h>
#include<reg52.h>
#include<string.h>
#include<stimer.h>
#include<uart.h>
#include<icc.h>
#include<icccmd.h>
#include<command.h>
#include<comm.h>
#include<ascii.h>
#include<posutils.h>
#include<mfrc500.h>
//#include<sst89x5xxRD2.h>
//#include<des.h>
#include"wdt.h"
#include"rx2flash.h"

//#define DEBUGMAIN
static unsigned char code ver[] = "HD: 1.0, SF: 2.3.e564, update: 2007-03-15";
static unsigned char code sysinfo[] = "Icc Reader, Designed by Liu lixun";
static unsigned char code pcbinfo[] = "ECG/LT 7.827.155A(MAIN) ECG/LT 7.827.156(ANTENNA)";

// 按照8086的格式(低位在前,高位在后)进行转换
long buftolong86(char *buf);
void longtobuf86(long val, char *buf);

// 按照8051的格式(高位在前,低位在后)进行转换
long buftolong51(char *buf);
void longtobuf51(long val, char *buf);

// 探测射频卡
bit rfcardtest(char *snr);

// build APDU cmd pack
bit BuildAPDU(unsigned char *buf, unsigned char len, ICCCMD *cmd);

// test if to enter isp
// uchar xdata fisp[4];
static unsigned int RfConfirmTime = 500;

void main(void)
{
    unsigned char i;
    unsigned int len;           // 通讯报文长度
    unsigned char buf[316];     // 通讯、操作用临时数据缓冲
    unsigned int rsplen;
    
    // var for smartcard
    ICCCMD icccmd;              // SAM卡命令结构
    ICCRSP iccrsp;              // SAM卡命令响应的结构
    unsigned char lastsam;      // last sam icc
    
    unsigned char termsn[6];    // term number for hefei cmb
    unsigned char terminf[8];   // term info for hefei cmb

    // var for m1 card
    unsigned char m1sector;     // m1卡命令针对的扇区
    unsigned char m1block;      // m1卡命令针对的块号
    long epvalue;
    long oldepvalue;
    unsigned char snr[4];
    unsigned char oldsnr[4];
    bit fkeypassed = 0;
    uchar epstatus = 0x03;
    
    unsigned char m1keys[16][6];      // save 16 keys max
    unsigned char m1keystatus[16];    // sector id and a/b flag
    unsigned char m1keycnt = 0;
    unsigned char m1keyidx = 0xff;
    unsigned char code m1keycntmax = 16;

    // var for mcu
    unsigned char mode = BEEP_ON_CARD_INOUT | NOTIFY_ON_CARD_INOUT;
    bit cardin = 0;
    bit rfcardin = 0;
    unsigned int starttime = 0;
    unsigned int rfrstms = 0;
    unsigned char rfrstmin = 0;
    bit fwaitcmd = 0;
    unsigned int waitcmdtime = 0;
    unsigned int resendtime = 0;

    InitTimer(1843200);
    ComOpen(1843200, 9600);
    ComSetTimeOut(500, 500);
    IccInit(248);
    IccSetTimeout(1200);

    #ifdef BUZZEROUT
    buzzer(0, 50);
    #endif
    #ifdef LED
    led(50);
    #endif
    
    if(MI_OK == M500PcdInit())
        mode |= AUTO_SEARCH_RFCARD | OFTEN_RESET_RF_IC;
    else if(MI_OK == M500PcdInit())     // try again
        mode |= AUTO_SEARCH_RFCARD | OFTEN_RESET_RF_IC;
        
    M500PcdMfOutSelect(2);
    lastsam = 0xff;
    
    #ifdef WATCHDOG
    EnableWDT(255-15);
    #endif
    
    ////////////////////// debug
    //IccOpen(0, buf);
    //memcpy(buf, "\xaa\x55\xa5\x5a", 4);
    //IccWrite(buf, 4);

    while(1)
    {
        // timeout(30 seconds) no communication, eject card
        //if(cardin || rfcardin)
        //    if(GetTickCount() - starttime >= 30000)
        //    {
                //IccUserEject();
        //        starttime = GetTickCount();
        //    }
        //IccWrite("aa", 2);
        
        #ifdef WATCHDOG
        ResetWDT();
        #endif
        
        // reset rfic(rc500) once an hour when idle
        if(mode & OFTEN_RESET_RF_IC)
        {
            if(!rfcardin)
            {
                if(GetTickCount() - rfrstms >= 60000)
                {
                    rfrstms = GetTickCount();
                    rfrstmin ++;
                    if(rfrstmin >= 10)
                    {
                        rfrstmin = 0;
                        M500PcdInit();
                    }
                }
            }
        }
        
        // if to resend message to host
        // if the host do not send command to me some time 
        // after I send message to host, I should change the
        // status to no card and eject card. 050523
        if((cardin || rfcardin) && fwaitcmd)
        {
            if(GetTickCount() - waitcmdtime >= 10000)   // 050613
            {
                if(cardin)
                    IccUserEject();
                    
                rfcardin = 0;
                cardin = 0;
                fwaitcmd = 0;
                led(50);
            }
            else if(GetTickCount() - resendtime >= 1000)
            {
                resendtime = GetTickCount();
                rfcardin = 0;
                cardin = 0;
                fwaitcmd = 0;
                led(50);
            }
        }

        // 射频卡侦听
        if(mode & AUTO_SEARCH_RFCARD)
        {
            if(rfcardtest(snr))
            {
                if(!rfcardin)
                {
                    rfcardin = 1;
                    starttime = GetTickCount();
                    #ifdef BUZZEROUT
                    if(mode & BEEP_ON_CARD_INOUT)
                        buzzer(0, 20);
                    #endif
                    #ifdef LED
                    if(cardin)
                        led(0xff);
                    else
                        led(10);
                    #endif
                    
                    if(memcmp(snr, oldsnr, 4))  // 不相等
                    {
                        memcpy(oldsnr, snr, 4);
                        m1keycnt = 0;
                    }
    
                    // 通知主机有卡
                    if(mode & NOTIFY_ON_CARD_INOUT)
                    {
                        buf[0] = HASCARD;
                        buf[1] = cardin;
                        buf[2] = rfcardin;
        
                        #if 1
                        CommSendNotWaitAck(buf, 3);
                        waitcmdtime = GetTickCount();
                        resendtime = waitcmdtime;
                        fwaitcmd = 1;
                        #else
                        if(!CommSend(buf, 3))
                        {
                            rfcardin = 0;
                            #ifdef LED
                            if(cardin)
                                led(20);
                            else
                                led(50);
                            #endif
                        }
                        #endif
                    }
                }
                rfrstmin = 0;       // 050511 disable reset rc500
            }
            else
            {
                if(rfcardin)
                {
                    rfcardin = 0;
                    #ifdef BUZZEROUT
                    if(mode & BEEP_ON_CARD_INOUT)
                        buzzer(0, 20);
                    #endif
                    #ifdef LED
                    if(cardin)
                        led(20);
                    else
                        led(50);
                    #endif
                    if(mode & NOTIFY_ON_CARD_INOUT)
                    {
                        buf[0] = HASCARD;
                        buf[1] = cardin;
                        buf[2] = rfcardin;
                        
                        #if 1
                        CommSendNotWaitAck(buf, 3); /////////////////////////////////////
                        #else
                        CommSend(buf, 3);
                        #endif
                    }
                    
                    // reset rf chip
                    if(mode & OFTEN_RESET_RF_IC)
                    {
                        M500PcdInit();
                        rfrstmin = 0;       // restart timer of reset rf ic
                    }
                }
            }
        }

        // 行程开关测试
        if(IccUserTest())
        {
            if(!cardin)
            {
                cardin = 1;
                starttime = GetTickCount();
                #ifdef BUZZEROUT
                if(mode & BEEP_ON_CARD_INOUT)
                    buzzer(0, 20);
                #endif
                #ifdef LED
                if(rfcardin)
                    led(0xff);
                else
                    led(20);
                #endif

                // 通知主机有卡
                if(mode & NOTIFY_ON_CARD_INOUT)
                {
                    buf[0] = HASCARD;
                    buf[1] = cardin;
                    buf[2] = rfcardin;
                    
                    #if 1
                    CommSendNotWaitAck(buf, 3);       ///////////////////////////////////////////
                    waitcmdtime = GetTickCount();
                    fwaitcmd = 1;
                    #else
                    if(!CommSend(buf, 3))
                    {
                        cardin = 0;
                        #ifdef LED
                        if(rfcardin)
                            led(10);
                        else
                            led(50);
                        #endif
                        IccUserEject();
                    }
                    #endif
                }
            }
        }
        else
        {
            if(cardin)
            {
                cardin = 0;
                #ifdef BUZZEROUT
                if(mode & BEEP_ON_CARD_INOUT)
                    buzzer(0, 20);
                #endif
                #ifdef LED
                if(rfcardin)
                    led(10);
                else
                    led(50);
                #endif

⌨️ 快捷键说明

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