📄 摩托罗拉8位单片机24c02读写程序.c
字号:
/*============================================================================*
函数: void Delayiic(void)
功能: ns延时。
参数: ns——延时时间设定。
返回值: 无。
最深嵌套: 0层
-------------------------------------------------------------------------------
更新日期: 2004.9.24
*============================================================================*/
void Delayiic(void)
{
return;
}
/**************************************************************/
//延时ms程序
/**************************************************************/
void delay1ms(uchar n)
{
uchar i,j;
for (i=0; i<n; i++)
{
for (j=0; j<200; j++);
__RESET_WATCHDOG();
}
return;
}
/*============================================================================*
函数: void IIC_Start(void)
功能: 读写EEPROM开始程序。
参数: 无。
返回值: 无。
最深嵌套: 1层
更新日期: 2004.9.24
*============================================================================*/
void IIC_Start(void)
{
Delayiic();
IIC_SCL = 1;
IIC_SDA = 1;
Delayiic();
IIC_SDA = 0;
Delayiic();
IIC_SCL = 0;
Delayiic();
return;
}
/*============================================================================*
函数: void IIC_Stop(void)
功能: 读写EEPROM结束子程序。
参数: 无。
返回值: 无。
最深嵌套: 1层
更新日期: 2004.9.24
*============================================================================*/
void IIC_Stop(void)
{
IIC_SCL = 0;
Delayiic();
IIC_SDA = 0;
IIC_SCL = 1;
Delayiic();
IIC_SDA = 1;
Delayiic();
IIC_SCL = 0;
Delayiic();
IIC_SCL = 1;
return;
}
/*============================================================================*
函数: void IIC_Transmit(void)
功能: 向EEPROM输入一个字节的数据。
参数: word 要输入的数据。
返回值: 出错标志。
最深嵌套: 1层
更新日期: 2004.9.24
*============================================================================*/
uchar IIC_Transmit(uchar word)
{
uchar iii,sample;
for (iii=0; iii<8; iii++)
{
if (word > 0x7f) //先输出word的最高位
{
IIC_SDA = 1;
}
else
{
IIC_SDA = 0;
}
IIC_SCL = 1;
Delayiic();
IIC_SCL = 0; //注意读写EEPROM时要确保延时够用
word <<= 1;
}
IIC_SDA = 1;
IIC_SDA_D = 0;
Delayiic();
IIC_SCL = 1;
Delayiic();
sample = IIC_SDA;
IIC_SCL = 0;
IIC_SDA_D = 1;
if (sample == 0)
{
return(1);
}
else
{
return(0);
}
}
/*============================================================================*
函数: uchar Read_nByte_IIC(uchar address,uchar length)
功能: 从EEPROM指定地址处读出n个字节,存入r_buf[]中。
参数: address ——指定地址。
length ——待读字节长度
返回值: —— 出错标志
最深嵌套: 2层 读1个字节大约需要700us
更新日期: 2005.8.9
*============================================================================*/
uchar Read_nByte_IIC(uchar address,uchar length)
{
uchar i,j,new_data;
DisableInterrupts;
IIC_SDA_D = 1;
for (i=0; i<length; i++)
{
new_data = 0;
IIC_Start();
if (IIC_Transmit(0xa0) == 0)
{
return(0);
}
if (IIC_Transmit(address) == 0)
{
return(0);
}
Delayiic();
IIC_Start();
if (IIC_Transmit(0xa1) == 0)
{
return(0);
}
Delayiic();
IIC_SCL = 0;
IIC_SDA_D = 0;
for (j=0; j<8; j++)
{
new_data <<= 1; //先读出数据的最低位
new_data &= 0xFE;
IIC_SCL = 1;
Delayiic();
if (IIC_SDA == 1)
{
new_data++;
}
IIC_SCL = 0;
Delayiic();
}
IIC_SCL = 0;
Delayiic();
IIC_SCL = 1; //程序中可增加应答判断
Delayiic();
IIC_SCL = 0;
IIC_SDA_D = 1;
Delayiic();
IIC_Stop();
r_buf[i] = new_data;
address++;
__RESET_WATCHDOG(); //kicks the dog
}
EnableInterrupts;
return(1);
}
/*============================================================================*
函数: void Write_nByte_IIC(uchar,uchar)
功能: 向EEPROM指定地址处写入n个字节,内容存在w_buf[]中。
参数: address ——指定地址。
lengrh ——待写字节数。
返回值: —— 出错标志
最深嵌套: 3层
更新日期: 2005.8.9
*============================================================================*/
uchar Write_nByte_IIC(uchar address,uchar length)
{
uchar i,j; //j为存储不成功可再存储的次数,如始终不成功,则返回0;
DisableInterrupts;
for (i=0; i<length; i++)
{
for (j=0; j<3; j++)
{
IIC_SDA_D = 1;
Delayiic();
IIC_Start();
if ((IIC_Transmit(0xa0) == 1) && (IIC_Transmit(address) == 1) && (IIC_Transmit(w_buf[i]) == 1))
{
Delayiic();
IIC_Stop();
delay1ms(10);
if ((Read_nByte_IIC(address,1) == 1) && (r_buf[0] == w_buf[i]))
{
break;
}
}
if (j == 2)
{
return(0);
}
}
address++;
}
EnableInterrupts;
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -