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

📄 rc500-1.asm

📁 这是一个真正的RC500读卡程序,稍加修改就可以应用在你的程序之中。
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        MOV     A,YE2
        SUBB    A,#42H
        MOV     A,YE3
        SUBB    A,#0FH                     ;对读出的数据进行校验,超过即有问题,退出
        JNC     CHARGE_ERR                 ;数据大于允许的最大值,退出,未通过验证
        MOV     A,YE1
        JNZ     CHARGE_000
        MOV     A,YE2
        JNZ     CHARGE_000
        MOV     A,YE3
        JNZ     CHARGE_000
        SJMP    CHARGE_ERR
CHARGE_000:
        MOV    A,S1XF
        CJNE   A,#00H,CHARGE_001
        LJMP   XFONE                  
CHARGE_001:
        CJNE   A,#01H,CHARGE_002
        LCALL  XFDZ                      
        SJMP   CHARGE_RET1
CHARGE_002:
        CJNE   A,#02H,CHARGE_003
        LCALL  XFALL                     
        SJMP   CHARGE_RET1
CHARGE_003:
        CJNE   A,#03H,CHARGE_004
        LCALL  XFFGD                     ;
        SJMP   CHARGE_RET1
CHARGE_004:
        MOV    S1XF,#00H                 ;在消费方式设置出错时,改为默认消费方式即非固定消费方式
        SJMP   CHARGE
CHARGE_ERR:
        LCALL  ERRSPEAK
CHARGE_NO:
        LCALL  CDISBUF
        MOV    DIS_BUF+5,#0
CHARGE_RET1:
        JNB    FCS,CHARGE_RET
        MOV    SFBC,#0                   ;如果现在用的是测试卡呢,则清除消费累计标志
        LCALL  WXFJE
        LCALL  RXFJE
CHARGE_RET:
        RET
;---------------------------------------------------
;非固定消费方式
XFFGD:
        LCALL   DISYE                     ;显示余额
        MOV     JSQ_SPEAK,#20
        CLR     SPEAK
        SETB    WORKLED
        MOV     WDT,#3FH      ;喂狗
        MOV     JSQ_LOCAL_LOOP,#80       ;定时显示1S
        CLR     FLAG2
        JNB     FLAG2,$
        MOV     WDT,#3FH

        MOV     NUM1,#4
XFFGD_01:
        MOV     KQE,#1
        LCALL   KK                       
        JB      CERR,LCHARGE_RET
        JB      FZERO,LCHARGE_RET
        DJNZ    NUM1,XFFGD_01

        MOV     NUM1,#6
XFFGD_02:
        MOV   KQE,#1
        SETB  FSD
        LCALL KK                        
        JB    CERR,LCHARGE_RET
        JB    FZERO,LCHARGE_RET
        DJNZ  NUM1,XFFGD_02

        MOV   NUM1,#4
XFFGD_03:
        MOV   KQE,#10
        LCALL KK
        JB    CERR,LCHARGE_RET
        JB    FZERO,LCHARGE_RET          
        DJNZ  NUM1,XFFGD_03


        MOV   NUM1,#6
XFFGD_04:
        MOV   KQE,#10
        SETB  FSD
        LCALL KK
        JB    CERR,LCHARGE_RET
        JB    FZERO,LCHARGE_RET           
        DJNZ  NUM1,XFFGD_04


        MOV   NUM1,#4
XFFGD_05:
        MOV   KQE,#100
        LCALL KK
        JB    CERR,LCHARGE_RET
        JB    FZERO,LCHARGE_RET          
        DJNZ  NUM1,XFFGD_05

        MOV   NUM1,#6
XFFGD_06:
        MOV   KQE,#100
        SETB  FSD
        LCALL KK
        JB    CERR,LCHARGE_RET
        JB    FZERO,LCHARGE_RET          
        DJNZ  NUM1,XFFGD_06
        SJMP  XFFGD_07
LCHARGE_RET:
        SJMP  XFFGD_RET
XFFGD_07:
        MOV     JSQ_SPEAK,#30
        CLR     SPEAK
        SETB    WORKLED
        MOV     WDT,#3FH     
        MOV     JSQ_LOCAL_LOOP,#100      
        CLR     FLAG2
        JNB     FLAG2,$
        MOV     WDT,#3FH

        MOV   R0,#RF_SBUF
        MOV   @R0,#2
        INC   R0
        MOV   @R0,#0
        INC   R0
        MOV   @R0,#0
        INC   R0
        MOV   @R0,#0
        LCALL PCD_WRITE
        JB    CERR,XFFGD_RET
        MOV   A,XFE1
        ADD   A,YE1
        MOV   XFE1,A
        MOV   A,XFE2
        ADDC  A,YE2
        MOV   XFE2,A
        MOV   A,XFE3
        ADDC  A,YE3
        MOV   XFE3,A
XFFGD_RET:
        MOV   A,XFE1
        JNZ   XFFGD_XF
        MOV   A,XFE2
        JNZ   XFFGD_XF
        MOV   A,XFE3
        JNZ   XFFGD_XF
        LJMP  CHARGE_NO
XFFGD_XF:
        LCALL DISYE
        MOV   LASTXF1,XFE1
        MOV   LASTXF2,XFE2
        MOV   LASTXF3,XFE3
        LJMP  CHARGE_RET2                 ;转消费退出部分
;---------------------
;
XFDZ:
        MOV    KQE,#DZKKE        
        LCALL  KK                     
        JB     CERR,XFDZ_RET
        JB     FZERO,XFDZ_01
        LCALL  DISYE
        MOV    JSQ_LOCAL_LOOP,#150
        CLR    FLAG2
        MOV    WDT,#3FH
        JNB    FLAG2,$
        MOV    LASTXF1,XFE1
        MOV    LASTXF2,XFE2
        MOV    LASTXF3,XFE3
        LJMP   CHARGE_RET2              ;转整个消费程序退出部分
XFDZ_01:
        LCALL  ERRSPEAK
XFDZ_RET:
        LCALL  CDISBUF
        MOV    DIS_BUF+5,#0
        RET
;-----------------------------------------
;一次扣完消费方式
XFALL:
        MOV   NUM1,#ALLSD
XFALL_01:
        MOV   WDT,#3FH
        LCALL CDISBUF
        MOV   JSQ_LOCAL_LOOP,#10
        CLR   FLAG2
        JNB   FLAG2,$
        LCALL DISYE
        MOV   JSQ_LOCAL_LOOP,#10
        CLR   FLAG2
        JNB   FLAG2,$
        DJNZ  NUM1,XFALL_01

        MOV   WDT,#3FH
        MOV   R0,#RF_SBUF
        MOV   @R0,#2
        INC   R0
        MOV   @R0,#0
        INC   R0
        MOV   @R0,#0
        INC   R0
        MOV   @R0,#0
        LCALL PCD_WRITE
        JB    CERR,XFALL_RET
        MOV   JSQ_SPEAK,#20
        CLR   SPEAK
        SETB  WORKLED

        MOV   XFE1,YE1
        MOV   XFE2,YE2
        MOV   XFE3,YE3
        LCALL WALLXF
        MOV   LASTXF1,XFE1
        MOV   LASTXF2,XFE2
        MOV   LASTXF3,XFE3
        CLR   A
        MOV   XFE1,A
        MOV   XFE2,A
        MOV   XFE3,A
        MOV   YE1,A
        MOV   YE2,A
        MOV   YE3,A
        MOV    SFBC,#0
        LCALL  WXFJE
        LCALL DISYE
        MOV   WDT,#3FH
        MOV   JSQ_LOCAL_LOOP,#100      
        CLR   FLAG2
        JNB   FLAG2,$
        LJMP  CHARGE_RET2               ;转消费退出部分
XFALL_RET:
        LCALL  CDISBUF
        MOV    DIS_BUF+5,#0
        RET

;-------------------------------------------
;立刻发送
XFONE:
        MOV    LASTXF1,#0
        MOV    LASTXF2,#0
        MOV    LASTXF3,#0
        LCALL  DISYE
        MOV    JSQ_LOCAL_LOOP,#100
        CLR    FLAG2
        MOV    WDT,#3FH
        MOV    JSQ_SPEAK,#10
        SETB   WORKLED
        CLR    SPEAK
        JNB    FLAG2,$                       ;首先显示1S钟余额
XFONE0:
        MOV    A,S5XM
        CJNE   A,#0,XFONE1                
   XFONE0_01:
          MOV    JSQ_LOCAL_LOOP,#50
          CLR    FLAG2
          LCALL  KKONE
          JB     CERR,XFONE0_RET        ;扣款过程出错,退出
          CLR    FWRITEXF
          LCALL  SENDONE
          JNB    FLAG2,$
          SJMP   XFONE0_01
   XFONE0_RET:
          LJMP   XFONE_RET
XFONE1:
        CJNE   A,#1,XFONE2              
   XFONE1_01:
          MOV    NUM1,#9
   XFONE1_02:
          MOV    JSQ_LOCAL_LOOP,#50
          CLR    FLAG2
          LCALL  KKONE
          JB     CERR,XFONE1_RET        ;扣款过程出错,退出
          JNB    FLAG2,$
          DJNZ   NUM1,XFONE1_02

          MOV    JSQ_LOCAL_LOOP,#50
          CLR    FLAG2
          LCALL  KKONE
          JB     CERR,XFONE1_RET        ;扣款过程出错,退出
          CLR    FWRITEXF
          LCALL  SENDONE
          JNB    FLAG2,$
          SJMP   XFONE1_01
   XFONE1_RET:
          LJMP   XFONE_RET
XFONE2:
        CJNE   A,#2,XFONE3                
   XFONE2_01:
          MOV    NUM1,#99
   XFONE2_02:
          MOV    JSQ_LOCAL_LOOP,#50
          CLR    FLAG2
          LCALL  KKONE
          JB     CERR,XFONE2_RET        ;扣款过程出错,退出
          JNB    FLAG2,$
          DJNZ   NUM1,XFONE2_02

          MOV    JSQ_LOCAL_LOOP,#50
          CLR    FLAG2
          LCALL  KKONE
          JB     CERR,XFONE2_RET        ;扣款过程出错,退出
          CLR    FWRITEXF
          LCALL  SENDONE
          JNB    FLAG2,$
          SJMP   XFONE2_01
   XFONE2_RET:
          LJMP   XFONE_RET
XFONE3:
        CJNE   A,#3,XFONE4                 
   XFONE3_01:
          MOV    JSQ_LOCAL_LOOP,#50
          CLR    FLAG2
          LCALL  KKONE
          JB     CERR,XFONE3_RET        ;扣款过程出错,退出
          MOV    NUM1,#10
   XFONE3_02:
          CLR    FWRITEXF
          LCALL  SENDONE
          DJNZ   NUM1,XFONE3_02
          JNB    FLAG2,$
          SJMP   XFONE3_01
   XFONE3_RET:
          LJMP   XFONE_RET
XFONE4:
        CJNE   A,#4,XFONE5              
   XFONE4_01:
          MOV    JSQ_LOCAL_LOOP,#50
          CLR    FLAG2
          LCALL  KKONE
          JB     CERR,XFONE4_RET        ;扣款过程出错,退出
          MOV    NUM1,#100
   XFONE4_02:
          CLR    FWRITEXF
          LCALL  SENDONE
          DJNZ   NUM1,XFONE4_02
          JNB    FLAG2,$
          SJMP   XFONE4_01
   XFONE4_RET:
          LJMP   XFONE_RET
XFONE5:
        MOV    S5XM,#0
        LJMP   XFONE0
XFONE_RET:
        MOV    XFE1,#0
        MOV    XFE2,#0
        MOV    XFE3,#0
        MOV    SFBC,#0
        LCALL  WXFJE
        LCALL  CDISBUF
        MOV    DIS_BUF+5,#0
        RET
CHARGE_RET2:                    ;有消费退出
;-------------------------
        MOV   R0,#REC_DATA
        MOV   @R0,#50H
        INC   R0
        MOV   @R0,XFE1
        INC   R0
        MOV   @R0,XFE2
        INC   R0
        MOV   @R0,XFE3
        MOV   LEN,#4
        LCALL GET_EDC
        LCALL SEND
        RET
;-------------------------------------------------------
;
KKONE:
        MOV    WDT,#3FH
        CLR    C
        MOV    A,YE1
        SUBB   A,#1
        MOV    YE1,A
        MOV    A,YE2
        SUBB   A,#0
        MOV    YE2,A
        MOV    A,YE3
        SUBB   A,#0
        MOV    YE3,A
        JC     KKONE_ERR
        MOV    R0,#RF_SBUF
        MOV    @R0,#2
        INC    R0
        MOV    @R0,YE1
        INC    R0
        MOV    @R0,YE2
        INC    R0
        MOV    @R0,YE3
        LCALL  PCD_WRITE
        JB     CERR,KKONE_ERR
        JB     FCS,KKONE_01               ;如果为测试卡则数据不进入累计
        MOV    XFE1,#1
        MOV    XFE2,#0
        MOV    XFE3,#0
        LCALL  WALLXF
KKONE_01:
        LCALL  DISYE
        MOV    A,LASTXF1
        ADD    A,#1
        MOV    LASTXF1,A
        CLR    A
        ADDC   A,LASTXF2
        MOV    LASTXF2,A
        CLR    A
        ADDC   A,LASTXF3
        MOV    LASTXF3,A
        CLR    CERR
        MOV    JSQ_SPEAK,#10
        CLR    SPEAK                   
        SETB   WORKLED
        SJMP   KKONE_RET
KKONE_ERR:
        SETB   CERR                   
KKONE_RET:
        RET
;---------------------------------------
;
KK:
        MOV   WDT,#3FH
        CLR   FZERO
        CLR   C
        MOV   A,YE1
        SUBB  A,KQE
        MOV   R2,A

        MOV   A,YE2
        SUBB  A,#0
        MOV   R3,A

        MOV   A,YE3
        SUBB  A,#0
        MOV   R4,A
        JC    KK_ZERO           ;现在出现不够减的情况,置相应的标志位
        MOV   YE1,R2
        MOV   YE2,R3
        MOV   YE3,R4

        MOV   R0,#RF_SBUF
        MOV   @R0,#2
        INC   R0
        MOV   @R0,YE1
        INC   R0
        MOV   @R0,YE2
        INC   R0
        MOV   @R0,YE3
        LCALL PCD_WRITE
        JB    CERR,KK_RET
        MOV   JSQ_SPEAK,#15
        SETB  WORKLED
        CLR   SPEAK                   
        MOV   A,XFE1
        ADD   A,KQE
        MOV   XFE1,A

        MOV   A,XFE2
        ADDC  A,#0
        MOV   XFE2,A

        MOV   A,XFE3
        ADDC  A,#0
        MOV   XFE3,A
;----------------------------------------
;保存消费额,单次的
        MOV   SFBC,#01
        LCALL WXFJE          ;写消费金额
        LCALL RXFJE          ;读取消费金额
;----------------------------------------
        JB    FSD,KK_02      ;转闪动显示部分
KK_01:
        LCALL DISYE
        MOV   JSQ_LOCAL_LOOP,#100
        CLR   FLAG2
        JNB   FLAG2,$
        SJMP  KK_RET
KK_02:
        MOV   A,NUM1

⌨️ 快捷键说明

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