24CXX系列读写程序(EMC指令版)

发布者:Tianyun2021最新更新时间:2014-12-18 来源: laogu关键字:24CXX系列  读写程序  EMC指令版 手机看文章 扫描二维码
随时随地手机看文章
;******************************************
;** 24CXX 接口I2C总线读/写的程序
;** (所有时序均基于4MHZ晶体震荡器频率)
;******************************************
/*
;****************************
;随机读写测试程序(示范程序)
;****************************
TEST:
MOV A,@0XAE ;A2=A1=A0=1
MOV SLAVE_24,A ;设置器件码
MOV A,@2 ;R/W LOC. = 2
MOV ADDR_24,A ;设置地址码
MOV A,@55 ;
MOV DATA_24,A ;写55到E2PROM
CALL WRBYTE ;写一个字节
CALL DL10MS ;延时10MS,等待写操作完成(注意,此语句非常重要)
CALL RDBYTE ;读回原数据
MOV A,@55 ;
XOR A,DATA_24 ;
JBS R3,Z ;读出数据=写入数据跳
WRONG:
JMP WRONG ;校验失败
CORRECT:
JMP CORRECT ;校验通过
DL10MS:
RET
;****************************
;存储器定义
;****************************
PROT_I2C EQU 0X05 ;I2C操作口
SDA EQU 3 ;数据脚
SCL EQU 2 ;时钟脚

ADDR_24 EQU 0X1B ;地址寄存器
DATA_24 EQU 0X1C ;写入/读自I2C的数据寄存器
SLAVE_24 EQU 0X1D ;从器件地址寄存器(1010XXX0)
DBUF_24 EQU 0X1E ;发送/接受自SDA口的数据缓冲器
COUNT_24 EQU 0X1F ;位计数器
TT_24 EQU 0X20 ;标志寄存器
REND_24 EQU 1 ;读完毕标志(0=未完毕,1=完毕)
NUM_24 EQU 0X21 ;页写/页读字节数

*/
;****************************
;宏定义
;****************************
;=================
;设置SCL,SDA为输出口
;=================
SDA_OUT MACRO
MOV A,@0B00000001
IOW PROT_I2C
ENDM
;=================
;设置SCL为输出口,SDA为输入口
;=================
SDA_IN MACRO
MOV A,@0B00001001
IOW PROT_I2C
ENDM
;****************************
;字节写程序
;功能: 写一个字节到EEPROM器件
;入口: DATA_24 =要写的数据
; ADDR_24 =数据地址
; SLAVE_24=从器件地址1010XXX0)
;****************************
WRBYTE:
MOV A,SLAVE_24
MOV DBUF_24,A
CALL BSTART ;送起始位
CALL TX ;送从器件地址并检测应答信号
MOV A,ADDR_24
MOV DBUF_24,A
CALL TX ;送数据地址并检测应答信号
MOV A,DATA_24
MOV DBUF_24,A
CALL TX ;送数据并检测应答信号
CALL BSTOP ;送停止位
RET
;****************************
;字节读程序
;功能: 从EEPROM器件读一个字节
;入口: ADDR_24 =数据地址
; SLAVE_24=从器件地址(1010XXX0)
;出口: DATA_24 =读到的数据
;****************************
RDBYTE:
MOV A,SLAVE_24
MOV DBUF_24,A
CALL BSTART ;送起始位
CALL TX ;送从器件地址并检测应答信号
MOV A,ADDR_24
MOV DBUF_24,A
CALL TX ;送数据地址并检测应答信号
;转入读状态
CALL BSTART ;送起始位
MOV A,SLAVE_24
MOV DBUF_24,A
BS DBUF_24,0
CALL TX ;送从器件地址并检测应答信号
BS TT_24,REND_24
CALL RX ;读数据并发送应答信号
CALL BSTOP ;送停止位
MOV A,DBUF_24
MOV DATA_24,A ;保存数据到DATA_24
RET
;****************************
;页写程序
;功能: 写一个字节到EEPROM器件
;入口: R4 =要写的数据在RAM中存放首地址
; NUM_24 =字节数
; ADDR_24 =数据地址
; SLAVE_24=从器件地址1010XXX0)
;****************************
WRPAGE:
MOV A,SLAVE_24
MOV DBUF_24,A
CALL BSTART ;送起始位
CALL TX ;送从器件地址并检测应答信号
MOV A,ADDR_24
MOV DBUF_24,A
CALL TX ;送数据地址并检测应答信号
WRPAGE1:
MOV A,R0
MOV DBUF_24,A
CALL TX ;送数据并检测应答信号
INC R4
DJZ NUM_24
JMP WRPAGE1 ;未写完继续
CALL BSTOP ;送停止位
RET
;****************************
;页读程序
;功能: 从EEPROM器件读一个字节
;入口: ADDR_24 =数据地址
; SLAVE_24=从器件地址(1010XXX0)
; NUM_24 =字节数
;出口: R4 =读到的数据在RAM中存放首地址
;****************************
RDPAGE:
MOV A,SLAVE_24
MOV DBUF_24,A
CALL BSTART ;送起始位
CALL TX ;送从器件地址并检测应答信号
MOV A,ADDR_24
MOV DBUF_24,A
CALL TX ;送数据地址并检测应答信号
;转入读状态
CALL BSTART ;送起始位
MOV A,SLAVE_24
MOV DBUF_24,A
BS DBUF_24,0
CALL TX ;送从器件地址并检测应答信号
RDPAGE1:
MOV A,@1
XOR A,NUM_24
BS TT_24,REND_24
JBS R3,Z ;NUM_24=1跳;判断是否最后一个字节,决定应答信号
BC TT_24,REND_24
CALL RX ;读数据并发送应答信号
MOV A,DBUF_24
MOV R0,A ;保存数据到R0
INC R4
DJZ NUM_24
JMP RDPAGE1 ;未读完继续
CALL BSTOP ;送停止位
RET
;****************************
;I2C操作子程序(时序)集合
;****************************
;=================
;发送起始位程序
;说明: 当SCL=1时,向SDA发一个下降沿
;=================
BSTART:
SDA_OUT ;设置SDA为输出口
BS PROT_I2C,SDA ;SDA=1
NOP ;延时0.6US
BS PROT_I2C,SCL ;SCL=1
NOP ;延时0.6US
BC PROT_I2C,SDA ;SDA=0
NOP ;延时0.6US
BC PROT_I2C,SCL ;SCL=0
NOP ;延时0.6US
RET
;=================
;发送结束位程序
;说明: 当SCL=1时,向SDA发一个上升沿
;=================
BSTOP:
SDA_OUT ;设置SDA为输出口
BC PROT_I2C,SDA ;SDA=0
NOP ;延时0.6US
BS PROT_I2C,SCL ;SCL=1
NOP ;延时0.6US
BS PROT_I2C,SDA ;SDA=1
NOP ;延时0.6US
RET
;=================
;位输入子程序
;说明: 当SCL=1时,从SDA上读电平
;出口: C=从SDA上读入的位值
;=================
BITIN:
SDA_IN ;设置SDA为输入口
BS PROT_I2C,SDA ;SDA=1
NOP ;延时0.6US
BS PROT_I2C,SCL ;SCL=1
NOP ;延时0.6US
BC R3,C
JBC PROT_I2C,SDA
BS R3,C ;C=SDA
NOP ;延时0.6US
BC PROT_I2C,SCL ;SCL=0
NOP ;延时0.6US
RET
;=================
;位输出子程序
;说明: 每当SCL=0时,改写SDA上的电平
;入口: C=要写到SDA上的位值
;=================
BITOUT:
SDA_OUT ;设置SDA为输出口
JBS R3,C
JMP BIT0
BS PROT_I2C,SDA ;SDA=C=1
JMP CLK1
BIT0:
BC PROT_I2C,SDA ;SDA=C=0
CLK1:
NOP ;延时0.6US
BS PROT_I2C,SCL ;SCL=1
BIT2:
NOP
NOP
BC PROT_I2C,SCL ;SCL=0
RET
;============================
;接收数据子程序
;入口: TT_24.REND_24 =读完毕标志
;出口: DBUF_24 =接受到的数据(8_BIT)
;============================
RX:
MOV A,@8 ;循环次数=8
MOV COUNT_24,A
CLR DBUF_24
RXLP:
CALL BITIN ;输入1_BIT
RLC DBUF_24 ;左移(带C)
DJZ COUNT_24 ;循环结束?
JMP RXLP
;设置应答信号位,如果读完毕则送1(NO_ACK)停止接受,否则送0(ACK)继续接受
BS R3,C
JBS TT_24,REND_24 ;读完毕信号->C
BC R3,C
CALL BITOUT ;应答
RET
;============================
;发送数据子程序
;入口: DBUF_24 =要发送的数据(8_BIT)
;============================
TX:
MOV A,@8 ;循环次数=8
MOV COUNT_24,A
TXLP:
RLC DBUF_24 ;左移(带C)
CALL BITOUT ;输出1_BIT
DJZ COUNT_24 ;循环结束?
JMP TXLP
CALL BITIN ;读应答信号
RET

;****************************
;I2C总线读/写的程序全部结束 !
;****************************
关键字:24CXX系列  读写程序  EMC指令版 引用地址:24CXX系列读写程序(EMC指令版)

上一篇:EMC8BIT单片机指令应用的误区与技巧
下一篇:单片机模拟I2C总线及AT24C01应用实例

推荐阅读最新更新时间:2024-03-16 13:49

24C02(EEPROM)以字节读写程序(ASM)
24C02以字节读写时序 选择性读时序 .................24c02字节读写程序(已调试过 )....................... ;//////////////////////////////////////////////////// ;AT89C52与AT24C02的IIC通信 ;控制数码管显示0-P ;AT24C02采用字节写和选择性读 ;//////////////////////////////////////////////////// DAUN EQU 18 ;写入字节数,对24C02(256BK)最大为255 ADDR EQU 41H ;24C02操作数据地址 WRD
[单片机]
24C02(EEPROM)以字节<font color='red'>读写程序</font>(ASM)
STC单片机EEPROM的读写程序
汇编语言写的,依据stc单片机官方提供的资料,测试ok,另外还有c语言的大家可到论坛去找。 stc的eeprom 功能还是不错的,可以简化我们的外围电路,但是缺点是是有就那就是写入速度太慢了,只能按扇区的写,不能字节写. 下面是代码 AUXR1 EQU 0A2H ISPDATA EQU 0E2H ISPADDRH EQU 0E3H ISPADDRL EQU 0E4H ISPCMD EQU 0E5H ISPTRIG EQU 0E6H ISPCONTR EQU 0E7H ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV AUXR1,#0 INC AUXR1 MOV DPTR,#2000H ACA
[单片机]
一个很不错的I2C读写程序(基于KeilC51)
#include "C8051F310.H" #include "common.h" #include "i2c.h" /* Ports */ sbit SCL  = P0 ^ 7; sbit SDA  = P0 ^ 6; sbit CHECK  = P1 ^ 0; /* ------------ DEFINES --------------- */ /* I2c read/write flags */ #define I2C_WRITE_FLAG 0x00 /* bit 0 of slave-addres byte */ #define I2C_READ_FLAG 0x01 /* bus logic levels */ #def
[单片机]
24CXX读写程序(适用PIC和51,适用24C01~24C2048)
//24C02,24C04,24C1024测试通过 //-------------------读写串行EEPROM------------- //作者:兰天白云 //功能描述:读写串行EEPROM(适用24C01~24C2048) //输入:MCU地址,EEP地址,读写字节数,24的控制字 //输出:错误标志,0--正确,1--错误 //版本说明:V1.1 //注:(1)写数据时不用考虑跨页问题(已有处理) // (2)控制字与24的硬件连接有关 // 例:24的1,2,3,4脚都与地连接 // 则:写24的控制字=0xa0,读24的控制字=0xa1 //--------------------------------
[单片机]
12864 LCD显示屏读写程序
#include reg51.h #define uchar unsigned char #define uint unsigned int sbit SCLK=P2^2; sbit SID=P2^1; sbit CS=P2^0; void delay(uint v)/*延时*/ { while(v!=0) v--; } void ser_in(uchar c)/*serial输入程序*/ { uchar BitCnt; for(BitCnt=0;BitCnt 8;BitCnt++) { if((c BitCnt)&0x80)SID=1; else SID=0; delay(1);
[单片机]
AT24CXX串行EEPROM芯片读写程序
;说明: ;入口条件:数据放在ADAT_I2C中,页面放在APAG_ IC 2,字节地址放在AADR_I2C,如准备向AT24CXX第一页的字节地址03H中写入值0FH,则置APAG_IC2=01H,AADR_I2C=03H,ADAT_I2C=0FH。 ;出口信息:读出的数据在累加器A中。 ;影响资源:PSW、A、R7 堆栈需求: 6字节 ;ASLK EQU P3.3 ;AT24CXX卡的SLK ;ASDA EQU P3.4 ;AT24CXX卡的SDA ASLK EQU P1.4 ;AT24CXX芯片的SLK ASDA EQU P1.5 ;AT24CXX芯片的SDA AADR_I2C EQU 30H ; A
[单片机]
单片机学习之二十:E2PROM芯片24C02的读写程序
E2PROM芯片 24C02的读写程序 一、实验目的: 给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。然后再把这组数据读出来,检验写入和读出是否正确。 在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。 二、理论知识准备: 上面两个实验主要学习的是利用单片机的串口进行通讯,本实验要介绍的是基于I2C总线的串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。 (一)、I2C总线概念 I 2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干扰性能好。目前很多公司都推出了基于I 2C总线的外围器件,例如我们学习板上的 24C02芯片,就是一个带
[单片机]
单片机学习之二十:E2PROM芯片24C02的<font color='red'>读写程序</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved