📄 程序功能本程序是利用文件240x.asm中的子程序对eeprom 240x进行多字节读写的操作.txt
字号:
;***********************240X_SAMPLE**************************
;程序功能:本程序是利用文件240X.ASM中的子程序对EEPROM 240X进行多字节读写的操作示
例(同样适用于2416).
;说明:本程序在AT24C01A上调试通过.
;***********************符号定义******************************
;常量定义
I2C_SDA EQU P1.0 ;数据线
I2C_SCL EQU P1.1 ;时钟线
;变量定义
I2C_AD DATA 50H ;存放器件的三位可编程地址或页地址(0-7)
I2C_SUBA DATA 51H ;存放片内寻址字节.
I2C_NUMBYT DATA 52H ;存放传送的字节数.
I2C_TDA DATA 53H ;存放发送数据缓冲区首地址.
I2C_RDA DATA 54H ;存放接收数据缓冲区首地址.
DELAYMS_NUM DATA 55H ;存放延时的毫秒数
;************************************************************
ORG 00H
MOV I2C_AD,#00H ;设器件的三位可编程地址
MOV I2C_SUBA ,#00H ;设器件子地址
MOV I2C_NUMBYT,#02H ;写2字节数据
MOV I2C_TDA,#30H ;设发送缓冲区首址
;***********写********************
;待发送数据
MOV 30H,#0FFH
MOV 31H,#0FFH
LCALL I2C240X_WRNBYT ;写入数据
JC $ ;若未正常写入则停止
;延时10ms
MOV DELAYMS_NUM,#0AH ;置延时毫秒数
LCALL DELAYNMS
;***********读********************
MOV I2C_NUMBYT,#02H ;读2字节数据
MOV I2C_RDA,#40H ;设接收缓冲区首址
LCALL I2C240X_RDNBYT ;读出数据
JC $ ;若未正常读出则停止
SJMP $
;************************************************************
;包含文件
;#include <240X.ASM>
;#include
;END
;***********************240X.asm**********************************
;程序功能:本程序包实现对EEPROM 240X的多字节读写操作.
;入口参数: I2C_AD 存放器件的三位可编程地址或页地址(0-7).
; I2C_SUBA存放片内寻址字节.
; I2C_NUMBYT存放要传送数据的字节数.
; I2C_TDA存放发送数据缓冲区首地址.
; I2C_RDA存放接收数据缓冲区首地址.
;出口参数:接收到的数据存放在接收数据缓冲区内.
; C存放接收到的应答位或非应答位,0表示应答位,1表示非应答位或总线不可用(数
据未正常写入).
;占用资源:A,PSW,R0,R1,R3.
;占用堆栈:2字节.
;子程序调用:I2C_START,I2C_STOP,I2C_TACK,I2C_TNACK,I2C_CACK,I2C_WRBYT,I2C_RDBYT.
;说明:1,本程序包适用的芯片有2401,2402,2404,2408,2416.
; 2,本程序适用于晶振频率为12MHZ,即单周期指令用时1us的模式,若晶振频率不
; 为12MHZ,则需相应地改变NOP指令的条数.
; 3,此程序调用了文件VI2C.ASM中的子程序,在此程序末尾已经用include指令将文件
VI2C.ASM包含进来了.
; 4,使用该程序前,用户需定义下列各符号.
;***********************符号定义示例****************************
; ;常量定
义
; I2C_SDA EQU P1.0 ;数据线
; I2C_SCL EQU P1.1 ;时钟线
; ;变量定义
; I2C_AD DATA 50H ;存放器件的三位可编程地址或页地址(0-7)
; I2C_SUBA DATA 51H ;存放片内寻址字节
; I2C_NUMBYT DATA 52H ;存放传送的字节数
; I2C_TDA DATA 53H ;存放发送数据缓冲区首地址
; I2C_RDA DATA 54H ;存放接收数据缓冲区首地址
;***********************I2C240X_WRNBYT*************************
;程序功能:本程序实现对EEPROM 240X写入N字节数据.
;入口参数: I2C_AD 存放器件的三位可编程地址或页地址(0-7),I2C_TDA存放待发送数据缓
冲区首址,
; I2C_NUMBYT存放待发送数据个数,I2C_SUBA存放片内寻址字节.
;出口参数:C存放接收到的应答位或非应答位,0表示应答位,1表示非应答位或总线不可用(数
据未正常写入).
;占用资源:A,PSW,R0,R1,R3.
;占用堆栈:2字节.
;子程序调用:I2C_START,I2C_STOP,I2C_CACK,I2C_WRBYT.
I2C240X_WRNBYT:
MOV R3,I2C_NUMBYT ;R3存放待发送字节数
LCALL I2C_START ;发开始信号
JC I2C_WABORT ;若总线不可用则中止
MOV A,I2C_AD ;将三位可编程地址或页地址送入累加器
RL A ;左移一位对齐格式
ORL A,#0A0H ;加上固定的高四位地址
CLR ACC.0 ;设定为写
LCALL I2C_WRBYT ;发送写器件地址
LCALL I2C_CACK ;检查应答位
JC I2C_WABORT ;若检测到非应答位则中止
MOV A,I2C_SUBA ;将片内寻址字节送入累加器
LCALL I2C_WRBYT ;发送
LCALL I2C_CACK ;检查应答位
JC I2C_WABORT ;若检测到非应答位则中止
MOV R1,I2C_TDA ;将待发送数据缓冲区首址送R1
I2C_WLOOP: MOV A,@R1 ;待发送数据送入累加器
LCALL I2C_WRBYT ;发送N字节数据
LCALL I2C_CACK ;检测应答位
JC I2C_WABORT ;若检测到非应答位则中止
INC R1 ;发送数据缓冲区指针调整
DJNZ R3,I2C_WLOOP ;是否发完?
CLR C ;清错误标志位,正常写入
I2C_WABORT: LCALL I2C_STOP ;发送停止位
RET
;***********************I2C240X_RDNBYT***********************
;程序功能:本程序实现从EEPROM240X中读出N字节数据.
;入口参数: I2C_AD 存放器件的三位可编程地址或页地址(0-7),I2C_RDA存放待接收数据缓
冲区首址,
; I2C_NUMBYT存放待接收数据个数,I2C_SUBA存放片内寻址字节.
;出口参数:接收到的数据存放在接收数据缓冲区中,C存放接收到的应答位或非应答位,0表示
应答位,
; 1表示非应答位或总线不可用(数据未正常读出)
;占用资源:A,PSW,R0,R1,R3.
;占用堆栈:2字节.
;子程序调用:I2C_START,I2C_STOP,I2C_TACK,I2C_TNACK,I2C_CACK,I2C_WRBYT,I2C_RDBYT.
I2C240X_RDNBYT:
MOV R3,I2C_NUMBYT ;R3存放待接收字节数
LCALL I2C_START ;发开始信号
JC I2C_RABORT ;若总线不可用则中止
MOV A,I2C_AD ;将三位可编程地址或页地址送入累加器
RL A ;左移一位对齐格式
ORL A,#0A0H ;加上固定的高四位地址
CLR ACC.0 ;设定为写
LCALL I2C_WRBYT ;发送写器件地址
LCALL I2C_CACK ;检查应答位
JC I2C_RABORT ;若检测到非应答位则中止
MOV A,I2C_SUBA ;将片内寻址字节送入累加器
LCALL I2C_WRBYT ;发送
LCALL I2C_CACK ;检查应答位
JC I2C_RABORT ;若检测到非应答位则中止
LCALL I2C_START ;发开始信号
JC I2C_RABORT ;若总线不可用则中止
MOV A,I2C_AD ;将三位可编程地址或页地址送入累加器
RL A ;左移一位对齐格式
ORL A,#0A0H ;加上固定的高四位地址
SETB ACC.0 ;设定为读
LCALL I2C_WRBYT ;发送读器件地址
LCALL I2C_CACK ;检查应答位
JC I2C_RABORT ;若检测到非应答位则中止
MOV R1,I2C_RDA ;将待接收数据缓冲区首址送R1
I2C_RLOOP: LCALL I2C_RDBYT ;接收1字节数据
MOV @R1,A ;送入缓冲区
DJNZ R3,I2C_TTACK ;是否接收完?
LCALL I2C_TNACK ;发送非应答位
CLR C ;清错误标志位,正常读出
I2C_RABORT: LCALL I2C_STOP ;发送结束信号
RET
I2C_TTACK: LCALL I2C_TACK ;发送应答位
INC R1 ;接收数据缓冲区指针调整
SJMP I2C_RLOOP
;************************************************************
;#include
;2004.11.19 12MHZ
;*******************VI2C**************************************
;程序功能:单主系统主方式下虚拟I2C总线软件包(100KHZ).
;入口参数: 无.
;出口参数: C存放接收到的应答位或非应答位,0表示应答位,1表示非应答位或总线不可用.
;占用资源:A,PSW,R0.
;占用堆栈:0字节.
;子程序调用:无.
;说明:1,本程序适用于晶振频率为12MHZ,即单周期指令用时1us的模式,若晶振频率不
; 为12MHZ,则需相应地改变NOP指令的条数.
; 2,该软件包用于与其它操作I2C接口器件的子程序配合使用.
; 3,使用该程序前,用户需定义下列各符号.
;***********************符号定义示例****************************
; ;常量定义
; I2C_SDA EQU P1.0 ;数据线
; I2C_SCL EQU P1.1 ;时钟线
;***********************I2C_START******************************
;程序功能:本程序实现在虚拟I2C总线上发送起始位。
;入口参数:无.
;出口参数:SDA,SCL返回为低电平,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -