📄 rc500-1.asm
字号:
;-----------------------------------------
;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 + -