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