?? 88sc1608讀寫子程序.txt
字號:
; 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 + -