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

📄 88sc1608读写子程序.txt

📁 ATMEL 88SC1608读写子程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
; 30H=#03H,正确 ; 30H=#04H,卡不反应
; 数据放入@R0
;--------------------------------------------------------------------
RCZ: MOV 31H,33H
MOV R0,#32H
LCALL START
MOV A,#0B5H
LCALL SPOUT
JC ER3
MOV A,32H
LCALL SPOUT
JC ER3
MOV R3,33H
RCZ1: DEC R3
CJNE R3,#00H,RCZ2
SJMP RCZ3
RCZ2: LCALL SPIN ;读一个数据到A,有回答信号
MOV @R0,A
INC R0
SJMP RCZ1
RCZ3: LCALL SPIN2 ;读一个数据到A,没有回答信号
MOV @R0,A
LCALL STOP
MOV 30H,#03H
RET
ER3: MOV 30H,#04H
MOV 31H,#00H
RET
;--------------------------------------------------------------------
;WR1608: 写数据子程序 Write data (ATMEL 1608/153)
; 31H: 写用户区和写Configuration区标志
; (01:写用户区地址;00:写Configuration区;02:写ATMEL 88SC153)
; 32H: 写地址; 33H: 用户区写数据字节数
; 30H=#03H,正确 ; 30H=#04H,卡不反应
; 数据放入@R0
;--------------------------------------------------------------------
WR1608:MOV R0,#34H
MOV A,33H
DEC A
ADD A,32H
JNC WR1
MOV 30H,#01H ;地址超出分区,返回错误代码
RET
WR1: MOV A,32H ;判断起始地址低4(3)位是否为全'0'
MOV R2,A
ANL A,25H
JZ WR2
SETB C
SUBB A,26H
CPL A
MOV B,A
CLR C
SUBB A,33H
JNC WR2
CLR C
MOV A,33H
SUBB A,B
MOV 33H,A
MOV R3,B
MOV A,31H
JZ WR10
CJNE A,#01H,WR13
ACALL WUZ
SJMP WR11
WR13: LCALL WR153
SJMP WR11
WR10: ACALL WCZ
WR11: MOV A,30H
CJNE A,#04H,WR12 ;卡不反应,返回
RET
WR12: LCALL WAIT10 ;调延时子程序10MS
MOV A,R2 ;计算EEPROM地址
ADD A,B
MOV R2,A
WR2: MOV A,33H
MOV B,26H
DIV AB
MOV R7,A ;R7--循环次数
JZ WR3
WR21: MOV R3,26H ;写字节数/页
MOV A,31H
JZ WR22
CJNE A,#01H,WR25
ACALL WUZ
SJMP WR23
WR25: ACALL WR153
SJMP WR23
WR22: ACALL WCZ
WR23: MOV A,30H
CJNE A,#04H,WR24 ;卡不反应,返回
RET
WR24: LCALL WAIT10 ;调延时子程序10MS
MOV A,R2 ;计算EEPROM地址
ADD A,26H
MOV R2,A
DJNZ R7,WR21
WR3: MOV A,B ;余数->A
JZ WR33
MOV R3,B
MOV A,31H
JZ WR31
CJNE A,#01H,WR34
ACALL WUZ
SJMP WR32
WR34: ACALL WR153
SJMP WR32
WR31: ACALL WCZ
WR32: LCALL WAIT10 ;调延时子程序10MS
WR33: RET
;--------------------------------------------------------------------
; WUZ: 写用户区数据 Write User Zone
; R2:写地址 R3: 写数据字节数
; 30H=#03H,正确 ; 30H=#04H,卡不反应
; 数据放入@R0
;--------------------------------------------------------------------
WUZ: LCALL START
MOV A,#0B0H
LCALL SPOUT
JC ER4
MOV A,R2
LCALL SPOUT
JC ER4
WUZ1: MOV A,@R0
LCALL SPOUT ;写一个数据
JC ER4
INC R0
DJNZ R3,WUZ1
LCALL STOP
MOV 30H,#03H
RET
ER4: MOV 30H,#04H
RET
;--------------------------------------------------------------------
; WCZ: 写用户区数据 Write Configuration Zone
; R2: 低位地址 R3: 写数据字节数
; 30H=#03H,正确 ; 30H=#04H,卡不反应
; 数据放入@R0
;--------------------------------------------------------------------
WCZ: LCALL START
MOV A,#0B4H
LCALL SPOUT
JC ER5
MOV A,R2
LCALL SPOUT
JC ER5
WCZ1: MOV A,@R0
LCALL SPOUT ;写一个数据
JC ER5
INC R0
DJNZ R3,WCZ1
LCALL STOP
MOV 30H,#03H
RET
ER5: MOV 30H,#04H
RET
;--------------------------------------------------------------------
; RD153: 读数据 Read Data (ATMEL 88SC153)
; 32H: 用户区低位地址 33H: 用户区读数据字节数
; 30H=#03H,正确 ; 30H=#04H,卡不反应
; 数据放入@R0
;--------------------------------------------------------------------
RD153: MOV 31H,33H
MOV R0,#32H
LCALL START
MOV A,32H
ANL A,#0C0H
SWAP A
ORL A,#0B1H
LCALL SPOUT
JC ER21
MOV A,32H
LCALL SPOUT
JC ER21
MOV R3,33H
RD153_1: DEC R3
CJNE R3,#00H,RD153_2
SJMP RD153_3
RD153_2: LCALL SPIN ;读一个数据到A,有回答信号
MOV @R0,A
INC R0
SJMP RD153_1
RD153_3: LCALL SPIN2 ;读一个数据到A,没有回答信号
MOV @R0,A
LCALL STOP
MOV 30H,#03H
RET
ER21: MOV 30H,#04H
MOV 31H,#00H
RET
;--------------------------------------------------------------------
; WR153: 写用户区数据 Write Data
; R2: 低位地址 R3: 写数据字节数
; 30H=#03H,正确 ; 30H=#04H,卡不反应
; 数据放入@R0
;--------------------------------------------------------------------
WR153: LCALL START
MOV A,R2
ANL A,#0C0H
SWAP A
ORL A,#0B0H
LCALL SPOUT
JC ER51
MOV A,R2
LCALL SPOUT
JC ER51
WR153_1: MOV A,@R0
LCALL SPOUT ;写一个数据
JC ER51
INC R0
DJNZ R3,WR153_1
LCALL STOP
MOV 30H,#03H
RET
ER51: MOV 30H,#04H
RET
;--------------------------------------------------------------------
; RF: 读熔断丝 Read Fuses
; 30H=#03H,正确 ; 30H=#04H,卡不反应
; 数据放入@R0
;--------------------------------------------------------------------
RF: MOV R0,#32H
LCALL START
MOV A,#0B5H
LCALL SPOUT
JC ER6
MOV A,#80H ;Fuses Address
LCALL SPOUT
JC ER6
LCALL SPIN2 ;读一个数据到A,没有回答信号
MOV @R0,A
LCALL STOP
MOV 30H,#03H
MOV 31H,#01H
RET
ER6: MOV 30H,#04H
MOV 31H,#00H
RET
;--------------------------------------------------------------------
; RF153:读熔断丝 Read Fuses (AT88SC153)
; 30H=#03H,正确 ; 30H=#04H,卡不反应
; 数据放入@R0
;--------------------------------------------------------------------
RF153: MOV R0,#32H
LCALL START
MOV A,#0BEH
LCALL SPOUT
JC ER61
LCALL SPIN2 ;读一个数据到A,没有回答信号
MOV @R0,A
LCALL STOP
MOV 30H,#03H
MOV 31H,#01H
RET
ER61: MOV 30H,#04H
MOV 31H,#00H
RET
;--------------------------------------------------------------------
; WF: 写熔断丝 Write Fuses
; 30H=#00H,正确 ; 30H=#04H,卡不反应
;
;--------------------------------------------------------------------
WF: LCALL START
MOV A,#0B4H
LCALL SPOUT
JC ER7
MOV A,#80H ;Fuses Address
LCALL SPOUT
JC ER7
LCALL STOP
MOV 30H,#03H
RET
ER7: MOV 30H,#04H
RET
;--------------------------------------------------------------------
; WF153:写熔断丝 Write Fuses (AT88SC153)
; 30H=#00H,正确 ; 30H=#04H,卡不反应
; @R0:熔断数据(01H:Blow FAB;02H:Blow CMA;04H:Blow PER)
;--------------------------------------------------------------------
WF153: LCALL START
MOV A,#0BAH
LCALL SPOUT
JC ER71
MOV A,31H ;Fuses Index
LCALL SPOUT
JC ER71
LCALL STOP
MOV 30H,#03H
RET
ER71: MOV 30H,#04H
RET
;--------------------------------------------------------------------
; VP: 校验密码 Verify Password
; 31H: 密码索引 @R0:密码
;--------------------------------------------------------------------
VP: MOV R0,#32H
LCALL START
MOV A,#0B3H
LCALL SPOUT
JC ER8
MOV A,31H
LCALL SPOUT
JC ER8
MOV R3,#03H
VP1: MOV A,@R0
LCALL SPOUT
JC ER8
INC R0
DJNZ R3,VP1
LCALL STOP
LCALL WAIT10 ;延时10MS
MOV A,31H ;计算该密码的错误计数器地址
ANL A,#07H ;
RL A ;*8
RL A
RL A
ADD A,#40H
MOV 32H,A
MOV A,31H
ANL A,#08H
JZ VP2 ;写密码,转VP2
MOV A,32H ;写密码地址+4=读密码地址
ADD A,#04H
MOV 32H,A
VP2: MOV 33H,#01H ;读字节数
LCALL RCZ
MOV A,30H
CJNE A,#03H,ER8
MOV A,32H
CJNE A,#0FFH,VP3
MOV 30H,#03H ;密码校验正确
MOV 31H,#00H
RET
VP3: MOV 30H,#04H
MOV 31H,#01H
RET
ER8: MOV 30H,#04H
MOV 31H,#00H
RET
;--------------------------------------------------------------------
; VP153: 校验密码 Verify Password (ATMEL 88SC153)
; 31H: 密码索引 @R0:密码
; 31H: 000000rp
; r=0: Write password
; r=1: Read password
; p : Password set number
;--------------------------------------------------------------------
VP153: MOV R2,#02H
VP153_0: MOV R0,#32H
LCALL START
MOV A,31H
RL A
RL A
ORL A,#0B3H
LCALL SPOUT
JC ER81
MOV R3,#03H
VP153_1: MOV A,@R0
LCALL SPOUT
JC ER81
INC R0
DJNZ R3,VP153_1
LCALL STOP
LCALL WAIT10 ;延时10MS
DJNZ R2,VP153_0
MOV A,31H ;计算该密码的错误计数器地址
ANL A,#01H ;
RL A ;*8
RL A
RL A
ADD A,#0F0H
MOV 32H,A
MOV A,31H
ANL A,#02H
JZ VP153_2 ;写密码,转VEP2
MOV A,32H ;写密码地址+4=读密码地址
ADD A,#04H
MOV 32H,A
VP153_2: MOV 33H,#01H ;读字节数
LCALL RD153
MOV A,30H
CJNE A,#03H,ER81
MOV A,32H
CJNE A,#0FFH,VP153_3
MOV 30H,#03H ;密码校验正确
MOV 31H,#00H
RET
VP153_3: MOV 30H,#04H
MOV 31H,#01H
RET
ER81: MOV 30H,#04H
MOV 31H,#00H
RET
;--------------------------------------------------------------------
; IA: 初始认证 Initialize Authentication
; @R0: 8字节Q0
;--------------------------------------------------------------------
IA: ACALL START
MOV A,23H
CJNE A,#0A2H,IA0
MOV A,#0B6H
SJMP IA01
IA0: CJNE A,#0A3H,ER9
MOV A,#0B2H
IA01: ACALL SPOUT
JC ER9
MOV R3,#08H
IA1: MOV A,@R0
ACALL SPOUT
JC ER9
INC R0DJNZ R3,IA1
ACALL STOP
MOV 30H,#03H
RET
ER9: MOV 30H,#04H
RET
;--------------------------------------------------------------------
; VA: 校验认证 Verify Authentication
; @R0: 8字节校验密码 Ci+1(Q1)
;--------------------------------------------------------------------
VA: ACALL START
MOV A,23H
CJNE A,#0A2H,VA0
MOV A,#0B7H
SJMP VA01
VA0: CJNE A,#0A3H,ER10
MOV A,#0B6H
VA01: ACALL SPOUT
JC ER10
MOV R3,#08H
VA1: MOV A,@R0
ACALL SPOUT
JC ER10
INC R0
DJNZ R3,VA1
ACALL STOP
MOV 30H,#03H
RET
ER10: MOV 30H,#04H
RET
;--------------------------------------------------------------------
; 输出子程序
; A: 输出数据 R4:循环次数
; P1.1: SCL P1.2: SDA P1.0: 上电
;--------------------------------------------------------------------
SPOUT: MOV R4,#08H ;设置循环次数
SETB C ;C=0
SPOUT1: RLC A ;A 循环左移
MOV P1.2,C ;SDA=P1.X(OUTPUT)
NOP
NOP
SETB P1.1 ;SCL=1
NOP
NOP
NOP
NOP
CLR P1.1 ;SCL=0
DJNZ R4,SPOUT1 ;R4<>0,循环
RLC A
SETB P1.2 ;SDA=1
NOP
SETB P1.1 ;SCL=1
NOP
NOP
MOV C,P1.2 ;接收回答信号到C
NOP
CLR P1.1 ;SCL=0
NOP
RET
;--------------------------------------------------------------------
; 输入子程序
; A: 输入数据 R4:循环次数
; P1.1: SCL P1.2: SDA P1.0: 上电
;--------------------------------------------------------------------
SPIN: MOV R4,#08H ;设置循环次数
SETB P1.2 ;SDA=1
SPIN1: NOP
NOP
SETB P1.1 ;SCL=1
NOP
NOP
MOV C,P1.2 ;输入1位数据到C
RLC A ;A 循环左移
CLR P1.1 ;SCL=0
DJNZ R4,SPIN1 ;R4<>0,循环
CLR P1.2 ;SDA=0,发送回答信号
NOP
NOP
SETB P1.1 ;SCL=1
NOP
NOP
NOP
NOP
CLR P1.1 ;SCL=0
SETB P1.2 ;SDA=1
RET
;--------------------------------------------------------------------
; 输入子程序
; A: 输入数据 R4:循环次数
; P1.1: SCL P1.2: SDA P1.0: 上电
;--------------------------------------------------------------------
SPIN2: MOV R4,#08H ;设置循环次数
SETB P1.2 ;SDA=1
SPIN3: NOP
NOP
SETB P1.1 ;SCL=1
NOP
NOP
MOV C,P1.2 ;输入1位数据到C
RLC A ;A 循环左移
CLR P1.1 ;SCL=0
DJNZ R4,SPIN3 ;R4<>0,循环
SETB P1.2 ;SDA=1,没有回答信号
NOP
NOP
SETB P1.1 ;SCL=1
NOP
NOP
NOP
NOP
CLR P1.1 ;SCL=0
RET
;--------------------------------------------------------------------
; START: 开始信号子程序
; 功能:
;--------------------------------------------------------------------
START: CLR P1.2 ;SDA IS LOW
CLR P1.1 ;SCL IS LOW
NOP
NOP
SETB P1.2 ;SDA IS HIGH
NOP
NOP
SETB P1.1 ;SCL IS HIGH ,START
NOP
NOP
CLR P1.2 ;SDA IS LOW
NOP
NOP
CLR P1.1 ;SCL IS LOW
RET
;--------------------------------------------------------------------
; STOP: 停止信号子程序
; 功能:
;--------------------------------------------------------------------
STOP: CLR P1.2 ;SDA IS LOW
SETB P1.1 ;SCL IS HIGH
NOP
NOP
SETB P1.2 ;SDA IS HIGH
NOP
NOP
CLR P1.1 ;SCL IS LOW ,STOP
NOP
NOP
CLR P1.2 ;SDA IS LOW
RET
;--------------------------------------------------------------------
; WAIT10: 延时子程序
; R5: 毫秒数
;--------------------------------------------------------------------
WAIT10: MOV R5,#0AH
WAIT101: MOV R6,#0FAH
WAIT102: NOP
NOP
DJNZ R6,WAIT102
DJNZ R5,WAIT101
RET

⌨️ 快捷键说明

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