📄 iccard.asm
字号:
;文件名:IcCard20.asm
;------------------------------------------------------------
Z8279 EQU 0F239H ;8279 状态/命令口地址
D8279 EQU 0F238H ;8279 数据口地址
;------------------------------------------------------------
iccommand EQU 34H ;1字节命令
icaddress EQU 35H ;1字节地址
icdatain EQU 36H ;1字节数据
Read_Add EQU 37H ;读取的地址
ReadByte EQU 38H ;读取的内容
Write_Add EQU 39H ;写入的字节
WriteByte EQU 3AH ;写入的内容
Password EQU 3BH ;密码存放单元(3BH-3DH)
Pulse EQU 3EH ;延时脉冲数
s_mem EQU 3FH ;保密存储器
DispByte EQU 40H ;显示区首地址
ic EQU 48H ;IC卡损坏标志
ec EQU 49H ;错误计数器
;------------------------------------------------------------
clk BIT P1.3 ;CLK
rst BIT P1.5 ;RST
sda BIT P1.7 ;I/O
;------------------------------------------------------------
ORG 0000H
SJMP Start
ORG 0030H
Start:
MOV SP,#60H
LCALL Init8279 ;8079初始化
LCALL RamInt ;显示缓存区初始化
Wait:
LCALL GetKey ;读键盘
CJNE A,#0FFH,NoKey ;判断是否有键输入
MOV A,B
CJNE A,#30H,Key_1
LCALL Card_Atr ;读卡片头文字
SJMP Wait
Key_1: CJNE A,#31H,Key_2
LCALL Card_Read ;卡片内容读取
SJMP Wait
Key_2: CJNE A,#32H,Key_3
LCALL Card_Write ;卡片内容写入
SJMP Wait
Key_3: CJNE A,#33H,Other
LCALL Card_Verify ;卡片密码校验
SJMP Wait
Other:
LCALL Standard ;其他情况显示
SJMP Wait
NoKey:
LCALL Display
SJMP Wait
;------------------------------------------------------------
Standard: ;显示为"--------"
MOV 40H,#14H
MOV 41H,#14H
MOV 42H,#14H
MOV 43H,#14H
MOV 44H,#14H
MOV 45H,#14H
MOV 46H,#14H
MOV 47H,#14H
LCALL Display
RET
;------------------------------------------------------------
Card_Atr: ;读取卡片头文字
LCALL Rst_Atr ;卡片复位应答
LCALL Rst_Atr
MOV R1,#40H
MOV R0,#30H
MOV R4,#4
Card_Atr1:
MOV A,@R0
ANL A,#0F0H
SWAP A
MOV @R1,A
INC R1
MOV A,@R0
ANL A,#0FH
MOV @R1,A
INC R1
INC R0
DJNZ R4,Card_Atr1
LCALL Display ;显示为"XXXXXXXX"
RET
;------------------------------------------------------------
Card_Read: ;卡片内容读取
MOV 40H,#15H ;显示缓存区设置
MOV 41H,#01H
MOV 42H,#15H
MOV 43H,#14H
MOV 44H,#14H
MOV 45H,#15H
MOV 46H,#14H
MOV 47H,#14H
LCALL Display ;初显示,格式为"_1._--_--"
MOV R1,#43H
LCALL Deal_Key ;键入读取的字节
MOV Read_Add,B
MOV A,#0FFH ;置延时脉冲,延时脉冲=0FFH-读字节
SUBB A,B
MOV Pulse,A
Card_Rd1:
LCALL GetKey ;读键
CJNE A,#0FFH,Card_Rd1 ;如无键,继续等,直到有键
MOV A,B
CJNE A,#3DH,Card_Rd2 ;如是"D",取消
LCALL Standard
SJMP Card_Rd4
Card_Rd2:
CJNE A,#3EH,Card_Rd3 ;如是"E",重新输入
MOV 43H,#14H
MOV 44H,#14H
SJMP Card_Read
Card_Rd3:
CJNE A,#3FH,Card_Rd1 ;如是"F",执行读卡子程序
LCALL Read
MOV R1,#46H
ANL A,#0F0H
SWAP A
MOV @R1,A
INC R1
MOV A,ReadByte
ANL A,#0FH
MOV @R1,A
MOV 41H,#11H
Card_Rd4:
LCALL Display ;显示结果,格式为"_1_XX_XX"
RET
;------------------------------------------------------------
Card_Write: ;卡片内容写入
MOV 40H,#15H ;显示缓存区设置
MOV 41H,#02H
MOV 42H,#15H
MOV 43H,#14H
MOV 44H,#14H
MOV 45H,#15H
MOV 46H,#14H
MOV 47H,#14H
LCALL Display ;初显示,格式为"_2_--_--"
MOV R1,#43H
LCALL Deal_Key ;键入写入的字节
MOV Write_Add,B
MOV R1,#46H
LCALL Deal_Key ;键入写入的内容
MOV WriteByte,B
Card_Wr1:
LCALL GetKey ;读键
CJNE A,#0FFH,Card_Wr1 ;如无键,继续等,直到有键
MOV A,B
CJNE A,#3DH,Card_Wr2 ;如是"D",取消
LCALL Standard
SJMP Card_Wr4
Card_Wr2:
CJNE A,#3EH,Card_Wr3 ;如是"E",重新输入
MOV 43H,#14H
MOV 44H,#14H
MOV 46H,#14H
MOV 47H,#14H
SJMP Card_Write
Card_Wr3:
CJNE A,#3FH,Card_Wr1 ;如是"F",执行写卡子程序
MOV 41H,#12H
LCALL Write ;写卡子程序
Card_Wr4:
LCALL Display ;显示结果,格式为"_2._XX_XX"
RET
;------------------------------------------------------------
Card_Verify: ;卡片密码校验
LCALL Rdsm_ec ;读错误计数器
LCALL Rdsm_ec
CJNE A,#00H,Card_Ve1 ;设置显示缓存器
MOV 40H,#00H
SJMP Card_Ve6
Card_Ve1:
CJNE A,#01H,Card_Ve2
MOV 40H,#01H
SJMP Card_Ve6
Card_Ve2:
CJNE A,#02H,Card_Ve3
MOV 40H,#01H
SJMP Card_Ve6
Card_Ve3:
CJNE A,#04H,Card_Ve4
MOV 40H,#01H
SJMP Card_Ve6
Card_Ve4:
CJNE A,#07H,Card_Ve5
MOV 40H,#03H
SJMP Card_Ve6
Card_Ve5:
MOV 40H,#02H
Card_Ve6:
MOV 41H,#15H
MOV 42H,#14H
MOV 43H,#14H
MOV 44H,#14H
MOV 45H,#14H
MOV 46H,#14H
MOV 47H,#14H
LCALL Display
MOV R1,#42H
LCALL Deal_Key
MOV 3BH,B
MOV R1,#44H
LCALL Deal_Key
MOV 3CH,B
MOV R1,#46H
LCALL Deal_Key
MOV 3DH,B
Card_Ve7:
LCALL GetKey ;读键
CJNE A,#0FFH,Card_Ve7 ;如无键,继续等,直到有键
MOV A,B
CJNE A,#3DH,Card_Ve8 ;如是"D",取消
LCALL Standard
RET
Card_Ve8:
CJNE A,#3EH,Card_Ve9 ;如是"E",重新输入
MOV 42H,#14H
MOV 43H,#14H
MOV 44H,#14H
MOV 45H,#14H
MOV 46H,#14H
MOV 47H,#14H
AJMP Card_Verify
Card_Ve9:
CJNE A,#3FH,Card_Ve7 ;如是"F",执行校验子程序
MOV A,#10H
ADD A,40H
XCH A,40H
LCALL Verify
LCALL Display ;显示结果,格式为"X._XXXXXX"
RET
;------------------------------------------------------------
Deal_Key: ;键输入与处理,可读两个键
LCALL GetKey
CJNE A,#0FFH,Deal_Key
MOV A,B
ANL A,#0FH
MOV @R1,A
INC R1
Deal1:
LCALL Display
LCALL GetKey
CJNE A,#0FFH,Deal1
MOV A,B
ANL A,#0FH
MOV @R1,A
SWAP A
DEC R1
ADD A,@R1
SWAP A
MOV B,A
LCALL Display
RET
;------------------------------------------------------------
Read: ;读卡子程序
LCALL Rst_Atr
MOV iccommand,#30H
MOV icaddress,Read_Add
MOV R7,Pulse
LCALL Send_Command
CLR clk
LCALL CardRdByte
Read1:
MOV R5,#8
Read2:
LCALL Card_Pulse
DJNZ R5,Read2
DJNZ R7,Read1
MOV ReadByte,A
RET
;------------------------------------------------------------
Write: ;写卡子程序
LCALL Rst_Atr
MOV iccommand,#38H
MOV icaddress,Write_Add
MOV icdatain,WriteByte
LCALL Send_Command
LCALL Process
RET
;------------------------------------------------------------
Verify: ;密码校验
LCALL Rdsm_Ec
CJNE A,#00H,Veri1
MOV ic,#0FH
RET
Veri1:
CJNE A,#07H,Veri21
MOV A,#03H
SJMP Veri3
Veri21:
CJNE A,#06H,Veri22
MOV A,#02H
SJMP Veri3
Veri22:
CJNE A,#05H,Veri23
MOV A,#01H
SJMP Veri3
Veri23:
CJNE A,#03H,Veri24
MOV A,#01H
SJMP Veri3
Veri24:
MOV A,#00H
Veri3:
MOV ic,#00H
MOV icdatain,A
LCALL Wrsm_ec
LCALL Send_PSC
MOV icaddress,#00H
MOV icdatain,#0FFH
LCALL Wrsm_ec
RET
;------------------------------------------------------------
Rdsm_Ec: ;读取EC
LCALL Rst_Atr
MOV iccommand,#31H
MOV R7,#16H
LCALL Send_Command
CLR clk
Rdsm1:
LCALL CardRdByte
MOV s_mem,A
Rdsm2:
LCALL Card_Pulse
DJNZ R7,Rdsm2
MOV A,s_mem
ANL A,#07H
MOV ec,A
RET
;------------------------------------------------------------
Wrsm_ec: ;写入EC
LCALL Rst_Atr
MOV iccommand,#39H
MOV icaddress,#00H
LCALL Send_Command
LCALL Process
RET
;------------------------------------------------------------
Send_PSC: ;送密码(进行校验)
LCALL Rst_Atr
MOV R5,#3
MOV R0,#3BH
MOV iccommand,#33H
MOV icaddress,#01H
PSC1:
MOV icdatain,@R0
LCALL Send_Command
LCALL Process
LCALL Delay
INC icaddress
INC R0
DJNZ R5,PSC1
RET
;------------------------------------------------------------
Delay: ;延时
NOP
NOP
NOP
RET
;------------------------------------------------------------
Card_Pulse: ;输出一个时钟脉冲
LCALL Delay
SETB clk
LCALL Delay
LCALL Delay
CLR clk
RET
;------------------------------------------------------------
Process:
LCALL Delay
CLR clk
NOP
NOP
CLR sda
MOV R7,#0FFH
Process1:
LCALL Card_Pulse
DJNZ R7,Process1
NOP
SETB sda
RET
;------------------------------------------------------------
Rst_Atr: ;复位应答
CLR clk
CLR rst
MOV R0,#30H
MOV R7,#4
LCALL Delay
SETB rst
LCALL Delay
SETB clk
LCALL Delay
CLR clk
LCALL Delay
CLR rst
Atr:
LCALL CardRdByte
MOV @R0,A
INC R0
DJNZ R7,Atr
SETB sda
RET
;------------------------------------------------------------
Send_Command: ;3字节命令输入
MOV R4,#3
MOV R1,#iccommand
CLR clk
LCALL Delay
SETB sda
LCALL Delay
SETB clk
LCALL Delay
CLR sda
LCALL Delay
CLR clk
LCALL Delay
Command1:
MOV A,@R1
INC R1
LCALL CardWrByte
DJNZ R4,Command1
LCALL Delay
CLR clk
LCALL Delay
CLR sda
SETB clk
LCALL Delay
SETB sda
RET
;------------------------------------------------------------
CardRdByte: ;读取一个字节
CLR A
MOV R3,#8
RdByte:
SETB clk
MOV C,sda
LCALL Delay
RRC A
LCALL Delay
CLR clk
LCALL Delay
DJNZ R3,RdByte
RET
;------------------------------------------------------------
CardWrByte: ;写入一个字节
MOV R3,#8
CLR C
WrByte:
RRC A
CLR clk
LCALL Delay
MOV sda,C
LCALL Delay
SETB clk
LCALL Delay
DJNZ R3,WrByte
RET
;------------------------------------------------------------
Init8279: ;8279初始化
PUSH ACC
PUSH DPL
PUSH DPH
MOV DPTR,#Z8279
MOV A,#0
MOVX @DPTR,A ;置8279工作方式
MOV A,#2FH
MOVX @DPTR,A ;置键盘扫描速率
MOV A,#0C1H
MOVX @DPTR,A ;清除LED显示
POP DPH
POP DPL
POP ACC
RET
;------------------------------------------------------------
RamInt: ;RAM初始化
MOV R1,#40H
MOV R2,#8
MOV A,#15H
RamInt1:
MOV @R1,A
INC R1
DJNZ R2,RamInt1
RET
;------------------------------------------------------------
GetKey:
PUSH DPH ;保存现场
PUSH DPL
MOV DPTR,#Z8279
MOVX A,@DPTR ;读8279状态
ANL A,#07H ;屏蔽D7-D3
JNZ GETVAL ;判断是否有键输入
MOV A,#0H ;置标志(无键输入)
SJMP NKBHIT
GETVAL: MOV A,#40H ;读 FIFO RAM 命令
MOVX @DPTR,A
MOV DPTR,#D8279
MOVX A,@DPTR ;读键
ANL A,#3FH ;屏蔽 SHIFT 和 CTRL 键
MOV DPTR,#KEYCODE ;键码表起始地址
MOVC A,@A+DPTR ;查表
MOV B,A ;置返回键值
MOV A,#0FFH ;置标志(有键输入)
NKBHIT: ;恢复现场
POP DPL
POP DPH
RET
;------------------------------------------------------------
Display: ;显示子程序
MOV R4,#8
MOV R0,#DispByte
Disp1:
MOV A,@R0
MOV R5,A
LCALL Disled
INC R0
DJNZ R4,Disp1
RET
;------------------------------------------------------------
Disled:
PUSH DPH
PUSH DPL
PUSH ACC
MOV A,#7FH
ADD A,R4
MOV DPTR,#Z8279
MOVX @DPTR,A
MOV DPTR,#LEDSEG
MOV A,R5
MOVC A,@A+DPTR
MOV DPTR,#D8279
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
LEDSEG:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,a,b,c,d,e,f'
DB 0BFH,86H,0DBH,0CFH,40H,00H ;'0.,1.,2.,3.,-, ,'
KEYCODE:
DB 30H,31H,32H,33H,34H,35H,36H,37H ;'0,1,2,3,4,5,6,7'
DB 38H,39H,3AH,3BH,3CH,3DH,3EH,3FH ;'8,9,A,B,C,D,E,F'
;------------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -