24C04模拟IIC读写程序

阅读: 评论:0

SCL BIT P1.7;定义24C02的串行时钟线     
SDA BIT P1.6;定义24C02的串行数据线
      ORG 00H
START:
    MOV R1,#20H  ; 数据保存地址
    MOV R7,#120  ; 取数据的个数
;;**********************************
    CALL FIRST    ;开始命令
    MOV A,#0A0H  ;写器件地址声波识别
    CALL SUBS
;;**********************************
    MOV A,#00h  ;所要读的器件的地址
    CALL SUBS
;;**********************************
    CALL FIRST    ;开始命令
    MOV A,#0A1H  ;开始读数据
玻璃纸包装
    CALL SUBS
;;**********************************
WIN:  CALL SUBR
      MOV @R1,A
      INC R1
      DJNZ R7,WIN
      CLR SDA
      CALL DELAY
      SETB SCL
      CALL DELAY
      SETB SDA
      JMP  $
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SUBR:  MOV R0,#08H
LOOP2:  SETB SCL
        CALL DELAY
        MOV C,SDA
        RLC A
        CLR SCL
        CALL DELAY
        DJNZ  R0,LOOP2
        CJNE R7,#00h,LOW1  ;改
        SETB SDA
        JMP CLIMBER
LOW1:  CLR SDA
CLIMBER:CALL DELAY
        SETB SCL
        CALL DELAY
        CLR SCL
        CALL DELAY
        SETB SDA
        RET
SUBS:  MOV R5,#08H
LOOP:  CLR SCL
        RLC A
        MOV SDA ,C
        NOP
        SETB SCL
网络播放机
        CALL DELAY
        DJNZ  R5,LOOP
        CLR SCL
        CALL DELAY
        SETB SCL
REP:    MOV C, SDA
        JC REP
        CLR  SCL
        RET
DELAY:  NOP
        NOP
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FIRST: SETB SDA
      SETB SCL
      CALL DELAY
      CLR SDA
      CALL DELAY
      CLR SCL    ;开始传数据
      RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    END
I2C驱动24c04程序
石瓜子莲mugenwon 发表于 2007-5-23 15:26:00
看到很多人在24Cxx的程序,了又用不了,干脆拿自己的分享算了。
以下代码功能极其强大,而且使用方便,基本上改几个参数,直接调用就行。至于原理说起来就太长了,只好自己消化吸收。
只能用24c01A~24c16A系列,容量超过的不行
/*
本程序可以一次读和写最多256个字节数据,超出会发生卷页,即从0xff回到0x00
继续写或者读,请注意
本子程序使用方法如下:
先把下面的#define numbyte 改为对应IC型号
调用Write_Flash()和Read_Flash()前,先把page07填好对应的页数,下面的
函数声明处有说明
需要在主程序处定义一些参数,如下:
bit f_rom;      //eprom应答标志,=1不应答
uchar xdata epromerr;  //用来统计写入出错的次数
uint  xdata epadd;    //用来作为rom目标写入的首地址,要进行计算
uchar xdata page07;    //每256个字节当一页,请注意不要写错页
uchar xdata *ncon;    //用来处理写入或读入的缓存地址
uchar xdata len1;    //rom第一段数据长度,看eprom.c
uchar xdata len2;    //rom中间段数据页数,看eprom.c
uchar xdata len3;    //rom末尾段数据长度,看eprom.c
如果不用外部存储器件,把关键字xdata去掉,然后再修改Write_Flash()
和Read_Flash()的声明部分参数
*/
//定义使用的IC,容量超过了这些IC就不能用了
#define  d_24c01a  8  //定义IC每一页的字节数
#define  d_24c02  8
#define  d_24c04  16
#define  d_24c08a  16
#define  d_24c16a  16
#define  numbyte_page d_24c16a
#define  WriteDeviceAddress 0xa0 //写驱动地址指令
桑拿炉#define  ReadDeviceAddress 0xa1  //读驱动地址指令
void nod2()
{unsigned char i;    //4.6us延时
for (i=0;i<13;i++)
_nop_();
}
/*-------------------------------------------------------------
功能:发起始信号
------------------------------------------------------------*/
void Start_Cond()
{
SDA = 1;
    nod2();
SCL = 1;
    nod2();
SDA = 0;
nod2();
SCL = 0;
nod2();
}
/*-------------------------------------------------------------
功能:发停止信号
------------------------------------------------------------*/
void Stop_Cond()
{
SDA = 0;
nod2();
SCL = 1;
nod2();
SDA = 1;
nod2();
SCL = 0;
nod2();
}
/*-------------------------------------------------------------
功能:发确认信号
------------------------------------------------------------*/
void Ack()
{
SDA = 0;
nod2();
SCL = 1;
nod2();
SCL = 0;
nod2();
SDA = 1;
nod2();
}
/*-------------------------------------------------------------
功能:发无确认信号
------------------------------------------------------------*/
防刺手套void NoAck()
{
SDA = 1;
nod2();
SCL = 1;
nod2();
SCL = 0;
nod2();
SDA = 0;
nod2();
}
/*-------------------------------------------------------------
功能:读一个字节数据
------------------------------------------------------------*/
unsigned char Read8Bit()
{
unsigned char temp,rbyte=0;
for (temp = 0;temp<8;temp++)
{ SDA=1;
  nod2();
  SCL = 1;
  nod2();
  rbyte=(rbyte<<1)|SDA;
  SCL = 0;
        nod2();
}
return(rbyte);
}
/*-------------------------------------------------------------
功能:写一个字节数据
------------------------------------------------------------*/
Write8Bit(unsigned char input)
{
unsigned char i;
for (i=0;i<8;i++)
{ input <<= 1;
  SDA = CY;
  nod2();
  SCL = 1;
  nod2();
  SCL = 0;
  nod2();
  SDA = 0;
  nod2();
}
f_rom=0;  //chack
SDA=1;
nod2();
nod2();
SCL=1;
nod2();
nod2();
f_rom=SDA;
SCL=0;
nod2();
nod2();
}
/*------------------------------------------------------------

本文发布于:2023-05-14 09:14:30,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/4/99199.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   地址   功能   写入   参数   定义   用来
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图