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

📄 rc500-1.asm

📁 这是一个真正的RC500读卡程序,稍加修改就可以应用在你的程序之中。
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;-----------------------------------------
;RC500上电后应延时500ms才能可靠初始化
INIT500:
        MOV     JSQ_LOCAL_LOOP,#100        ;定时1S,RC500初始化等待
        CLR     FLAG2
INIT500_01:
        JBC     FLAG2,INIT500_02
        SJMP    INIT500_01
INIT500_02:
        MOV     WDT,#3FH                   
        LCALL   PCD_RESET
        JB      CERR,INIT500_02
        MOV     WDT,#3FH                   
        LCALL   D100MS
        LCALL   PCD_RESET
        JB      CERR,INIT500_02
        SETB    RC500_OK                   ;RC500通过测试
        RET
;---------------------------------------------------
;寻卡

FINDCARD:
        CLR   FFC
        JNB    RC500_OK,FINDCARD_RET
        MOV    RF_SBUF,#26H
        LCALL  PCD_REQUEST             ;寻卡
        JNB    CERR,FINDCARD_01
        MOV    RF_SBUF,#26H
        LCALL  PCD_REQUEST             ;寻卡
        JB     CERR,FINDCARD_RET
FINDCARD_01:
        LCALL  ENALE

        LCALL  PCD_ANTICOLLISION       ;防冲撞
        JB     CERR,FINDCARD_RET
        MOV    R0,#RF_SBUF             ;保存CSN
        MOV    R1,#RFCSN               ;
        MOV    R2,#4                   ;
        LCALL  MEM_COPYA               ;
        LCALL  PCD_SELECT              ;锁定卡
        JB     CERR,FINDCARD_RET
        MOV    R0,#RF_SBUF
        MOV    @R0,#91H
        INC    R0
        MOV    @R0,#00H
        LCALL  LOADKEYEE
        JB     CERR,FINDCARD_RET
        MOV    RF_SBUF,#60H            ;取验证方式 A
        MOV    RF_SBUF+1,#01           ;取验证块号01
        MOV    R0,#RFCSN               ;取CSN
        MOV    R1,#RF_SBUF+2
        MOV    R2,#4
        LCALL  MEM_COPYA
        LCALL  PCD_AUTHENTICATION      ;验证密钥
        JB     CERR,FINDCARD_RET
        SETB   FFC
FINDCARD_RET:
        RET                           
;---------------------------------------
;系统的默认状态,包括消费设置等
MFXF:
        MOV    A,SFBC
        JNZ    MFXF_01                 ;数据未进入累计,转累计消费金额部分

        MOV    A,XFE1
        JNZ    XFSEND
        MOV    A,XFE2
        JNZ    XFSEND
        MOV    A,XFE3
        JNZ    XFSEND                  
        LCALL  FINDCARD
        JNB    FFC,MFXF_RET
        MOV    R0,#RF_SBUF
        MOV    @R0,#01H
        LCALL  PCD_READ                ;读取数据块1
        JB     CERR,MFXF_RET
        LCALL  CHECK                   ;进入相应的子程序中进行操作,并根据情况看是否要锁定
        LCALL  PCD_HALT                ;卡休眠
        MOV    A,SFBC
        JNZ    MFXF_01                 ;数据未进入累计,转累计消费金额部分
        SJMP   MFXF_RET
MFXF_01:
        LCALL  ENALE                   

        LCALL  WALLXF                  
        MOV    A,XFE1
        JNZ    XFSEND
        MOV    A,XFE2
        JNZ    XFSEND
        MOV    A,XFE3
        JNZ    XFSEND                  
MFXF_RET:
        LCALL  DISALE
        RET
;------------------------------------------

XFSEND:
        MOV    YE1,XFE1
        MOV    YE2,XFE2
        MOV    YE3,XFE3
        LCALL  DISYE
        MOV    A,S5XM
        CJNE   A,#0,XFSEND1             
   XFSEND0_01:
          SETB   FWRITEXF
          CLR    C
          MOV    A,XFE1
          SUBB   A,#1
          MOV    XFE1,A
          MOV    YE1,A       ;显示用

          MOV    A,XFE2
          SUBB   A,#0
          MOV    XFE2,A
          MOV    YE2,A       ;显示用

          MOV    A,XFE3
          SUBB   A,#0
          MOV    XFE3,A
          MOV    YE3,A       ;显示用
          JC     XFSEND0_02         ;数据发送完毕
          LCALL  SENDONE
          LCALL  DISYE
          SJMP   XFSEND0_01
   XFSEND0_02:
        LJMP   XFSEND_RET
XFSEND1:
        CJNE   A,#1,XFSEND2            
   XFSEND1_01:
          SETB   FWRITEXF
          CLR    C
          MOV    A,XFE1
          SUBB   A,#10
          MOV    XFE1,A
          MOV    YE1,A       ;显示用

          MOV    A,XFE2
          SUBB   A,#0
          MOV    XFE2,A
          MOV    YE2,A       ;显示用

          MOV    A,XFE3
          SUBB   A,#0
          MOV    XFE3,A
          MOV    YE3,A       ;显示用
          JC     XFSEND1_02         ;数据发送完毕
          LCALL  SENDONE
          LCALL  DISYE
          SJMP   XFSEND1_01
   XFSEND1_02:
        LJMP   XFSEND_RET
XFSEND2:
        CJNE   A,#2,XFSEND3           
   XFSEND2_01:
          SETB   FWRITEXF
          CLR    C
          MOV    A,XFE1
          SUBB   A,#100
          MOV    XFE1,A
          MOV    YE1,A       ;显示用

          MOV    A,XFE2
          SUBB   A,#0
          MOV    XFE2,A
          MOV    YE2,A       ;显示用

          MOV    A,XFE3
          SUBB   A,#0
          MOV    XFE3,A
          MOV    YE3,A       ;显示用
          JC     XFSEND_RET         ;数据发送完毕
          LCALL  SENDONE
          LCALL  DISYE
          SJMP   XFSEND2_01
        SJMP   XFSEND_RET
XFSEND3:
        CJNE   A,#3,XFSEND4             ;
   XFSEND3_01:
        CLR    C
          MOV    A,XFE1
          SUBB   A,#1
          MOV    XFE1,A
          MOV    YE1,A       ;显示用

          MOV    A,XFE2
          SUBB   A,#0
          MOV    XFE2,A
          MOV    YE2,A       ;显示用

          MOV    A,XFE3
          SUBB   A,#0
          MOV    XFE3,A
          MOV    YE3,A       ;显示用
          JC     XFSEND3_03         ;数据发送完毕

          CLR    FWRITEXF               
          MOV    NUM1,#9
   XFSEND3_02:
          LCALL  SENDONE
          DJNZ   NUM1,XFSEND3_02
          SETB   FWRITEXF               ;发送最后一个脉冲
          LCALL  SENDONE
          LCALL  DISYE
          SJMP   XFSEND3_01
   XFSEND3_03:
        LJMP   XFSEND_RET
XFSEND4:
        CJNE   A,#4,XFSEND5            
   XFSEND4_01:
        CLR    C
          MOV    A,XFE1
          SUBB   A,#1
          MOV    XFE1,A
          MOV    YE1,A       ;显示用

          MOV    A,XFE2
          SUBB   A,#0
          MOV    XFE2,A
          MOV    YE2,A       ;显示用

          MOV    A,XFE3
          SUBB   A,#0
          MOV    XFE3,A
          MOV    YE3,A       ;显示用
          JC     XFSEND4_03         ;数据发送完毕

          CLR    FWRITEXF              
          MOV    NUM1,#99
   XFSEND4_02:
          LCALL  SENDONE
          DJNZ   NUM1,XFSEND4_02
          SETB   FWRITEXF               ;发送最后一个脉冲
          LCALL  SENDONE
          LCALL  DISYE
          SJMP   XFSEND4_01
   XFSEND4_03:
        LJMP   XFSEND_RET
XFSEND5:
        MOV    S5XM,#0
        LJMP   XFSEND
XFSEND_RET:
        MOV    XFE1,#0     ;清除出错退出时消费额不为零时导致的错误
        MOV    XFE2,#0
        MOV    XFE3,#0
        LCALL  CDISBUF
        MOV    DIS_BUF+5,#0
        LCALL  WXFJE
        LCALL  RXFJE
        LCALL  DISALE
        RET

;--------------------------------------------------
;发出一个脉冲,满足系统对脉冲时间的要求
;发出有效脉冲之后要在其电平的正常状态把信息写入寄存器
;当FWRITEXF为1时要写入消费金额
SENDONE:
        MOV    WDT,#3FH
        MOV    A,S3MC
        MOV    C,ACC.0
        CPL    C
        MOV    SFSC,C                  ;根据设置信息来设置输出脉冲有效电平状态

        MOV    A,S2XS                  ;
        ANL    A,#01H
        SUBB   A,#01H
        JNZ    SENDONE_01
        MOV    JSQXF,#16
        SJMP   SENDONE_02
SENDONE_01:
        MOV    JSQXF,#12
SENDONE_02:
        CLR    FXF
        CLR    C
        JNB    FXF,$                   ;根据设置信息设置输出脉冲

        MOV    A,S3MC
        MOV    C,ACC.0
        MOV    SFSC,C                  ;把脉冲状态恢复到正常状态

        MOV    A,S2XS
        ANL    A,#03H
        JZ     SENDONE_03
        JNB    ACC.0,SENDONE_04
        JNB    ACC.1,SENDONE_04
SENDONE_03:
        MOV    JSQXF,#12
        SJMP   SENDONE_05
SENDONE_04:
        MOV    JSQXF,#16
SENDONE_05:
        CLR    FXF
        JNB    FWRITEXF,SENDONE_06
        LCALL  WXFJE                  
SENDONE_06:
        JNB    FXF,$                   ;正常电平应正常保持的时间结束
        RET

;----------------------------------------------------
;数据块内容判断,并根据卡的类别进行相应的操作
LCHECK_RET:
        LJMP   CHECK_RET
CHECK:
        MOV    R0,#RF_SBUF
        MOV    A,@R0
        SWAP   A
        INC    R0
        ORL    A,@R0
;--------------------------
        MOV    B,A                      ;
        MOV    A,#STATE                
        MOV    C,ACC.3
        MOV    A,B
        JNC    CHECK_01                 ;如果对应的位无效,则不检测
;--------------------------
        CJNE   A,#10H,CHECK_01
        MOV    R2,#8
        LCALL  PASSWORD
        JNB    FPASS,LCHECK_RET
        CLR    FCS                      ;清除测试卡标志
        LCALL  CHARGE
        SJMP   LCHECK_RET
CHECK_01:
        CJNE   A,#11H,CHECK_02
        CLR    FPASS
        MOV    R2,#8
        LCALL  PASSWORD
        JNB    FPASS,CHECK_RET
        LCALL  DISINF             ;显示系统信息
        SJMP   CHECK_RET
CHECK_02:
;--------------------------
        MOV    B,A                      ;
        MOV    A,#STATE                 ;消费程序部分开关
        MOV    C,ACC.3
        MOV    A,B
        JNC    CHECK_03                 ;如果对应的位无效,则不检测
;--------------------------
        CJNE   A,#12H,CHECK_03
        MOV    R2,#8
        LCALL  PASSWORD
        JNB    FPASS,CHECK_RET
        SETB   FCS              ;测试卡标志
        LCALL  CHARGE
        SJMP   CHECK_RET
CHECK_03:
        CJNE   A,#13H,CHECK_04
        CLR    FPASS
        MOV    R2,#8
        LCALL  PASSWORD
        JNB    FPASS,check_ret
        LCALL  DISMM              ;显示密码
        SJMP   CHECK_RET
CHECK_04:
        CJNE   A,#21H,CHECK_05
        LCALL  DISINF             ;显示系统信息
        SJMP   CHECK_RET
CHECK_05:
;--------------------------
        MOV    B,A                      ;
        MOV    A,#STATE                 ;消费程序部分开关
        MOV    C,ACC.3
        MOV    A,B
        JNC    CHECK_06                 ;如果对应的位无效,则不检测
;--------------------------
        CJNE   A,#22H,CHECK_06
        CLR    FCS                ;测试卡标志
        LCALL  CHARGE
        SJMP   CHECK_RET
CHECK_06:
        CJNE   A,#23H,CHECK_07
        LCALL  DISMM
        SJMP   CHECK_RET
CHECK_07:
        CJNE   A,#31H,CHECK_09
        MOV    R2,#8
        LCALL  PASSWORD
        JB     FPASS,CHECK_08
        MOV    R0,#RF_SBUF+2
        MOV    R1,#PASS_BUF
        MOV    R2,#8
        LCALL  MEM_COPYA
        LCALL  WPASS
        LCALL  RPASS
CHECK_08:
        LCALL  DISMM
        SJMP   CHECK_RET
CHECK_09:
        CJNE   A,#32H,CHECK_RET
        LCALL  TRANSPASS
CHECK_RET:
        RET
;---------------------------------------

TRANSPASS:
        MOV    R0,#RF_SBUF+2
        MOV    R7,#6
        MOV    R1,#KEY_BUF
TRANSPASS_01:
        MOV    A,@R0
        ANL    A,#0FH
        SWAP   A
        MOV    B,A
        INC    R0
        MOV    A,@R0
        ANL    A,#0FH
        ORL    A,B
        MOV    @R1,A
        INC    R1
        INC    R0
        DJNZ   R7,TRANSPASS_01
        MOV    R0,#KEY_BUF
        LCALL  CHANGE_KEY
        MOV    R0,#RF_SBUF+11
        MOV    R1,#RF_SBUF+14
        MOV    R2,#12
        LCALL  MEM_COPYB
        MOV    R0,#RF_SBUF
        MOV    @R0,#91H
        INC    R0
        MOV    @R0,#00H
        INC    R0
        MOV    @R0,#12
        LCALL  PCD_WRITE_EE
        JB     CERR,TRANSPASS_RET
        LCALL  PCD_HALT
        LCALL  CDISBUF
        MOV    DIS_BUF+4,#03H
        MOV    DIS_BUF+5,#02H      
        MOV    JSQ_SPEAK,#10
        CLR    SPEAK
        SETB   WORKLED
        MOV    WDT,#3FH
        MOV    JSQ_LOCAL_LOOP,#100
        CLR    FLAG2
        JNB    FLAG2,$
        LCALL  CDISBUF
        MOV    DIS_BUF+5,#0
TRANSPASS_RET:
        RET
;----------------------------------------------

PASSWORD:
        CLR    FPASS
        MOV    R0,#RF_SBUF+2
        MOV    R1,#PASS_BUF
PASSWORD_01:
        MOV    A,@R0
        MOV    B,@R1
        CJNE   A,B,PASSWORD_RET
        INC    R0
        INC    R1
        DJNZ   R2,PASSWORD_01
        SETB   FPASS
PASSWORD_RET:
        RET
;-----------------------------------------

CHARGE:
        MOV     XFE1,#0
        MOV     XFE2,#0
        MOV     XFE3,#0
        MOV     R0,#RF_SBUF               
        MOV     @R0,#2
        LCALL   PCD_READ
        JB      CERR,CHARGE_RET1
        MOV     R0,#RF_SBUF
        MOV     YE1,@R0
        INC     R0
        MOV     YE2,@R0
        INC     R0
        MOV     YE3,@R0

        CLR     C
        MOV     A,YE1
        SUBB    A,#40H

⌨️ 快捷键说明

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