下面是I2CEPPROM的程序。为我程序一部分,为什么我读不出来呢?检查了几次都检查不出问题,请大神们看看,小弟谢谢啦!
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^0;//时钟
sbit SDA=P2^1;//数据
uchar *addw;
uchar *addr;
/**********************************************************
I2C+EPPROM子程序。
***********************************************************
延时程序
******************************/
void Delayms(uchar number)
{
uchar temp;
for(;number!=0;number--)
{
for(temp=125;temp!=0;temp--)
{
}
}
}
/******************************
起始信号程序
******************************/
void start()
{
SDA=1;
Delayms(1);
SCL=1;
Delayms(1);
SDA=0;
Delayms(1);
SCL=0;
Delayms(1);
}
/******************************
终止信号程序
******************************/
void stop()
{
SDA=0;
Delayms(1);
SCL=1;
Delayms(1);
SDA=1;
Delayms(1);
}
/******************************
发送应答信号程序
******************************/
void ack()
{
SDA=0;
Delayms(1);
SCL=1;
Delayms(1);
SDA=0;
Delayms(1);
SCL=1;
Delayms(1);
}
/******************************
发送非应答信号程序
******************************/
void noack()
{
SDA=1;
Delayms(1);
SCL=1;
Delayms(1);
SCL=0;
Delayms(1);
}
/******************************
应答位检查程序
******************************/
bit testack()
{
bit errorbit;
SDA=1;
Delayms(1);
SCL=1;
Delayms(1);
errorbit=SDA;//读入数据线上的应答状态
Delayms(1);
SCL=0;
Delayms(1);
return(errorbit);
}
/******************************
写一个字节数据程序
******************************/
bit writebit(uchar input)
{
uchar mm;
for(mm=0;mm<8;mm++)//循环移位,逐位发送数据
{
SDA=(bit)(input&0x80);//取数据的最高位
Delayms(1);
SCL=1;
Delayms(1);
SCL=0;
Delayms(1);
input=input<<1;
}
return 1;
}
/******************************
写n字节数据程序
******************************/
void writei2c(uchar *wdata,uchar romaddress,uchar shuzi)
{
start();
writebit(writedeviceaddress);//写器件的寻址地址
testack();//应答检查
writebit(romaddress);//写入I2C器件内部的数据存储首地址
testack();
for(;shuzi!=0;shuzi--)//循环,逐个字节发送
{
writebit(*wdata);//写一个字节
testack();//应答检查
wdata++;//指针增加,指向下一个数据
}
stop();
Delayms(1);
}
/******************************
读一个字节数据程序
******************************/
uchar readbit()
{
uchar mk,rbyte=0;
for(mk=8;mk!=0;mk--)//循环,逐位读入字节数据
{
SCL=1;
Delayms(1);
rbyte=rbyte<<1;//左移一位
Delayms(1);
rbyte=rbyte|((uchar)(SDA));//数据线SDA上的数据存入rbyte的最低位
SCL=0;
Delayms(1);
}
return (rbyte);//返回读入的字节数
}
/******************************
读n个字节数据程序
******************************/
void readi2c(uchar *ramaddress,uchar romaddress,uchar bytes)
{
start();
writebit(writedeviceaddress);//写内部寻址地址
testack();//应答检查
writebit(romaddress);//写I2C器件内部数据读取首地址
testack();
start();
writebit(readdviceaddress);//写读器件寻址地址
testack();
while(bytes!=1)
{
*ramaddress=readbit();//读入一个字节
ack();//应答
ramaddress++;//地址指针递增
bytes--;//带读入数据个数递减
}
*ramaddress=readbit();//读入最后一个字节数据
noack();//非应答
stop();//停止
}
void display1() //密码锁(这个是在12864上写的密码锁,我定义一个数组keyjie[6],用遥控器按值送入这个数组,并把这个数组写进EPPROM中,最后将其读出来显示在12864中)
{
uchar x;
if(dd>5&&dd<16&&bk==1)
{
if(ll==1)
{
x=(dd-6)+0x30;
lcd_pos(2,1);//写12864地址程序
keyjie[0]=x;//读取按键密码
lcd_wdat(keyjie[0]);
delay1(30);
lcd_pos(2,1);
lcd_wdat('*');//12864写数据程序
}
if(ll==2)
{
x=(dd-6)+0x30;
lcd_pos(2,2);
keyjie[1]=x;//读取按键密码
lcd_wdat(keyjie[1]);
delay1(30);
lcd_pos(2,2);
lcd_wdat('*');
}
if(ll==3)
{
x=(dd-6)+0x30;
lcd_pos(2,3);
keyjie[2]=x;//读取按键密码
lcd_wdat(keyjie[2]);
delay1(30);
lcd_pos(2,3);
lcd_wdat('*');
}
if(ll==4)
{
x=(dd-6)+0x30;
lcd_pos(2,4);
keyjie[3]=x;//读取按键密码
lcd_wdat(keyjie[3]);
delay1(30);
lcd_pos(2,4);
lcd_wdat('*');
}
if(ll==5)
{
x=(dd-6)+0x30;
lcd_pos(2,5);
keyjie[4]=x;//读取按键密码
lcd_wdat(keyjie[4]);
delay1(30);
lcd_pos(2,5);
lcd_wdat('*');
}
if(ll==6)
{
x=(dd-6)+0x30;
lcd_pos(2,6);
keyjie[5]=x;//读取按键密码
lcd_wdat(keyjie[5]);
delay1(30);
lcd_pos(2,6);
lcd_wdat('*');
}
} delay1(100);
}
void wmima()//给EPPROM写密码
{
bit write=1;
while(1)
{
if(write==1)
{
addw=keyjie;
writei2c(addw,0x00,6);
write=0;
}
if(write==0) break;
}
}
void rmima()//读密码
{
uchar i;
uchar y=0;
uchar z=0;
uchar readbyte[6];
addr=readbyte;
readi2c(addr,0x00,6);
if(dd==16)
{
for(i=0;i<6;i++)
{
lcd_pos(3,y);
lcd_wdat(readbyte
);
y++;
}
}
}//延时程序和12864写地址和写数据等程序就没写了,主要是看看这个I2C程序。。还请大神帮忙看下。小弟不胜感激。
来自小组: 单片机学习交流群
一周热门 更多>