📄 seeprom.c
字号:
#include"Globle.h"
sbit SDA=P2^3; //数据
sbit SCL=P2^2; //时钟
#define IIC_READ 0XA1 //读指令
#define IIC_WRITE 0XA0 //写指令
//sbit SDA=P2^1; //数据
//sbit SCL=P2^2; //时钟
unsigned char bdata bbyte; //定义位操作用数组,采用此方法可提高位操作速度
UBYTE eep_ack_f=0;
sbit a0=bbyte^0;
sbit a1=bbyte^1;
sbit a2=bbyte^2;
sbit a3=bbyte^3;
sbit a4=bbyte^4;
sbit a5=bbyte^5;
sbit a6=bbyte^6;
sbit a7=bbyte^7;
sbit bit7=bbyte^7;
sbit bit0=bbyte^0;
bit IFACK; //应答标志
bit NO_ACK; //无应答
//sbit Disp=P0^1; //数据
//sbit CLK=P0^0; //时钟信号
UBYTE seep_err_time;
#define seep_err_time_limit 5
void delay1()
{
unsigned int m=25000;
while(--m);
}
//unsigned char bdata DISP_duan;
//sbit bt7=DISP_duan^7;
/*-------------------------------------
函数: void start();
功能: 开始;
--------------------------------------*/
void start(void)
{
SDA=1;SCL=1;NOP;NOP;NOP;NOP;SDA=0;NOP;NOP;NOP;NOP;SCL=0;
}
/*-------------------------------------
函数: void stop();
功能: 停止;
--------------------------------------*/
void stop(void)
{
SDA=0;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SDA=1;NOP;NOP;NOP;NOP;SCL=0;
}
/*-------------------------------------
函数: void ack();
功能: 主器件产生应答;
--------------------------------------*/
void Ack(void)
{
SCL=0;SDA=0;SCL=1;SCL=0;
}
/*-------------------------------------
函数: void nack(uchar type);
功能: 释放数据线后去接收一个应答信号或则是无应答信号;
type=1等待应答信号
type=0 产生无应答信号
--------------------------------------*/
void nack(unsigned char type)
{
SCL=0;SDA=1;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;NOP;IFACK=SDA; SCL=0;
if(type)
{
// IFACK=0;//
if(IFACK)//如果无应答信号,则置标志位NO_ACK,程序中止
{
NO_ACK=1;
//while(1);
}
//else NO_ACK=0;
}
}
/*-------------------------------------
函数: void inbyte(void);
功能: 从IIC器件中读出一个字节的数据;
--------------------------------------*/
unsigned char inbyte(void) {
SDA=1;
SCL=1;a7=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP; //高低电平保持时间4us
SCL=1;a6=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;
SCL=1;a5=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;
SCL=1;a4=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;
SCL=1;a3=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;
SCL=1;a2=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;
SCL=1;a1=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;
SCL=1;a0=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;
return(bbyte);
}
/*-------------------------------------
函数: void inbyte(void);
功能: 将一个字节的数据写放到IIC器件
--------------------------------------*/
void outbyte(unsigned char outdata) {
bbyte=outdata;
SDA=a7;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
SDA=a6;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
SDA=a5;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
SDA=a4;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
SDA=a3;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
SDA=a2;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
SDA=a1;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
SDA=a0;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
}
void read_f (unsigned int add) //读数据初始化
{
unsigned char temp,tempr;
temp=IIC_WRITE;
tempr=IIC_READ;
if(add>>8){temp|=0x02;tempr|=0x02;}
start(); //开始信号
outbyte(temp); //写命令
nack(1); //等待应答
outbyte((unsigned char)add); //写地址
nack(1); //等待应答
start(); //开始信号
outbyte(tempr); //读命令
nack(1); //等待应答
}
/*--------------------------------------------------*/
void write_f(unsigned int add) //写初始化
{
unsigned char temp;
temp=IIC_WRITE;
if(add>>8){temp|=0x0002;}
start(); //开始信号
outbyte(temp); //写命令
nack(1); //等待应答
outbyte((unsigned char)add); //写地址
nack(1); //等待应答
}
/*-------------------------------------
函数: uchar readbyte (uint add)//add为读地址
uint read_int(uint add)
ulong read_long(uint add)
功能: 读数据
--------------------------------------*/
unsigned char read_byte (unsigned int add) //读一个字节的数据
{
unsigned char temp,i;
for(i=seep_err_time_limit;i>=1;i--)
{
NO_ACK=0;
read_f (add);
temp=inbyte(); //读数据
nack(0); //无应答
stop(); //停止信号
if(!NO_ACK) break;
}
if(!i) eep_ack_f=1;
return(temp);
}
/*-------------------------------*/
unsigned int read_int(unsigned int add) //读整形数据ok
{
WordType dt;
dt.bytes.bh=read_byte(add);
delay1();
dt.bytes.bl=read_byte(add+1);
nack(0);
stop();
return(dt.wd);
}
/*-------------------------------------------------*/
#if 0
unsigned long read_long(unsigned int add) //读长整形数据
{
Longtype ln_tmp;
read_f (add);
ln_tmp.words.wd1.bytes.bh=inbyte();
Ack();
ln_tmp.words.wd1.bytes.bl=inbyte();
Ack();
ln_tmp.words.wd0.bytes.bh=inbyte();
Ack();
ln_tmp.words.wd0.bytes.bl=inbyte();
nack(0);
stop();
return(ln_tmp.lwd);
}
#endif
/*-----------------------------------------------------*/
/*-------------------------------------
函数: void writebyte(uint add,uchar wbyte);
功能: 写数据; add为写入地址;wbyte为写入数据
--------------------------------------*/
#if 0
void write_byte(unsigned int add,unsigned char wbyte) //写一个字节数据
{
UBYTE i;
for(i=seep_err_time_limit;i>=1;i--)
{
NO_ACK=0;
write_f(add);
outbyte(wbyte); //写数据
nack(1);
if(!NO_ACK) break;
}//等待应答
if(!i) eep_ack_f=1;
} //等待应答
#endif
/*-------------------------------------------------*/
void write_int(unsigned int add,unsigned int wint) //写整形
{
WordType dt;
write_f(add);
dt.wd=wint;
outbyte(dt.bytes.bh);
nack(1);
outbyte(dt.bytes.bl);
nack(1);
stop();
}
#if 0
void save_int(unsigned int add,unsigned int indata) //保存整形
{
write_int(add,indata);
}
#endif
/*----------------------------------------------------*/
#if 0
void save_long(unsigned int add,unsigned long wlong) //写长整形
{
Longtype ln_tmp;
ln_tmp.lwd=wlong;
write_f(add);
outbyte(ln_tmp.words.wd1.bytes.bh);
nack(1);
outbyte(ln_tmp.words.wd1.bytes.bl);
nack(1);
outbyte(ln_tmp.words.wd0.bytes.bh);
nack(1);
outbyte(ln_tmp.words.wd0.bytes.bl);
nack(1);
stop();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -