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

📄 rc500-1.asm

📁 这是一个真正的RC500读卡程序,稍加修改就可以应用在你的程序之中。
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        CJNE  A,#01H,KK_03
        SJMP  KK_01
KK_03:
        MOV   NUM2,#10
KK_04:
        MOV   JSQ_LOCAL_LOOP,#10
        CLR   FLAG2
        JNB   FSD,KK_05
        LCALL DISYE
        SJMP  KK_06
KK_05:
        LCALL CDISBUF
KK_06:
        JNB   FLAG2,$
        CPL   FSD
        DJNZ  NUM2,KK_04
        SJMP  KK_RET
KK_ZERO:
        SETB  FZERO
        SETB  CERR
KK_RET:
        LCALL WXFJE
        CLR   FSD
KK_RET1:
        RET
;-----------------------------------------------
;显示系统信息,包括本次充值输入,本次消费输入,累计消费金额,累计充值金额
DISINF:
        MOV   JSQ_SPEAK,#10
        CLR   SPEAK
        SETB  WORKLED
        MOV   YE1,LASTCZ1           
        MOV   YE2,LASTCZ2
        MOV   YE3,LASTCZ3
        LCALL DISYE
        MOV   JSQ_LOCAL_LOOP,#100
        CLR   FLAG2
        JNB   FLAG2,$
        MOV   WDT,#3FH
        MOV   JSQ_LOCAL_LOOP,#200
        CLR   FLAG2
        JNB   FLAG2,$

        MOV   JSQ_SPEAK,#10
        CLR   SPEAK
        SETB  WORKLED
        MOV   YE1,LASTXF1           ;
        MOV   YE2,LASTXF2
        MOV   YE3,LASTXF3
        LCALL DISYE
        MOV   JSQ_LOCAL_LOOP,#100
        CLR   FLAG2
        JNB   FLAG2,$
        MOV   WDT,#3FH
        MOV   JSQ_LOCAL_LOOP,#200
        CLR   FLAG2
        JNB   FLAG2,$


        MOV   JSQ_SPEAK,#10
        CLR   SPEAK
        SETB  WORKLED
        MOV   YE1,ALLCZ1            
        MOV   YE2,ALLCZ2
        MOV   YE3,ALLCZ3
        LCALL DISYE
        MOV   JSQ_LOCAL_LOOP,#100
        CLR   FLAG2
        JNB   FLAG2,$
        MOV   WDT,#3FH
        MOV   JSQ_LOCAL_LOOP,#200
        CLR   FLAG2
        JNB   FLAG2,$


        MOV   JSQ_SPEAK,#10
        CLR   SPEAK
        SETB  WORKLED
        MOV   YE1,ALLXF1                   ;消费金额累计
        MOV   YE2,ALLXF2
        MOV   YE3,ALLXF3
        LCALL DISYE
        MOV   JSQ_LOCAL_LOOP,#100
        CLR   FLAG2
        JNB   FLAG2,$
        MOV   WDT,#3FH
        MOV   JSQ_LOCAL_LOOP,#200
        CLR   FLAG2
        JNB   FLAG2,$
;        JB    FENTER,DISINF_00
;        LJMP  DISINF_RET
DISINF_00:
;------------------------------------
;此处转入设置部分
;1、消费方式设置
        MOV   R0,#RF_SBUF        ;
                                 ;判断卡
        LCALL PCD_READ
        JNB   CERR,DISINF_01
        LJMP  DISINF_RET
DISINF_01:
        LCALL CDISBUF
;---------------------------
        MOV   JSQ_SPEAK,#10
        CLR   SPEAK
        SETB  WORKLED
DISINF_02:
        MOV   WDT,#3FH
        MOV   DIS_BUF+0,#0BH            ;显示现在的消费方式,并接受按键设置
        MOV   DIS_BUF+1,#0CH
        MOV   DIS_BUF+2,#01H            ;显示S-1
        ANL   S1XF,#03H
        MOV   DIS_BUF+5,S1XF
        MOV   JSQ_LOCAL_LOOP,#200
        CLR   FLAG2
DISINF_03:
        MOV   R0,#RF_SBUF
        MOV   @R0,#1
        LCALL PCD_READ                  ;确认卡是否还在缓冲区
        JB    CERR,DISINF_04            ;寻卡出错,说明卡不在天线中
        JBC   FLAG2,DISINF_06          ;时间到,转下一步操代作
        SJMP  DISINF_03
DISINF_04:
        LCALL CHECKCARD
        JBC   FFC,DISINF_05
        JBC   FLAG2,DISINF_06
        SJMP  DISINF_04
DISINF_05:
        INC   S1XF
        SJMP  DISINF_02
;2、消费输出设置
DISINF_06:
        MOV   JSQ_SPEAK,#10
        CLR   SPEAK
        SETB  WORKLED
DISINF_07:
        MOV   WDT,#3FH
        MOV   DIS_BUF+2,#02H            ;显示S-2
        ANL   S2XS,#03H
        MOV   DIS_BUF+5,S2XS
        MOV   JSQ_LOCAL_LOOP,#200
        CLR   FLAG2
DISINF_08:
        MOV   R0,#RF_SBUF
        MOV   @R0,#1
        LCALL PCD_READ                  ;确认卡是否还在缓冲区
        JB    CERR,DISINF_09            ;寻卡出错,说明卡不在天线中
        JBC   FLAG2,DISINF_11           ;时间到,转下一步操代作
        SJMP  DISINF_08
DISINF_09:
        LCALL CHECKCARD
        JBC   FFC,DISINF_10
        JBC   FLAG2,DISINF_11
        SJMP  DISINF_09
DISINF_10:
        INC   S2XS
        SJMP  DISINF_07
DISINF_11:
;-------------------------------
;3、显示脉冲的相位
        MOV   JSQ_SPEAK,#10
        CLR   SPEAK
        SETB  WORKLED
DISINF_12:
        MOV   WDT,#3FH
        MOV   DIS_BUF+2,#03H            ;显示S-3
        ANL   S3MC,#01H
        MOV   DIS_BUF+5,S3MC
        MOV   JSQ_LOCAL_LOOP,#200
        CLR   FLAG2
DISINF_13:
        MOV   R0,#RF_SBUF
        MOV   @R0,#1
        LCALL PCD_READ                  ;确认卡是否还在缓冲区
        JB    CERR,DISINF_14            ;寻卡出错,说明卡不在天线中
        JBC   FLAG2,DISINF_16           ;时间到,转下一步操代作
        SJMP  DISINF_13
DISINF_14:
        LCALL CHECKCARD
        JBC   FFC,DISINF_15
        JBC   FLAG2,DISINF_16
        SJMP  DISINF_14
DISINF_15:
        INC   S3MC
        SJMP  DISINF_12
;---------------------------
;4、充值开关检测方法
DISINF_16:
        MOV   JSQ_SPEAK,#10
        CLR   SPEAK
        SETB  WORKLED
DISINF_17:
        MOV   WDT,#3FH
        MOV   DIS_BUF+2,#04H            ;显示S-4
        ANL   S4KG,#01H
        MOV   DIS_BUF+5,S4KG
        MOV   JSQ_LOCAL_LOOP,#200
        CLR   FLAG2
DISINF_18:
        MOV   R0,#RF_SBUF
        MOV   @R0,#1
        LCALL PCD_READ                  ;确认卡是否还在缓冲区
        JB    CERR,DISINF_19            ;寻卡出错,说明卡不在天线中
        JBC   FLAG2,DISINF_21           ;时间到,转下一步操代作
        SJMP  DISINF_18
DISINF_19:
        LCALL CHECKCARD
        JBC   FFC,DISINF_20
        JBC   FLAG2,DISINF_21
        SJMP  DISINF_19
DISINF_20:
        INC   S4KG
        SJMP  DISINF_17
;-------------------------------------
;5消费脉冲输出方式设置
DISINF_21:
        MOV   JSQ_SPEAK,#10
        CLR   SPEAK
        SETB  WORKLED
DISINF_22:
        MOV   WDT,#3FH
        MOV   DIS_BUF+2,#05H            ;显示S-5
        MOV   A,S5XM
        CLR   C
        SUBB  A,#05H
        JC    $+4
        MOV   S5XM,A
        MOV   DIS_BUF+5,S5XM
        MOV   JSQ_LOCAL_LOOP,#200
        CLR   FLAG2
DISINF_23:
        MOV   R0,#RF_SBUF
        MOV   @R0,#1
        LCALL PCD_READ                  ;确认卡是否还在缓冲区
        JB    CERR,DISINF_24            ;寻卡出错,说明卡不在天线中
        JBC   FLAG2,DISINF_26           ;时间到,转下一步操代作
        SJMP  DISINF_23
DISINF_24:
        LCALL CHECKCARD
        JBC   FFC,DISINF_25
        JBC   FLAG2,DISINF_26
        SJMP  DISINF_24
DISINF_25:
        INC   S5XM
        SJMP  DISINF_22
;------------------------------------------
;6、脉冲充值输入设置
DISINF_26:
        MOV   JSQ_SPEAK,#10
        CLR   SPEAK
        SETB  WORKLED
DISINF_27:
        MOV   WDT,#3FH
        MOV   DIS_BUF+2,#06H            ;显示S-6
        MOV   A,S6CM
        CLR   C
        SUBB  A,#05H
        JC    $+4
        MOV   S6CM,A
        MOV   DIS_BUF+5,S6CM
        MOV   JSQ_LOCAL_LOOP,#200
        CLR   FLAG2
DISINF_28:
        MOV   R0,#RF_SBUF
        MOV   @R0,#1
        LCALL PCD_READ                  ;确认卡是否还在缓冲区
        JB    CERR,DISINF_29            ;寻卡出错,说明卡不在天线中
        JBC   FLAG2,DISINF_31           ;时间到,转下一步操代作
        SJMP  DISINF_28
DISINF_29:
        LCALL CHECKCARD
        JBC   FFC,DISINF_30
        JBC   FLAG2,DISINF_31
        SJMP  DISINF_29
DISINF_30:
        INC   S6CM
        SJMP  DISINF_27
DISINF_31:
        LCALL WFLAG
        LCALL RFLAG
        MOV   A,S3MC
        MOV   C,ACC.0
        MOV   SFSC,C
DISINF_RET:
        MOV   JSQ_SPEAK,#10
        CLR   SPEAK
        SETB  WORKLED
        LCALL CDISBUF            ;清零显示缓冲区
        MOV   DIS_BUF+5,#0
        LCALL PCD_HALT

        RET
;----------------------------------------
;显示小区密码,大区密码,各显示3S
DISMM:
        MOV   JSQ_SPEAK,#10
        CLR   SPEAK
        SETB  WORKLED
        LCALL CDISBUF
        MOV   R0,#PASS_BUF
        MOV   R1,#DIS_BUF+2
        MOV   R2,#4
        LCALL MEM_COPYA      
        MOV   JSQ_LOCAL_LOOP,#100
        JNB   FLAG2,$
        CLR   FLAG2
        MOV   WDT,#3FH
        MOV   JSQ_LOCAL_LOOP,#200
        JNB   FLAG2,$
        CLR   FLAG2

        MOV   JSQ_SPEAK,#10
        CLR   SPEAK
        SETB  WORKLED
        LCALL CDISBUF
        MOV   R0,#PASS_BUF+4
        MOV   R1,#DIS_BUF+2
        MOV   R2,#4
        LCALL MEM_COPYA     
        MOV   JSQ_LOCAL_LOOP,#100
        JNB   FLAG2,$
        CLR   FLAG2
        MOV   WDT,#3FH
        MOV   JSQ_LOCAL_LOOP,#200
        JNB   FLAG2,$
        CLR   FLAG2

        MOV   JSQ_SPEAK,#10
        CLR   SPEAK
        SETB  WORKLED
        LCALL CDISBUF            ;清零显示缓冲区
        MOV   DIS_BUF+5,#0
        RET
;--------------------------------------------------
;对进入系统的卡进行校验看是否为查询卡,如果为查询卡则返回确的信息
;返回值FFC=0失败,FFC=1成功
CHECKCARD:
        LCALL FINDCARD
        JNB   FFC,CHECKCARD_RET         ;若没有卡退出
        CLR    FFC                      ;清标志 位
        MOV   R0,#RF_SBUF
        MOV   @R0,#1
        LCALL PCD_READ
        JB    CERR,CHECKCARD_RET        ;出错退出

        MOV    R0,#RF_SBUF
        MOV    A,@R0
        SWAP   A
        INC    R0
        ORL    A,@R0

        CJNE   A,#11H,CHECKCARD_01
        LCALL  PASSWORD
        JNB    FPASS,CHECKCARD_RET
        SETB   FFC                        ;通过验证
        SJMP   CHECKCARD_RET
CHECKCARD_01:
        CJNE   A,#21H,CHECKCARD_RET
        SETB   FFC                        ;通过验证
CHECKCARD_RET:
        RET
;--------------------------------------------------
;更改卡第一扁区的密码
CARDKEY:
        SETB   CERR
        JNB    RC500_OK,CARDKEY        ;
        MOV    R0,#RF_SBUF
        MOV    @R0,#26H
        LCALL  PCD_REQUEST              ;寻卡
        JNB    CERR,CARDKEY_01
        MOV    R0,#RF_SBUF
        MOV    @R0,#26H
        LCALL  PCD_REQUEST              ;寻卡
        JB     CERR,CARDKEY_RET
CARDKEY_01:
        LCALL  PCD_ANTICOLLISION        ;防冲撞
        JB     CERR,CARDKEY_RET
        MOV    R0,#RF_SBUF
        MOV    R1,#RFCSN
        MOV    R2,#4
        LCALL  MEM_COPYA                ;保存CSN
        LCALL  PCD_SELECT               ;锁定卡
        JB     CERR,CARDKEY_RET
        MOV    R0,#KEY_BUF
        MOV    R7,#6
CARDKEY_02:
        MOV    @R0,#0FFH
        INC    R0
        DJNZ   R7,CARDKEY_02

        MOV    R0,#KEY_BUF
        LCALL  CHANGE_KEY               ;转换密钥
        LCALL  PCD_KEY                  ;传送密钥
        JB     CERR,CARDKEY_RET
CARDKEY_03:
        MOV    R0,#RF_SBUF
        MOV    @R0,#60H                 ;取验证方式 A
        INC    R0
        MOV    @R0,#1                   ;验证第一个扇区密钥
        MOV    R0,#CARD_NO
        MOV    R1,#RF_SBUF+2
        MOV    R2,#4
        LCALL  MEM_COPYA
CARDKEY_04:
        LCALL  PCD_AUTHENTICATION       
        JB     CERR,CARDKEY_RET                    ;如果验证通不过则转到开始验证下一个扇区
        MOV    R1,#RF_SBUF
        MOV    @R1,#3
        INC    R1
        MOV    R0,#BLOCK+2
        MOV    R7,#6
CARDKEY_05:
        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    R0
        INC    R1
        DJNZ   R7,CARDKEY_05

        MOV    @R1,#0FFH
        INC    R1
        MOV    @R1,#07H
        INC    R1
        MOV    @R1,#80H
        INC    R1
        MOV    @R1,#69H
        LCALL  PCD_WRITE
        JB     CERR,CARDKEY_RET
        LCALL  PCD_HALT
        SETB   FCARDKEY
CARDKEY_RET:
        RET
;-----------------------------------------------------------
;恢复第一扇区密码
KEYCARD:
        SETB   CERR
        JNB    RC500_OK,KEYCARD        ;500出错,死循环
        MOV    R0,#RF_SBUF
        MOV    @R0,#26H
        LCALL  PCD_REQUEST              ;寻卡
        JNB    CERR,KEYCARD_01
        MOV    R0,#RF_SBUF
        MOV    @R0,#26H
        LCALL  PCD_REQUEST              ;寻卡
        JB     CERR,KEYCARD_RET
KEYCARD_01:
        LCALL  PCD_ANTICOLLISION        ;防冲撞
        JB     CERR,KEYCARD_RET
        MOV    R0,#RF_SBUF
        MOV    R1,#RFCSN
        MOV    R2,#4
        LCALL  MEM_COPYA                ;保存CSN
        LCALL  PCD_SELECT               ;锁定卡
        JB     CERR,KEYCARD_RET
        MOV    R0,#KEY_BUF
        MOV    R1,#BLOCK+2
        MOV    R7,#6
KEYCARD_02:
        MOV    A,@R1
        ANL    A,#0FH
        SWAP   A
        MOV    B,A
        INC    R1
        MOV    A,@R1
        ANL    A,#0FH
        ORL    A,B
        MOV    @R0,A
        INC    R0
        INC    R1

⌨️ 快捷键说明

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