📄 at24cxx.c
字号:
//温度控制器 显示温度0-99 有3个功能:温度预设定,电机工作时间设定,防冻温度设定
//具有数据记忆功能
#include<pic.h>
#include"AT24CXX.h"
//*********变量类型***************
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//*[[[[[[[[[[[[[[[[[24C02的函数与定义[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
#define nop() asm("nop")
#define SCL RC6 //时钟
#define SDA RC7 //数据
void start_i2c(); //
void stop_i2c();
void send_byte(uchar c);
uchar receive_byte();
void I_send_str(uchar *s,uchar suba,uchar no) ;
void delay_250ms();
void i2c_error ();
void RdFromROM(uchar *s,uchar Ader, uchar Num);
static const uchar slaw = 0x0A0; //这一部分需要自己修改
static const uchar slar = 0x0A1; //这一部分需要自己修改
//********自定义II2发送与接收数组变量**************
//*********I2C*******
uchar no,ack,c,retc;//data1是接受数组;
//*]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]以上此内容为我所加第
//*[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
//[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[以下此内容为我所加第二部分[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[*/
//《〈〈〈〈〈〈〈〈〈〈I2C函数〉〉〉〉〉〉〉〉〉〉》》》》
/*******************************************************************
起动总线函数
函数原型: void start_i2c();
Function: start on the I2C bus
*******************************************************************/
void start_i2c()
{
TRISC6=0;
TRISC7=0;
SDA=1; //发送启始条件的数据信号
nop();
SCL=1;
nop();nop();nop();nop();nop(); //24LC02要求建立时间大于4,7S
SDA=0; //发送起始信号
nop();nop();nop();nop();nop();
SCL=0; //钳住I2C总线,准备发送数据或接收数据
nop();nop();
}
/*******************************************************************
停止总线函数
函数原型: void stop_i2c();
Function: stop the I2C bus
*******************************************************************/
void stop_i2c()
{
TRISC6=0;
TRISC7=0;
SDA=0; //发送结束条件的数据信号
nop();
SCL=1;
nop();nop();nop();nop();nop();
SDA=1;
nop();nop();nop();nop();
}
/*=================================================================
字节数据传送函数
函数原型: void send_byte(uchar c);
Function: 将数据C发送出去,可以是地址,也可以是数据,发完后等待回应,并对此状态
位进行操作(不应答或非应答都使ack=0 ),发送数据正常,ack=1;ack=0
表示被控器无应答或损坏。
==================================================================*/
void send_byte(uchar c)
{
uchar bit_count;
TRISC6=0;
TRISC7=0;
for (bit_count=0;bit_count<8;bit_count++)
{
if ((c<<bit_count)&0x80) {SDA=1;}
else {SDA=0;}
nop();
SCL=1;
nop();nop();nop();nop();nop();
SCL=0;
}
nop();nop();
SDA=1;
nop();nop();
SCL=1;
nop();nop();nop();
TRISC7=1;
if (RC7==1) ack=0;
else ack=1; //用ASK=1为有应答信号
SCL=0;
nop();nop();
}
/*==================================================================
字节数据接收函数
函数原型:uchar receive_byte();
FUNCTION: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
===================================================================*/
uchar receive_byte()
{
uchar retc,bit_count;
TRISC6=0;
TRISC7=0;
retc=0;
SDA=1;
for (bit_count=0;bit_count<8;bit_count++)
{
nop();
SCL=0;
nop();nop();nop();nop();nop();
SCL=1;
nop();nop();
retc=retc<<1;
TRISC7=1;
if (RC7==1) retc=retc+1;
nop();nop();
}
SCL=0;
nop();nop();
return (retc);
}
/*================================================================
向有子地址器件发送多字节数据函数
函数原型: bit I_send_str(uchar sla,uchar suba,uchar *s,uchar no);
Function: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla。如果
返回1表示操作成功,否则操作有误。
=================================================================*/
void I_send_str(uchar *s,uchar suba,uchar no)
{
uchar i;
start_i2c();
send_byte(slaw);
TRISC6=0;
TRISC7=0;
if (ack==0) i2c_error();
send_byte(suba);
if (ack==0) i2c_error();
for (i=0;i<no;i++)
{
send_byte(*s);
if (ack==0) i2c_error();
s++;
}
stop_i2c();
// return(1);
}
//**********从24C04读多字节到data1****
void RdFromROM(uchar *s,uchar Ader ,uchar Num)
{
uchar i=0;
TRISC6=0;
TRISC7=0;
for (i=0x00;i<Num;i++)
{
start_i2c();
send_byte(slaw); //发送器件地址,即DEVICE ADDRESS。
if (ack==0) i2c_error(); //如果24LC02无应答。则进入I2C ERROR错误指示。
send_byte(Ader+i); //发送字地址,即WORD ADDRESS。D口显示数组。
if (ack==0) i2c_error();
start_i2c(); //重新启动总线。
send_byte(slar); //发送读命令和器件地址DEVICE ADDRESS。
if (ack==0) i2c_error();
*(s+i)=receive_byte();
stop_i2c();
}
}
/*****************************************************************
延时函数
函数原型: void delay_250ms();
FUNCTION: 延明250ms
*****************************************************************/
void delay_250ms()
{
unsigned int d=1999;
while (--d);
}
/*****************************************************************
总线错误函数
函数原型: void i2c_error();
//Function: 通过RB0闪动8次表示总线操作失败一次报警。
*****************************************************************/
void i2c_error ()
{
uchar i;
for (i=0;i<8;i++)
{
RB5=0;
delay_250ms();
RB5=1;
delay_250ms();
}
}
/*********I2C结束*************/
//]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -