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

📄 iccard.asm

📁 MCS-51单片机实验 39个实用实验和源码
💻 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 + -