📄 e2rom134.asm
字号:
/*写一个字节进E2ROM*/
SDA BIT P0.2;数据读写线
SCL BIT P0.1;CLK脉冲信号线
ACK BIT 00H ;应答标志
DA_START DATA 40H;数据存储初始地址
SCTR DATA 41H ;1110地址
SADD DATA 42H;1110寄存器配置值
AUXR1 DATA 0A2H;
P0M1 DATA 84H
P0M2 DATA 85H
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV AUXR1,#40H
MOV SP,#50H ;设置堆栈
MOV R0,#20H
ZERO:
MOV @R0,#0
INC R0
CJNE R0,#23H,ZERO
MOV SADD,#00000000B/*1110register 配置值,sbua。7=1 转换的开始, sbua.6 sbua.5 保留位=00,sbua.4=1单周期转换
sbua.3.2=11,15sps , sbua.1.0=00,gain=1*/
MOV DA_START,#20H
MOV P0M1,#00000000B
MOV P0M2,#00000110B
AD_START:
LCALL START
MOV SCTR,#10101110B; 1001aaa wr/r, 如果为ads1110a0,aaa为000 如果为ads1110a3 ,则为011;sla.0=0 write
MOV A,SCTR ;控制字(写)
LCALL WR_DB
LCALL CACK
JNB ACK,AD_START
MOV A,SADD ;写地址
LCALL WR_DB
LCALL CACK
JNB ACK,AD_START
MOV A,#072H ;写数值
LCALL WR_DB
LCALL CACK
JNB ACK,AD_START
MOV A,#079H ;写数值
LCALL WR_DB
LCALL CACK
JNB ACK,AD_START
MOV A,#065H ;写数值
LCALL WR_DB
LCALL CACK
JNB ACK,AD_START
LCALL STOP
;++++++++++++++++++++++++++++++DU+++++++++++++++++++++++++
AD_SD:LCALL START
MOV A,SCTR ;控制字(写)
LCALL WR_DB
LCALL CACK
JNB ACK,AD_SD
MOV A,#02H ;读地址
LCALL WR_DB
LCALL CACK
JNB ACK,AD_SD
MOV R5,#03H
AD_RD:
LCALL START
INC SCTR ;控制字(读)
MOV A,SCTR
LCALL WR_DB
LCALL CACK1
JNB ACK,AD_RD
LCALL RD_BYTE ;数据读
AD_END:
LCALL STOP
NOP
LOOP:
NOP
NOP
AJMP LOOP
;-----------------读E2ROM数据------------------------
RD_BYTE: MOV R6,#3H
MOV R0,DA_START ;保存第一字节到20H
RD_1: NOP
NOP
NOP
NOP
NOP
MOV P0M1,#00000100B
MOV P0M2,#00000010B
NOP
NOP
NOP
NOP
NOP
LCALL RD_DB
DJNZ R6,RD_2
AJMP RD_3
RD_2:
MOV P0M1,#00000000B
MOV P0M2,#00000110B
LCALL MACK
INC R0
LJMP RD_1
RD_3: LCALL MNACK
RET
;-----------------------读字节子程序结果保存到R2和A-----------------------
RD_DB:
MOV R7,#08H
RD_LOOP:
NOP
NOP
NOP
SETB SCL ;SDA=1:SCL FROM 0 TO 1 读数据
NOP
NOP
NOP
NOP
CLR SCL ;下降沿读数据
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV C,SDA
MOV A,R2
RLC A
MOV R2,A
NOP
NOP
NOP
NOP
NOP
DJNZ R7,RD_LOOP
MOV @R0,A
RET
;-----------------------E2ROM的启动信号-----------------------
START:SETB SDA ; scl=1:sda from 1 to 0
NOP
SETB SCL
NOP
CLR SDA
NOP
CLR SCL ;scl=0
NOP
NOP
RET
;-------------------------END---------------------------------------
;-----------------------E2ROM的结束信号-----------------------
STOP: CLR SDA ;scl=1:sda from 0 to 1
NOP
SETB SCL
NOP
SETB SDA
NOP
RET
;-------------------------END---------------------------------------
;-----------------------E2ROM的写程序-----------------------
WR_DB: MOV R7,#08H ;8位
WR_LOOP:RLC A
JC WR1
WR0: CLR SDA ;sda=0:scl from 0 to 1
NOP
SETB SCL
NOP
NOP
SJMP WR_CB1
WR1: SETB SDA ;sda=1:scl from 0 to 1
NOP
SETB SCL
NOP
NOP
WR_CB1: CLR SCL ;sda=0
NOP
NOP
DJNZ R7,WR_LOOP
RET
;-------------------------END----------------------------------------
;-----------------------E2ROM应答子程序-----------------------
CACK:
SETB SDA ;SDA=1: SCL FROM 0 to 1 ,等待反映
MOV P0M1,#00000100B
MOV P0M2,#00000010B
NOP
SETB SCL
LCALL DELAY
NOP
NOP
CLR ACK
MOV C,SDA
JC CEND ;SDA=1 goto cend
SETB ACK ;SDA=0,then ack=1
CEND: CLR SCL
NOP
NOP
MOV P0M1,#00000000B
MOV P0M2,#00000110B
RET
;----------------------END------------------------------------------
CACK1:
SETB SDA ;SDA=1: SCL FROM 0 to 1 ,等待反映
MOV P0M1,#00000100B
MOV P0M2,#00000010B
NOP
SETB SCL
LCALL DELAY
CLR ACK
MOV C,SDA
JC CEND1 ;SDA=1 goto cend
SETB ACK ;SDA=0,then ack=1
CEND1: NOP
NOP
NOP
MOV P0M1,#00000000B
MOV P0M2,#00000110B
RET
;=============发送应答信号子程序MACK===============================
MACK: NOP
CLR SDA ;SDA=0:SCL FORM 0 TO 1 暂时放弃总线,准备接受下个字节
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
CLR SCL ;SCL=0
NOP
NOP
RET
;--------------------END-----------------------------------------
;===========发送非应答信号子程序MNACK===========================
MNACK: SETB SDA ;SDA=1:SCL FROM 0 TO 1
NOP
SETB SCL
NOP
CLR SCL ;SCL=0
NOP
NOP
RET
;-----------------END-------------------------------------------
;==============延时子程序============================================
DELAY:NOP
NOP
NOP
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -