?? 24c256.c
字號:
# include<pic.h>
# define uch unsigned char
# define unint unsigned int
# define SDA RC4
# define SCL RC3
uch ACK;
void delay(void) //延時
{
unint m;
for(m=0;m<0xffff;m++)
continue;
}
void start (void) // IIC開始
{
TRISC3=0; //置輸出
TRISC4=0;
SDA=1;
asm("nop");
SCL=1; //在至少4u秒期間SDA從高電平到低電平
asm("nop");
asm("nop");
asm("nop");
SDA=0;
asm("nop");
asm("nop");
asm("nop");
SCL=0;
asm("nop");
asm("nop");
}
void stop(void) // IIC結束
{ TRISC3=0;
TRISC4=0; //置輸出
SDA=0;
asm("nop");
SCL=1; //在至少4u秒期間SDA從低電平到高電平
asm("nop");
asm("nop");
asm("nop");
SDA=1;
asm("nop");
asm("nop");
asm("nop");
SCL=0;
asm("nop");
asm("nop");
}
uch check(void) // 檢查應答信號
{
TRISC4=1;
SCL=0;
SCL=1;
if (SDA == 1)
{
ACK = 1;
}
else
{
ACK = 0;
}
SCL=0;
return(ACK);
}
void send(uch data) // 發送一個字節
{
uch bitcount=8; //發送8位
do
{
TRISC3=0; //置輸出
TRISC4=0;
if((data&0x80)==0x80)
{
SDA=1; //發送 1
}
else
{
SDA=0; //發送 0
}
SCL=0; // 在時鐘大于4u秒期間寫數據
SCL=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
SCL=0;
data=data<<1;
bitcount--;
} while(bitcount);
TRISC4=1 ; //釋放總線等待應答
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
uch recive(void) //接受一個字節
{
uch temp1=0;
uch bitcount1=8;
TRISC4=1; //置輸入
TRISC3=0;
do
{ SCL=0; //在時鐘大于4u秒期間讀數據
SCL=1;
asm("nop");
asm("nop");
if(SDA) //讀 1
{
temp1=temp1|0x01;
}
else //讀 0
{
temp1=temp1&0xfe;
}
SCL=0;
if(bitcount1-1)
{
temp1=temp1<<1;
}
bitcount1--;
}while(bitcount1);
return(temp1);
}
void ack(void) //發送繼續讀信號
{
SDA=0;
SCL=0;
SCL=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
SCL=0;
}
void nack(void) //停止繼續讀
{
SDA=1;
SCL=0;
SCL=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
SCL=0;
}
void wrtoROM(uch *data,unint address,uch num) //給24LC256寫數據
{ unint i;
unint adrl=address%256; //低8位地址
unint adrh=address/256; //高8位地址
start(); //起始信號
send(0xa2); //寫主控器識別地址,本人是a2
do{;
}while(check()); //等待應答
send(adrh); //送數據高8位地址
do{;
}while(check()); //等待應答
send(adrl); //送數據低8位地址
do
{
;
}while(check()); //等待應答
for(i=0;i<num;i++,data++) //發送從地址adress開始的num個數據
{
send(*data); //發送數據
do{;
}while(check()); //等待應答
}
stop(); //停止
delay(); //延時,下次發數據
}
void rdfromROM(uch *pdata,unint address,uch num2) //從24LC256中讀數據
{ unint adrl;
unint adrh;
uch j;
for(j=0;j<num2;j++,pdata++)
{
adrl=address%256; //地址低位
adrh=address/256; //地址高位
start(); //開始
send(0xa2); //寫主控器識別地址(寫),本人是a2
do{
;
}while(check()); //等待應答
send(adrh); //送高位
do
{
;
}while(check()); //等待應答
send(adrl); //送低位
do
{
;
}while(check()); //等待應答
start(); //開始讀數據
send(0xa3); //寫主控器識別地址(讀)
do
{
;
}while(check()); //等待應答
*pdata=recive();
nack();
stop();
address=address+1; //指向下一個地址
}
}
main()
{ unint h,n;
uch m;
uch str[64]={0x5d,0x5d,0x32,0x18,0x6c,0x88,0xa0,0x1d,0x20,0x08};
SCL=1;
SDA=1;
PORTD=0XFF;
TRISD=0;
for(n=0;n<256;)
{
wrtoROM(str,n,64); //寫一頁的數據,根據24LC256一頁是64個字節
n=n+64; //寫下一頁數據
}
for(h=0;h<64;h++) //數組清0
{
str[h]=0x21;
}
delay();
rdfromROM(str,0x02,64); //讀從地址0開始的一頁數據
while(1)
{
for(m=0;m<64;m++)
{
PORTD=str[m];
delay();
PORTD=0XFF;
delay();
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -