SCL BIT P1.7;定义24C02的串行时钟线
SDA BIT P1.6;定义24C02的串行数据线 ORG 00H
START:
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();
}
/*------------------------------------------------------------