老古开发网首页
导航:老古开发网首页文章索引索引第2527页文章分类单片机第47页→[24CXX系列读写程序(EMC指令版)]
| -文章搜索 - 最新文章 - |

第3091篇:24CXX系列读写程序(EMC指令版)

发布时间:2006年10月15日 点击次数:2146
来源:   作者:
 
;******************************************
;** 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总线读/写的程序全部结束 !
;****************************

欢迎进入老古论坛进行讨论
[单片机] 相关文章:
单片机模拟I2C总线及AT24C01应用实例
简介:
I 2 C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I 2 C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。 1. I2C总线特点   I 2 C总线最主要的优点是其简单性和......

AT89C51\52的编程原理
在EM78Pxx上模拟8(COM)*8(SEG)LCD驱动
软件包实现DTMF信号的产生
山东省大学生电子设计竞赛圆满结束
 
下一个:[综合电子]华为硬件笔试题
简介:
一 选择 13个题目,没有全部抄下来,涉及的课程有电路,模拟电路,数字电路,信号与系统,微机原理,网络,数字信号处理 有关于 1.微分电路 2.CISC,RISC 3.数据链路层 二 填空 10个题目,没有全部抄下来,涉及的课程有电路,模拟电路,数字电路,信号与系统,微机原理,网络,数字信号处理 有关于 1.TIC6000 DSP 2.二极管 3.RISC 4.IIR 三 简答 1.x(t)的傅立叶变换为X(jw)=$(w)+$(w-PI)+$(w-5) h(t)=......

上一个:[单片机]EMC8BIT单片机指令应用的误区与技巧

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:30分钟 执行时间:172毫秒