?? snt-c485.asm
字號:
ECOMM4: MOV A,R5 ;暫存表地址A3
MOV DBADR3,A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
ECOMM5: MOV A,R5 ;暫存表地址A2
MOV DBADR2,A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
ECOMM6: MOV A,R5 ;暫存表地址A1
MOV DBADR1,A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
ECOMM7: MOV A,R5 ;暫存表地址A0
MOV DBADR0,A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
ECOMM7A: LJMP ECOMMF
ECOMM8: MOV A,R5 ;判控制字
CJNE A,#04H,ECOMM7A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
ECOMM9: MOV A,R5 ;判數據長度
CJNE A,#04H,ECOMM7A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
ECOMMA: MOV A,R5 ;判數據標識A0H
CJNE A,#0A0H,ECOMM7A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
ECOMMB: MOV A,R5 ;判數據標識17H
CJNE A,#17H,ECOMM7A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
ECOMMC: MOV A,R5 ;判序列號
CJNE A,SERNO,ECOMM7A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
ECOMMD: MOV A,R5 ;判數據
CJNE A,#55H,ECOMMDA
LJMP ECOMMDB
ECOMMDA: CJNE A,#0AAH,ECOMM7A
ECOMMDB: ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
ECOMME: MOV A,R5 ;判校驗和
MOV B,A
MOV A,R3
CJNE A,B,ECOMM7A
INC RECCNT
LJMP RETURN
ECOMMF: MOV A,R5 ;判結束符
CJNE A,#16H,ECOMMG
MOV R0,#BADD5
MOV R1,#DBADR5
MOV R2,#6
ECOMMFA: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,ECOMMFA
SETB DBREAD_F ;置位讀表標志
SETB REC_COMM ;置收到新命令標志
MOV COMMTYPE,#0
MOV RECCNT,#0
LJMP RETURN
ECOMMG: MOV COMMTYPE,#0
MOV RECCNT,#0
LJMP RETURN
;*********************讀表地址部分***************
ECOMMH: LJMP GCOMM
FCOMM: CJNE A,#05H,ECOMMH
MOV A,RECCNT ;讀表地址
CLR C
SUBB A,#03H
RL A
MOV DPTR,#FCOMM1
JMP @A+DPTR
FCOMM1: AJMP FCOMM2 ;數據長度
AJMP FCOMM3 ;采集器地址A6
AJMP FCOMM4 ;采集器地址A5
AJMP FCOMM5 ;采集器地址A4
AJMP FCOMM6 ;采集器地址A3
AJMP FCOMM7 ;采集器地址A2
AJMP FCOMM8 ;采集器地址A1
AJMP FCOMM9 ;采集器地址A0
AJMP FCOMMA ;校驗和
AJMP FCOMMB ;結束符16H
FCOMM2: MOV A,R5 ;判數據長度
CJNE A,#07H,FCOMMC
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
FCOMM3: MOV A,R5 ;判采集器地址A6
CJNE A,CK_ADDR6,FCOMMC
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
FCOMM4: MOV A,R5 ;判采集器地址A5
CJNE A,CK_ADDR5,FCOMMC
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
FCOMM5: MOV A,R5 ;判采集器地址A4
CJNE A,CK_ADDR4,FCOMMC
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
FCOMM6: MOV A,R5 ;判采集器地址A3
CJNE A,CK_ADDR3,FCOMMC
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
LJMP RETURN
FCOMM7: MOV A,R5 ;判采集器地址A2
CJNE A,CK_ADDR2,FCOMMC
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
FCOMM8: MOV A,R5 ;判采集器地址A1
CJNE A,CK_ADDR1,FCOMMC
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
FCOMM9: MOV A,R5 ;判采集器地址A0
CJNE A,CK_ADDR0,FCOMMC
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
FCOMMA: MOV A,R5 ;判校驗和
MOV B,A
MOV A,R3
CJNE A,B,FCOMMC
INC RECCNT
LJMP RETURN
FCOMMB: MOV A,R5 ;判結束符
CJNE A,#16H,FCOMMC
SETB ADDR_READ ;置讀表地址標志
SETB REC_COMM ;置收到新命令標志
MOV COMMTYPE,#0
MOV RECCNT,#0
LJMP RETURN
FCOMMC: MOV COMMTYPE,#0
MOV RECCNT,#0
LJMP RETURN
;*********************寫表地址部分******************
FCOMMD: LJMP HCOMM
GCOMM: CJNE A,#06H,FCOMMD
MOV A,RECCNT ;寫表地址
CLR C
SUBB A,#03H
MOV B,A
RL A
ADD A,B
MOV DPTR,#GCOMM1
JMP @A+DPTR
GCOMM1: LJMP GCOMM2 ;數據長度
LJMP GCOMM3 ;地址A6
LJMP GCOMM4 ;地址A5
LJMP GCOMM5 ;地址A4
LJMP GCOMM6 ;地址A3
LJMP GCOMM7 ;地址A2
LJMP GCOMM8 ;地址A1
LJMP GCOMM9 ;地址A0
LJMP GCOMMA ;表地址A5
LJMP GCOMMB ;表地址A4
LJMP GCOMMC ;表地址A3
LJMP GCOMMD ;表地址A2
LJMP GCOMME ;表地址A1
LJMP GCOMMF ;表地址A0
LJMP GCOMMG ;校驗和
LJMP GCOMMH ;結束符16H
GCOMM1A: LJMP GCOMMI
GCOMM2: MOV A,R5 ;判數據長度
CJNE A,#0DH,GCOMM1A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
GCOMM3: MOV A,R5 ;判采集器地址A6
CJNE A,CK_ADDR6,GCOMM1A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
GCOMM4: MOV A,R5 ;判采集器地址A5
CJNE A,CK_ADDR5,GCOMM1A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
GCOMM5: MOV A,R5 ;判采集器地址A4
CJNE A,CK_ADDR4,GCOMM1A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
GCOMM6: MOV A,R5 ;判采集器地址A3
CJNE A,CK_ADDR3,GCOMM1A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
LJMP RETURN
GCOMM7: MOV A,R5 ;判采集器地址A2
CJNE A,CK_ADDR2,GCOMM1A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
GCOMM8: MOV A,R5 ;判采集器地址A1
CJNE A,CK_ADDR1,GCOMM1A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
GCOMM9: MOV A,R5 ;判采集器地址A0
CJNE A,CK_ADDR0,GCOMM1A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
GCOMMA: MOV A,R5 ;暫存表地址A5
MOV DBADR5,A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
GCOMMB: MOV A,R5 ;暫存表地址A4
MOV DBADR4,A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
GCOMMC: MOV A,R5 ;暫存表地址A3
MOV DBADR3,A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
GCOMMD: MOV A,R5 ;暫存表地址A2
MOV DBADR2,A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
GCOMME: MOV A,R5 ;暫存表地址A1
MOV DBADR1,A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
GCOMMF: MOV A,R5 ;暫存表地址A0
MOV DBADR0,A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
GCOMMG: MOV A,R5 ;判校驗和
MOV B,A
MOV A,R3
CJNE A,B,GCOMMI
INC RECCNT
LJMP RETURN
GCOMMH: MOV A,R5 ;判結束符
CJNE A,#16H,GCOMMI
MOV R0,#BADD5
MOV R1,#DBADR5
MOV R2,#6
GCOMMHA: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,GCOMMHA
SETB ADDR_WR ;置寫表地址標志
SETB REC_COMM ;置收到新命令標志
MOV COMMTYPE,#0
MOV RECCNT,#0
LJMP RETURN
GCOMMI: MOV COMMTYPE,#0
MOV RECCNT,#0
LJMP RETURN
;********************抄表命令部分***************
HCOMM: CJNE A,#07H,HCOMM2A
MOV A,RECCNT ;讀表地址
CLR C
SUBB A,#03H
RL A
MOV DPTR,#HCOMM1
JMP @A+DPTR
HCOMM1: AJMP HCOMM2 ;數據長度
AJMP HCOMM3 ;采集器地址A6
AJMP HCOMM4 ;采集器地址A5
AJMP HCOMM5 ;采集器地址A4
AJMP HCOMM6 ;采集器地址A3
AJMP HCOMM7 ;采集器地址A2
AJMP HCOMM8 ;采集器地址A1
AJMP HCOMM9 ;采集器地址A0
AJMP HCOMMA ;校驗和
AJMP HCOMMB ;結束符16H
HCOMM2: MOV A,R5 ;判數據長度
CJNE A,#07H,HCOMM2A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
HCOMM2A: LJMP HCOMMC
HCOMM3: MOV A,R5 ;判采集器地址A6
CJNE A,CK_ADDR6,HCOMM2A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
HCOMM4: MOV A,R5 ;判采集器地址A5
CJNE A,CK_ADDR5,HCOMM2A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
HCOMM5: MOV A,R5 ;判采集器地址A4
CJNE A,CK_ADDR4,HCOMM2A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
HCOMM6: MOV A,R5 ;判采集器地址A3
CJNE A,CK_ADDR3,HCOMM2A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
LJMP RETURN
HCOMM7: MOV A,R5 ;判采集器地址A2
CJNE A,CK_ADDR2,HCOMM2A
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
HCOMM8: MOV A,R5 ;判采集器地址A1
CJNE A,CK_ADDR1,HCOMMC
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
HCOMM9: MOV A,R5 ;判采集器地址A0
CJNE A,CK_ADDR0,HCOMMC
ADD A,R3
MOV R3,A
INC RECCNT
LJMP RETURN
HCOMMA: MOV A,R5 ;判校驗和
MOV B,A
MOV A,R3
CJNE A,B,HCOMMC
INC RECCNT
LJMP RETURN
HCOMMB: MOV A,R5 ;判結束符
CJNE A,#16H,HCOMMC
SETB CHAOBIAO ;置抄表標志
MOV SENDCNT,#0
MOV COMMTYPE,#0
MOV RECCNT,#0
LJMP RETURN
HCOMMC: MOV COMMTYPE,#0
MOV RECCNT,#0
LJMP RETURN
RETURN: POP TEMP
POP PSW
POP DPL
POP DPH
POP B
POP ACC
SETB ES
RETI
;*************************************************************
;從24C08A中讀1字節子程序
;入口: C,DPTR(地址),出口:A(數據)
;*************************************************************
READ_1:
SETB SDA
SETB SCL
LCALL DELAY
CLR SDA ;開始信號
LCALL DELAY
CLR C
MOV A,DPH
RL A
ORL A,#SCMD ;為寫命令
LCALL SEND
MOV C,SDA
JC READ_1
;判斷是否應答,高電平為無應答,低則應答,無應答則復位,從新開始
MOV A,DPL ;低字節首地址
LCALL SEND
LCALL DELAY
RE_1: MOV C,SDA
JC RE_1 ;是否應答
LCALL DELAY ;如果下邊的程序不能執行,則加一個時間循環,
CLR SCL ;此為寫循環周期,需要一定時間
LCALL DELAY
SETB SDA
LCALL DELAY
SETB SCL
LCALL DELAY
CLR SDA ;又一個開始信號
LCALL DELAY
MOV A,#RCMD
LCALL SEND
LCALL DELAY
RE_2: MOV C,SDA
JC RE_2 ;是否應答
LCALL DELAY
MOV A,#0 ;清A
CLR C ;清C
MOV R4,#8 ;循環次數
RE_3: SETB SCL ;開始接收
LCALL DELAY
CLR SCL ;下降沿輸出數據
LCALL DELAY
MOV C,SDA
RLC A ;將C中數據移到A中
DJNZ R4,RE_3 ;接收循環(EEPROM輸出數據)
CLR SDA
LCALL DELAY
SETB SCL
LCALL DELAY
SETB SDA ;時鐘為高電平,SDA由低變高是停止信號
RET
;*************************************************************
;向24C08A中寫1字節子程序
;入口: A,C,DPTR(地址)
;*************************************************************
WRITE_1: CLR WRP ;允許寫
PUSH ACC
WR_0: LCALL START ;開始信號
MOV A,DPH
RL A
ORL A,#SCMD ;發寫命令(含高2位地址)
LCALL SEND
LCALL DELAY
WR_1: MOV C,SDA ;應答
JC WR_0
MOV A,DPL ;發低8位地址
LCALL SEND
LCALL DELAY
WR_2: MOV C,SDA ;應答
JC WR_2
POP ACC
LCALL SEND ;發要寫數據
LCALL DELAY
WR_3: MOV C,SDA ;應答
JC WR_3
CLR SCL
LCALL DELAY
CLR SDA ;SCL為高,SDA上升沿為停止信號
LCALL DELAY
SETB SCL
LCALL DELAY
SETB SDA
SETB WRP ;禁止寫
RET
;**********************************************************
;從24C08A中連續讀字節子程序
;入口: C,DPTR(地址),R3(字節個數),出口:R0(數據塊存儲首地址)
;**********************************************************
READ_BL:
SETB SDA
SETB SCL
LCALL DELAY
CLR SDA ;開始信號
LCALL DELAY
CLR C
MOV A,DPH
RL A
ORL A,#SCMD ;為寫命令
LCALL SEND
MOV C,SDA
JC READ_BL
;判斷是否應答,高電平為無應答,低則應答,無應答則復位,從新開始
MOV A,DPL ;低字節地址
LCALL SEND
LCALL DELAY
RE_1B: MOV C,SDA
JC RE_1B ;是否應答
LCALL DELAY ;如果下邊的程序不能執行,則加一個時間循環,
RE_4B: CLR SCL ;此為寫循環周期,需要一定時間
LCALL DELAY
SETB SDA
LCALL DELAY
SETB SCL
LCALL DELAY
CLR SDA ;又一個開始信號
LCALL DELAY
MOV A,#RCMD
LCALL SEND
LCALL DELAY
RE_2B: MOV C,SDA
JC RE_2B ;是否應答
LCALL DELAY
MOV A,#0 ;清A
CLR C ;清C
MOV R4,#8 ;循環次數
RE_3B: SETB SCL ;開始接收
LCALL DELAY
CLR SCL ;下降沿輸出數據
LCALL DELAY
MOV C,SDA
RLC A ;將C中數據移到A中
DJNZ R4,RE_3B ;接收循環(EEPROM輸出數據)
CLR SDA
LCALL DELAY
SETB SCL
LCALL DELAY
SETB SDA ;時鐘為高電平,SDA由低變高是停止信號
MOV @R0,A
INC R0
DJNZ R3,RE_4B
CLR SDA
LCALL DELAY
SETB SCL
LCALL DELAY
SETB SDA ;時鐘為高電平,SDA由低變高是停止信號
RET
;**********************************************************
;向24C08A中連續寫數據子程序
;入口: C,DPTR(地址),R3(字節個數),R0(數據塊存儲首地址)
;**********************************************************
WRITE_B:
CLR WRP
LCALL DELAY ;
SETB SDA ;開始信號
SETB SCL
LCALL DELAY
CLR SDA
CLR C
MOV A,DPH
RL A
ORL A,#SCMD ;為寫命令
LCALL SEND
MOV C,SDA
JC WRITE_B ;是否應答
MOV A,DPL ;低字節首地址
LCALL SEND
WR_1B: MOV C,SDA
JC WR_1B ;是否應答
WR_2B:
MOV A,@R0 ;數據
LCALL SEND
WR_3B: MOV C,SDA
JC WR_3B ;是否應答
INC R0
DJNZ R3,WR_2B
LCALL DELAY
CLR SCL
LCALL DELAY
CLR SDA
LCALL DELAY
SETB SCL
LCALL DELAY
SETB SDA ;停止信號,SDA由低變高,SCL處于高電平
SETB WRP
RET
;***********開始信號
START:
SETB SDA
LCALL DELAY
SETB SCL
LCALL DELAY
CLR SDA
RET
;**************發送1個字節
SEND:
MOV R4,#08H
SEND0:
CLR SCL
RLC A
MOV SDA,C
LCALL DELAY
SETB SCL
LCALL DELAY
DJNZ R4,SEND0
CLR SCL
LCALL DELAY
SETB SDA
LCALL DELAY
SETB SCL
RET
;****************延時子程序
DELAY: NOP
NOP
NOP
RET
DELAY_1S: MOV YSRES1,#04H ;500MS延時
DEY_1: MOV YSRES2,#0E0H
DEY_2: MOV YSRES3,#0
DEY_3: DJNZ YSRES3,DEY_3
DJNZ YSRES2,DEY_2
DJNZ YSRES1,DEY_1
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -