新聞中心

24C02的存儲(chǔ)與讀取

作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏
/*

------24C02存儲(chǔ)與讀取-----------
1、用24C02來(lái)保存一個(gè)數(shù)組的內(nèi)容,然后再把它讀出來(lái);
2、應(yīng)熟練掌握IIC總線的操作方法;
3、啟動(dòng)信號(hào)、停止信號(hào),應(yīng)答與非應(yīng)答信號(hào)、測(cè)忙信號(hào)
從當(dāng)前位置讀一個(gè)字節(jié)數(shù)據(jù)子程序,從當(dāng)前位置寫一個(gè)字節(jié)子程序,
從指定位置讀一個(gè)字節(jié)數(shù)據(jù)子程序,從指定位置寫一個(gè)字節(jié)子程序。

本文引用地址:http://butianyuan.cn/article/201611/315576.htm

4、各種信號(hào)的操作時(shí)序;
5、該程序也可作為IIC的通用子程序使用;
6、該程序在普中單片機(jī)實(shí)訓(xùn)箱上通過測(cè)試;

*/

#include
#include
#define uint unsigned int
#define uchar unsigned char
unsigned char code dula[] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchar wula[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbit sda=P2^1; //定義串行數(shù)據(jù)口
sbit scl=P2^0; //定義串行時(shí)鐘口
void delay(uint z);
void start();
void stop();
void ack(bit aa);
uchar iic_readbyte();
void iic_writebyte(uchar date1);
void checkack();
uchar iic_addr_read(uchar addr);
void iic_addr_write(uchar addr,uchar date1);
void iic_addr_readn(uchar addr,uchar *s,uchar n);
void iic_addr_writen(uchar addr,uchar *s,uchar n);
void disp();
void nop5();
uchar write1[]={1,2,10,0,0,10,4,8,9,3};
uchar read1[]={0,0,0,0,0,0,0,0,0,0};
bit ack1;
uchar temp3;
//uchar flag1,flag2,num1,num2;
void main()
{
/* 第一種方法從24C02中讀取和寫入多個(gè)字節(jié)
uchar jj;
for(jj=0;jj<8;jj++)
{
iic_addr_write(jj+5,write1[jj]);
delay(10);//此延時(shí)很重要;
}

delay(10);
for(jj=0;jj<8;jj++)
{
read1[jj]=iic_addr_read(jj+5);
delay(10);//此延時(shí)很重要;
} */
//
//第二種方法從24C02中讀取和寫入多個(gè)字節(jié)
iic_addr_writen(8,write1,8);
delay(50);
iic_addr_readn(8,read1,8);

while(1)
{disp();
}
}


//-----5US的延時(shí)子程序--------------
void nop5()
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//-------XMS延時(shí)子程序----------------
void delay(uint z)
{
uint x,y;
for(x=0;xfor(y=0;y<112;y++);
}

//-------啟動(dòng)信號(hào)-----------
void start()
{
sda=1;
nop5();
scl=1;
nop5();
sda=0;
nop5();
scl=0;
nop5();
}
//-------停止信號(hào)-----------
void stop()
{
sda=0;
nop5();
scl=1;
nop5();
sda=1;
nop5();
scl=1;
nop5();
}
//=------應(yīng)答與非應(yīng)答信號(hào)---------
void ack(bit aa)
{
scl=0;
nop5();
if(aa==1)
sda=1;
else
sda=0;
scl=1;
nop5();
scl=0;
nop5();
}
//-------測(cè)忙信號(hào)------------
void checkack()
{ uchar i;
sda=1;
scl=0;
nop5();
scl=1;
nop5();
while((sda==1)&&(i<250))
{i++;}
scl=0;
nop5();
}
//-------從當(dāng)前位置讀一個(gè)字節(jié)數(shù)據(jù)子程序---------------

uchar iic_readbyte()
{
uchar i,temp;
sda=1;
scl=0;
nop5();
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=1;
nop5();
temp=temp|sda;
scl=0;
// nop5();
// nop5();
}
scl=0;
nop5();
return(temp);
}
//-----從當(dāng)前位置寫一個(gè)字節(jié)子程序-------------
void iic_writebyte(uchar date1 )
{
uchar i,temp;
temp=date1;
for(i=0;i<8;i++)
{
temp=temp<<1;
sda=CY;
scl=1;
nop5();
scl=0;
//nop5();
// nop5();
}
checkack();
delay(1);
scl=0;
nop5();
}
//---從指定位置讀一個(gè)字節(jié)數(shù)據(jù)子程序-----------------
uchar iic_addr_read(uchar addr)
{ uchar k2;
start();
iic_writebyte(0xa0);
delay(1);
iic_writebyte(addr);
delay(1);
start();
delay(10);
iic_writebyte(0xa1);
delay(10);
k2=iic_readbyte();
ack(1);
stop();
return(k2);
}

//---從指定位置寫一個(gè)字節(jié)子程序-------------
void iic_addr_write(uchar addr,uchar date1)
{
start();
iic_writebyte(0xa0);
delay(1);
iic_writebyte(addr);
delay(1);
iic_writebyte(date1);
delay(1);
stop();
}
//----------從指定位置寫多個(gè)字節(jié)子程序-------------------
void iic_addr_writen(uchar addr,uchar *s,uchar n)
{
uchar i;
start();
iic_writebyte(0xa0);
//delay(1);
iic_writebyte(addr);
// delay(1);
for(i=0;i {
iic_writebyte(*s);
delay(20);//此延時(shí)一定要長(zhǎng)一些,否則易出錯(cuò)
s++; //因?yàn)槠骷磻?yīng)時(shí)間慢,給它留足夠的時(shí)間;
}
stop();
}
//-------從指定位置讀多個(gè)字節(jié)數(shù)據(jù)子程序-------------------------
void iic_addr_readn(uchar addr,uchar *s,uchar n)
{
uchar i;
start();
iic_writebyte(0xa0);
//delay(1);
iic_writebyte(addr);
//delay(10);
start();
//delay(15);
iic_writebyte(0xa1);
//delay(10);
for(i=0;i{
*s=iic_readbyte();
delay(1);
ack(0);
delay(20);//此延時(shí)一定要長(zhǎng)一些,否則易出錯(cuò)
s++; //因?yàn)槠骷磻?yīng)時(shí)間慢,給它留足夠的時(shí)間;
}
*s=iic_readbyte();
ack(1);
stop();
}

//-----顯示數(shù)據(jù)----------
void disp()
{uchar i;
for(i=0;i<8;i++)
{P0=dula[read1[i]];
P1=wula[i];
delay(3);
P0=0;
}
}



關(guān)鍵詞: 24C02存儲(chǔ)與讀

評(píng)論


技術(shù)專區(qū)

關(guān)閉