📄 24c01.asm
字号:
;*************************** 24c01器件子程序 **************************
;I2C总线EEPROM
;使用了: ACC,R0,R1,R2,R3
;************ 公共变量定义 ****************
PUBLIC READ_ABYTE, WRITE_ABYTE
;************ 变量说明 *****************
BC_SDA_24C01 BIT P2.7 ;24c01数据线
BC_CLK_24C01 BIT P2.6 ;24c01时钟
EXTRN BIT(B_ACK_24C01) ;24C01的应答位值寄存
EXTRN DATA(ERR_24C01) ;24C01的错误码寄存,!!!!!! 开机时清0 !!!
;************** 常数定义 ******************
WRITE_24C01 EQU 0A0H ;读HT24C01命令
READ_24C01 EQU 0A1H ;写HT24C01命令
;******* 24c01,在约定地址读出一数据 (被C调用) *********
;******************************************************
;参数: PAR 读出数在24c01中的地址
;返回: PAR 读出数
READ_ABYTE:
MOV A,ERR_24C01
CJNE A,#01H, LBL_P67
MOV PAR, ACC
RET
LBL_P67:
MOV R3,#00AH
LBL_P68:
LCALL START_CONDITION ;Ready to get data from ht24c01,start condition
MOV A,#WRITE_24C01 ;write address command
LCALL SEND_24C01 ;send command to ht24c01
LCALL GET_ACK ;get ack bit from ht24c01,ack bit is save in B_ACK_24C01
MOV A,PAR ;address is save in 01FH
LCALL SEND_24C01 ;send command to ht24c01
LCALL GET_ACK ;get ack bit from ht24c01,ack bit is save in B_ACK_24C01
LCALL STOP_CONDITION ;stop condtion
DJNZ R3,LBL_P69
ORL ERR_24C01,#01H
MOV PAR, ACC
RET
LBL_P69:
JB B_ACK_24C01,LBL_P68 ;transist data with htc2401
MOV R3,#00AH
LBL_P7:
LCALL START_CONDITION ;Ready to get data from ht24c01,start condition
MOV A,#READ_24C01 ;read data command
LCALL SEND_24C01 ;send command to ht24c01,read command is #0A1h
LCALL GET_ACK ;get ack bit from ht24c01,ack bit is save in B_ACK_24C01
DJNZ R3,LBL_P70
ORL ERR_24C01,#01H
MOV PAR, ACC
RET
LBL_P70:
JB B_ACK_24C01,LBL_P7 ;if ack zero then continue
LCALL GET_DATA ;get data from ht24c01 return val is in ACC
LCALL STOP_CONDITION ;stop condtion
ANL ERR_24C01,#0FEH ;clear err_24c01 bit
MOV PAR, ACC ;返回数据
RET ;this is random read operations
;******** 24c01,在约定地址写一数据, 占用20ms (被C调用)***********
;****************************************************************
;参数1: PAR 24c01中的地址
;参数2: @PAR 写入数
;返回:
WRITE_ABYTE:
MOV A,ERR_24C01 ;EEPROM错误代码
CJNE A, #01H, LBL_P76
LJMP WE24C_DEL
LBL_P76:
MOV R1,#00AH
LBL_P71:
MOV R2,#00AH
LBL_P74:
MOV R3,#00AH
LBL_P72:
LCALL START_CONDITION ;Ready to get data from ht24c01,start condition
MOV A,#WRITE_24C01
LCALL SEND_24C01 ;send command to ht24c01,write command is 0A0H
LCALL GET_ACK ;get ack bit from ht24c01,ack bit is save in 000h
DJNZ R3,LBL_P73
ORL ERR_24C01, #01H
LJMP WE24C_DEL
LBL_P73:
JB B_ACK_24C01,LBL_P72
MOV A,PAR
LCALL SEND_24C01 ;送地址 to ht24c01
LCALL GET_ACK ;get ack bit from ht24c01,ack bit is save in 000h
DJNZ R2,LBL_P75
ORL ERR_24C01, #01H
LJMP WE24C_DEL
LBL_P75:
JB B_ACK_24C01,LBL_P74
MOV R0,PAR
MOV A,@R0
LCALL SEND_24C01 ;送数据 to ht24c01
LCALL GET_ACK ;get ack bit from ht24c01,ack bit is save in 000h
DJNZ R1,LBL_P77
ORL ERR_24C01, #01H
LJMP WE24C_DEL
LBL_P77:
JB B_ACK_24C01,LBL_P71
LCALL STOP_CONDITION ;stop condtion
ANL ERR_24C01,#0FEH ;write OK!!!
;每写完一次24C01则要等待20MS的时间*********
WE24C_DEL: ;********* 延时20ms, 4M晶振 ***********
MOV A, #00H
MOV R1, #09H
WE24C_L0:
DJNZ ACC, WE24C_L0
DJNZ R1, WE24C_L0
RET
;================================= 文件内部子程序 ================================
;*********************************************************************************
;********* 24c01 的起始准备工作 *********
START_CONDITION:
CLR B_ACK_24C01 ;clear ack flag
SETB BC_SDA_24C01 ;Ready to get data from ht24c01,start condition
SETB BC_CLK_24C01 ;HT24C01 CLK
NOP
NOP
NOP
CLR BC_SDA_24C01 ;HT24C01 SDA
NOP
NOP
NOP
CLR BC_CLK_24C01 ;HT24C01 CLK
NOP
RET
;************ 24c01 的结束工作 **************
STOP_CONDITION:
NOP ;stop condtion
CLR BC_SDA_24C01 ;HT24C01 SDA
NOP
NOP
NOP
SETB BC_CLK_24C01 ;HT24C01 CLK
NOP
NOP
NOP
SETB BC_SDA_24C01 ;HT24C01 SDA
RET
;************ 写一字节到24c01 *************
SEND_24C01:
MOV R0,#008H ;send data to ht24c01
LBL_P5:
CLR BC_CLK_24C01 ;HT24C01 CLK
NOP
NOP
RLC A
MOV BC_SDA_24C01,C ;SDA
NOP
NOP
NOP
SETB BC_CLK_24C01 ;HT24C01 CLK
NOP
NOP
NOP
DJNZ R0,LBL_P5
NOP
CLR BC_CLK_24C01 ;HT24C01 CLK
RET
;*********** 从24c01读出一字节 ************
GET_DATA: ;读数据
MOV R0,#008H ;get data from ht24c01
LBL_P6:
CLR BC_CLK_24C01 ;HT24C01 CLK
NOP
NOP
NOP
SETB BC_SDA_24C01 ;HT24C01 SDA
NOP
MOV C,BC_SDA_24C01 ;HT24C01 SDA
RLC A
NOP
SETB BC_CLK_24C01 ;HT24C01 CLK
NOP
NOP
NOP
DJNZ R0,LBL_P6
NOP
CLR BC_CLK_24C01 ;HT24C01 CLK
RET ;return val is in ACC
;********* 读24c01的应答位 **********
GET_ACK:
SETB BC_SDA_24C01 ;get ack bit from ht24c01,ack bit is save in 000h
NOP
NOP
MOV C,BC_SDA_24C01 ;HT24C01 SDA
MOV B_ACK_24C01,C
NOP
NOP
SETB BC_CLK_24C01 ;HT24C01 CLK
NOP
NOP
NOP
CLR BC_CLK_24C01 ;HT24C01 CLK
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -