📄 a4_24c02.asm
字号:
;*************************************************************************
;*************************************************************************
;*************************************************************************
;=========================函数说明========================================
;>>包括函数:
; 1.M24C02_WRITE
; 功能 : 写gIIC_DATA的连续的8个字节到指定的地址单元.
; 地址的指定有gTAB_Place给出。
; 使用说明: 写gIIC_DATA下,连续8个字节的数据到
; 24C02的0起使地址单元,单元地址由gTAB_Place指定
; LDA #0
; STA gTAB_Place
; JSR M24C02_WRITE
;------------------------------------------------------------------
; 2.M24C02_READ
; 功能 : 从24C02的指定单元读出连续的8个字节,存入
; 到gIIC_DATA。地址的指定有gTAB_Place给出。
; 使用说明: 读24C02起始地址0下,连续8个字节的
; 数据到gIIC_DATA的连续8个单元中
; LDA #0
; STA gTAB_Place
; JSR M24C02_READ
;=============================================================================
;>>修改日期 :2008/03/06
;>>程序员 :wb
;=========================================================================
;1. 从24c02中读数据
; 地址由gTAB_Place指定,数据读入gIIC_DATA中,连续读取7个
;-------------------------------------------------------------------------
M24C02_READ:
JSR MIIC_START
LDA #A0H ;虚拟写指令
STA gIIC_WR_BUFF
JSR MIIC_WBYTE
JSR M_ACK_CHECK
;-----------------------------
LDA gTAB_Place ;写地址指令
STA gIIC_WR_BUFF
JSR MIIC_WBYTE
JSR M_ACK_CHECK
;-----------------------------
JSR MIIC_START
LDA #A1H ;读指令
STA gIIC_WR_BUFF
JSR MIIC_WBYTE
JSR M_ACK_CHECK
;-----------------------------
LDY #0
S24C02_READ_LP:
JSR MIIC_RBYTE
JSR M_ACK
LDA gIIC_WR_BUFF
STA gIIC_DATA,Y
INY
TYA
CMP #7
BCC S24C02_READ_LP
;-------------------前7个数据需要应答信号
JSR MIIC_RBYTE
LDA gIIC_WR_BUFF
STA gIIC_DATA+7
JSR M_NOACK
JSR MIIC_STOP
RTS
;=========================================================================
;2. 读一个字节
;-------------------------------------------------------------------------
MIIC_RBYTE:
JSR MIIC_SCL_L
LDA #MACRO_Port_SDL_DIR
TSB MACRO_24C02_Port_DIR
LDX #8
STZ gIIC_WR_BUFF
SIIC_RBYTE_LP:
JSR MIIC_SCL_L
NOP
NOP
LDA !MACRO_24C02_Port
AND #MACRO_24C02_SDL
CLC
BEQ SIIC_RBYTE_CP
SEC
SIIC_RBYTE_CP:
ROL gIIC_WR_BUFF
JSR MIIC_SCL_H
JSR MDELAY_20uS
DEX
BNE SIIC_RBYTE_LP
LDA #MACRO_Port_SDL_DIR
TRB MACRO_24C02_Port_DIR
RTS
;=========================================================================
;3. 写数据到24c02
; 数据由gIIC_DATA指定
; 地址由gTAB_Place指定
;-------------------------------------------------------------------------
M24C02_WRITE:
JSR MIIC_START
LDA #A0H ;写指令
STA gIIC_WR_BUFF
JSR MIIC_WBYTE
JSR M_ACK_CHECK
;------------------------
LDA gTAB_Place
STA gIIC_WR_BUFF
JSR MIIC_WBYTE ;写地址
JSR M_ACK_CHECK
;------------------------
LDY #0
M24C02_DATA_LP:
LDA gIIC_DATA,Y
STA gIIC_WR_BUFF ;写数据
JSR MIIC_WBYTE
JSR M_ACK_CHECK
INY
TYA
CMP #8
BCC M24C02_DATA_LP
;------------------------
JSR MIIC_STOP
JSR MDELAY_1MS
JSR MDELAY_1MS
RTS
;=========================================================================
;4. 向24C0中写一个字节的数据
;-------------------------------------------------------------------------
MIIC_WBYTE:
JSR MIIC_SCL_L
LDX #8
SIIC_WBYTE_LP:
ASL gIIC_WR_BUFF
BCC SIIC_WBYTE_ZERO
JSR MIIC_SDA_H
BRA SIIC_WBYTE_CP
SIIC_WBYTE_ZERO:
JSR MIIC_SDA_L
JSR MDELAY_20uS
SIIC_WBYTE_CP
JSR MIIC_SCL_H
JSR MDELAY_20uS
JSR MIIC_SCL_L
DEX
TXA
BNE SIIC_WBYTE_LP
RTS
;=========================================================================
;5. 在读最后一个数据结束后,向24C02中写NO应答
;-------------------------------------------------------------------------
M_NOACK:
JSR MIIC_SCL_L
JSR MDELAY_20uS
JSR MIIC_SDA_H
JSR MDELAY_20uS
JSR MIIC_SCL_H
JSR MDELAY_20uS
JSR MIIC_SCL_L
RTS
;=========================================================================
;6. 在读数据时,向24C02中写应答
;-------------------------------------------------------------------------
M_ACK:
JSR MIIC_SCL_L
JSR MDELAY_20uS
JSR MIIC_SDA_L
JSR MDELAY_20uS
JSR MIIC_SCL_H
JSR MDELAY_20uS
JSR MIIC_SCL_L
RTS
;=========================================================================
;7. 写数据时,从24C02中读入应答信号,F_24C02_SUCC
;-------------------------------------------------------------------------
M_ACK_CHECK:
LDA #MACRO_Port_SDL_DIR
TSB !MACRO_24C02_Port_DIR
;------------------------------
JSR MIIC_SCL_H
NOP
NOP
LDA !MACRO_24C02_Port
AND #MACRO_24C02_SDL
BEQ S_ACK_CHECK_SUCC
; LDA #1 ;判断写数据是否成功
; STA F_24C02_SUCC
BRA S_ACK_CHECK_END
S_ACK_CHECK_SUCC:
; STZ F_24C02_SUCC
S_ACK_CHECK_END:
;------------------------------
LDA #MACRO_Port_SDL_DIR
TRB !MACRO_24C02_Port_DIR
RTS
;=========================================================================
;8. 24C02开始信号
;-------------------------------------------------------------------------
MIIC_START:
JSR MIIC_SCL_L
JSR MIIC_SDA_H
JSR MIIC_SCL_H
JSR MDELAY_20uS
JSR MIIC_SDA_L
RTS
;=========================================================================
;9. 24C02结束信号
;-------------------------------------------------------------------------
MIIC_STOP:
JSR MIIC_SCL_L
JSR MDELAY_20uS
JSR MIIC_SDA_L
JSR MDELAY_20uS
JSR MIIC_SCL_H
JSR MDELAY_20uS
JSR MIIC_SDA_H
RTS
;=========================================================================
;10.24C02硬件接口
;-------------------------------------------------------------------------
MIIC_SCL_H:
LDA #MACRO_24C02_SCL
TSB !MACRO_24C02_Port
RTS
;--------------------------
MIIC_SCL_L:
LDA #MACRO_24C02_SCL
TRB !MACRO_24C02_Port
RTS
;--------------------------
MIIC_SDA_H:
LDA #MACRO_24C02_SDL
TSB !MACRO_24C02_Port
RTS
;--------------------------
MIIC_SDA_L:
LDA #MACRO_24C02_SDL
TRB !MACRO_24C02_Port
RTS
;=========================================================================
;11.延时20US
MDELAY_20uS:
LDA #01H
STA !WDTC
LDA #15
SDELAY_20uS_LP:
NOP
NOP
NOP
NOP
DEC A
BNE SDELAY_20uS_LP
RTS
;=========================================================================
;12.延时1MS
MDELAY_1MS:
LDA #01H
STZ !WDTC
LDA #200
SDELAY_1MS_LP:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DEC A
BNE SDELAY_1MS_LP
LDA #01H
STZ !WDTC
RTS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -