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

📄 ic.asm

📁 达盛单片机试验箱
💻 ASM
字号:
RD_MAIN_RAM		EQU		30H 					;读主存储区
RD_P_RAM 		EQU 	34H 					;读保护存储区
WR_MAIN_RAM 	EQU 	38H 					;写主存储区
WR_P_RAM 		EQU 	3CH 					;写保护存储区
RD_PSC_RAM 		EQU 	31H 					;读密码
COMP_PSC_RAM 	EQU		33H 					;校验密码
WR_PSC_RAM 		EQU		39H 					;写密码;
ATRDATA 		DATA 	30H 					;4字节复位应答,32位标头30~33H
ICCOMMAND 		DATA 	34H 					;1字节命令(3个字节:1字节命令、1字节地址、1字节数据)
ICADDRESS 		DATA 	35H 					;1字节地址
ICDATAIN 		DATA 	36H 					;1字节数据
ICLENGTH 		DATA 	37H 					;1字节读写长度
PSWORD			DATA 	38H 					;3字节密码(SC1,SC2,SC3)
ICDATA 			DATA 	3BH 					;32字节读写数据;
RST 			BIT 	P1.3
SDA 			BIT 	P1.2
SCL 			BIT 	P1.4

				ORG 	0000H
				
				SJMP 	MAIN1
;
;****************************************************************
;				/*主程序*/										*
;****************************************************************
;				
				ORG 	0030H
					
MAIN1: 			MOV 	SP,#10H
				MOV 	R0,#PSWORD 				;送密码(3个字节)
				MOV 	@R0,#0FFH
				INC 	R0
				MOV 	@R0,#0FFH
				INC 	R0
				MOV 	@R0,#0FFH
				CALL 	VERIFY 					;校验密码
;
;****************************************************************
;				/*写主存储区*/									*
;****************************************************************
;
MAINLOOP:		MOV 	R4,#20H					;32个字节的读写数据
				MOV 	R0,#ICDATA	
				CLR 	A
				MOV 	A,#077H
LOOP1: 			MOV 	@R0,A
				INC 	R0
				DJNZ 	R4,LOOP1
				MOV 	ICADDRESS,#20H
				MOV 	ICLENGTH,#20H
				CALL 	WRMM 					;写主存储区
				MOV 	ICADDRESS,#20H
				MOV 	ICLENGTH,#20H
				CALL 	RDMM 					;读主存储区
				MOV		R0,A
				CALL	DISP
				AJMP 	MAINLOOP
;
;****************************************************************	
;				/*延时程序10US*/								*
;****************************************************************
;
ICDELAY:		NOP
				NOP
				NOP
				NOP
				RET
;
;****************************************************************
;				/*时钟脉冲*/									*
;****************************************************************
;
CLOCK:			SETB 	SCL
				CALL 	ICDELAY 				; 延时程序
				CLR 	SCL
				CALL 	ICDELAY 				; 延时程序
				RET
;
;****************************************************************
;				/*读字节*/										*
;****************************************************************
;
RDBYTE:			MOV 	R3,#8
				SETB 	SDA
				CLR 	A
RDBYTE1:		MOV 	C,SDA
				RRC 	A
				CALL 	CLOCK 					;时钟脉冲
				DJNZ 	R3,RDBYTE1
				RET
;
;****************************************************************
;				/*写字节*/										*
;****************************************************************
;
WRBYTE:			MOV 	R3,#8
WRBYTE1:		RRC 	A
				MOV 	SDA,C
				CALL 	CLOCK
				DJNZ 	R3,WRBYTE1
				RET
;				
;****************************************************************
;				/*复位与应答*/									*
; 将得到4个字节的标头 0XA2,0X13,0X10,0X91						*
;****************************************************************
;
RST_ATR:		CLR 	RST
				CLR 	SCL
				CALL 	ICDELAY
				SETB 	RST
				CALL 	ICDELAY
				SETB 	SCL
				CALL 	ICDELAY
				CLR 	SCL
				CALL 	ICDELAY
				CLR 	RST
				CALL 	ICDELAY
				MOV 	R0,#ATRDATA
				MOV 	R4,#4					;4个字节的应答信号->ATRDATA
ATR:			CALL 	RDBYTE
				MOV 	@R0,A
				INC 	R0
				DJNZ 	R4,ATR
				RET
;
;****************************************************************
;				/*发送命令3字节*/								*
;****************************************************************
;
SENDCOMMAND:	SETB 	SCL						;START CONDITION
				CALL 	ICDELAY
				CLR 	SDA
				CALL 	ICDELAY
				CLR 	SCL
				
				MOV 	R0,#ICCOMMAND
				MOV 	R4,#3					;3个字节,命令、地址、数据
SENDCOMMAND1:	MOV 	A,@R0
				CALL 	WRBYTE
				INC 	R0
				DJNZ 	R4,SENDCOMMAND1
												;STOP CONDITION
				CLR 	SCL
				CLR 	SDA
				CALL 	ICDELAY
				SETB 	SCL
				CALL 	ICDELAY
				SETB 	SDA
				CALL 	ICDELAY
				CLR 	SCL
				CALL 	ICDELAY
				RET
;
;****************************************************************
;				/*读主存储区*/									*
;****************************************************************
;
RDMM:			CALL 	RST_ATR 		 		;复位与应答
				MOV 	ICCOMMAND,#RD_MAIN_RAM 
				CALL 	SENDCOMMAND
				MOV 	R0,#ICDATA
				MOV 	R4,ICLENGTH
RDMM1:			CALL 	RDBYTE
				MOV 	@R0,A
				INC 	R0
				DJNZ 	R4,RDMM1
				RET
;
;****************************************************************
;				/*读保护存储区*/								*
;****************************************************************
;
RDPM:			CALL 	RST_ATR
				MOV 	ICCOMMAND,#RD_P_RAM
				CALL 	SENDCOMMAND
				MOV 	R0,#ICDATA
				MOV 	R4,#4
RDPM1:			CALL 	RDBYTE
				MOV 	@R0,A
				INC 	R0
				DJNZ 	R4,RDPM
				RET
;
;****************************************************************
;				/*写主存储区*/									*
;****************************************************************
;
WRMM:			CALL 	RST_ATR
				MOV 	R5,ICLENGTH
				MOV 	ICCOMMAND,#WR_MAIN_RAM
				MOV 	R1,#ICDATA
WRMM1:			MOV 	ICDATAIN,@R1
				CALL 	SENDCOMMAND
				MOV 	R4,#0FFH
WRMM2:			CALL 	CLOCK
				DJNZ 	R4,WRMM2
				INC 	ICADDRESS
				INC 	R1
				DJNZ 	R5,WRMM1
				RET
;
;****************************************************************
;				/*写保护存储区*/								*
;****************************************************************
;
WRPM:			CALL 	RST_ATR 
				MOV 	R5,ICLENGTH
				MOV 	ICCOMMAND,#WR_P_RAM
				MOV 	R1,#ICDATA
WRPM1:			MOV 	ICDATAIN,@R1 
				CALL 	SENDCOMMAND 
				MOV 	R4,#0FFH
WRPM2:			CALL 	CLOCK
				DJNZ 	R4,WRPM2
				INC 	ICADDRESS
				INC 	R1
				DJNZ 	R5,WRPM1
				RET
;
;****************************************************************
;				/*读密码存储区*/								*
;****************************************************************
;
RDSM:			CALL 	RST_ATR
				MOV 	ICCOMMAND,#RD_PSC_RAM
				CALL 	SENDCOMMAND
				MOV 	R0,#ICDATA
				MOV 	R4,#4
RDSM1:			CALL 	RDBYTE
				MOV 	@R0,A
				INC 	R0
				DJNZ 	R4,RDSM1
				RET
;
;****************************************************************
;				/*读错误计数器,读出的数据在A中*/				*
;****************************************************************
;
RDSM_EC:		CALL 	RST_ATR
				MOV 	ICCOMMAND,#RD_PSC_RAM
				CALL 	SENDCOMMAND
				CALL 	RDBYTE
				RET
;
;****************************************************************
;				/*写密码存储区中的00单元*/						*
;****************************************************************
;
WRSM:			CALL 	RST_ATR
				MOV 	R5,#1
				MOV 	ICCOMMAND,#WR_PSC_RAM
				MOV 	R1,#ICDATA
WRSM1:			MOV 	ICDATAIN,@R1
				CALL 	SENDCOMMAND
				MOV 	R4,#0FFH
WRSM2:			CALL 	CLOCK
				DJNZ 	R4,WRSM2
				INC 	ICADDRESS
				INC 	R1
				DJNZ 	R5,WRSM1
				RET
;
;****************************************************************
;				/*更新密码*/									*
;****************************************************************
;
WRPSC:			CALL 	RST_ATR
				MOV 	R5,#3
				MOV 	ICCOMMAND,#WR_PSC_RAM
				MOV 	ICADDRESS,#01H
				MOV 	R1,#PSWORD
PSC1:			MOV 	ICDATAIN,@R1
				CALL 	SENDCOMMAND
				MOV 	R4,#0FFH
PSC2:			CALL 	CLOCK
				DJNZ 	R4,PSC2
				INC 	ICADDRESS
				INC 	R1
				DJNZ 	R5,PSC1
				RET
;
;****************************************************************	
;				/*比较验证数据(3个字节的密码)*/					*
;****************************************************************
;
SENDPSC: 		MOV 	R5,#3					;字节数
				MOV 	ICCOMMAND,#COMP_PSC_RAM
				MOV 	ICADDRESS,#01H			;起始地址
				MOV 	R1,#PSWORD
PSC21:			MOV 	ICDATAIN,@R1
				CALL 	SENDCOMMAND				;命令、地址、数据
				MOV 	R4,#123 
PSC22:			CALL 	CLOCK
				DJNZ 	R4,PSC22
				INC 	ICADDRESS
				INC 	R1
				DJNZ 	R5,PSC21
				RET
;
;****************************************************************
;				/*校验密码*/									*
;****************************************************************
;
VERIFY:			CALL 	RDSM_EC					;读出误码计数器内容->A
				ANL 	A,#07H					;判断误码计数器内容
				CJNE 	A,#00H,VERI1
				RET
VERI1:			CJNE 	A,#07H,VERI21
				MOV 	A,#03H
				SJMP 	VERI2
VERI21:			CJNE 	A,#06H,VERI22
				MOV 	A,#02H
				SJMP 	VERI2
VERI22:			CJNE 	A,#05H,VERI23
				MOV 	A,#01H
				SJMP 	VERI2
VERI23:			CJNE 	A,#04H,VERI24
				MOV 	A,#00H
				SJMP 	VERI2
VERI24:			CJNE 	A,#03H,VERI25
				MOV 	A,#01H
				SJMP 	VERI2
VERI25:			MOV 	A,#00H
VERI2:			MOV 	ICDATA,A
				MOV 	ICADDRESS,#00H
				CALL 	WRSM					;更新误码计数器内容
				CALL 	SENDPSC					;比较三字节密码
				MOV 	ICDATA,#07H 
				MOV 	ICADDRESS,#00H
				CALL 	WRSM					;擦除误码计数器中的内容
				CALL 	RDSM_EC					;读误码计数器内容
				ANL 	A,#07H
				RET
;
;****************************************************************		
;				/*显示子程序*/									*
;****************************************************************
;
DISP:			MOV		A,R0					;低位
				ANL		A,#0FH
				ACALL	DSEND					;显示
				MOV		A,R0
				SWAP	A
				ANL		A,#0FH					;高位
				ACALL	DSEND					;显示
				RET

DSEND:			MOV		DPTR,#SGTB1
				MOVC	A,@A+DPTR				;取字符
				MOV		SBUF,A	    			;发送字符
			
				JNB		TI,$					;等待串口发送完
				CLR		TI
				RET
;
;****************************************************************		
;				/*延时程序*/									*
;****************************************************************	
;		
DELAY:			MOV		R4,#250					;延时
DELAY1:			MOV		R5,#250
				DJNZ	R5,$
				DJNZ	R4,DELAY1
				RET
		
DELAY1S:		MOV		R7,#0FFH
				DJNZ	R7,$
				RET
;
;****************************************************************	
;				/*字符编码*/									*
;****************************************************************
;				
SGTB1:			DB	     03H        			;0
		   		DB	     9FH         			;1
		  	 	DB	     25H         			;2
		  	 	DB	     0DH         			;3
		  	 	DB	     99H          			;4
		  	 	DB	     49H          			;5
		 	  	DB	     41H          			;6
		  	 	DB	     1FH         			;7
		 	  	DB	     01H          			;8
		  		DB	     09H          			;9
		  		DB	     11H          			;A
		   		DB	     0C1H          			;B
		  	 	DB	     63H         			;C
		   		DB	     85H         			;D
		   		DB	     61H          			;E
		   		DB	     71H          			;F
		   		DB	     00H								
	
				END

⌨️ 快捷键说明

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