📄 ic.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 + -