写好的程序在仿真的时候只能写到地址0X00FF,就又跳到地址0X0000开始写了。求帮看看哪出问题了
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA = P3^5;
sbit SCL = P3^6;
uchar n_data[]={22,3,5,7,9,11,23,45,69};
/************************************************************************/
void delay(int i)
{
int j;
while(i--)
for(j=255;j>0;j--);
}
/************************************************************************/
void iic_delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/************************************************************************/
void iic_start()
{
SDA = 1;
SCL = 1;
iic_delay();
SDA = 0;
iic_delay();
SCL = 0;
}
/************************************************************************/
void iic_stop()
{
SDA=0;
SCL=0;
iic_delay();
SCL=1;
iic_delay();
SDA=1;
}
/************************************************************************/
/* 发送ACK信号 */
/************************************************************************/
void ack()
{
SDA=0;
iic_delay();
SCL=1;
iic_delay();
SCL=0;
}
/************************************************************************/
/* 发送NOACK信号 */
/************************************************************************/
void iic_noack()
{
SDA=1;
iic_delay();
SCL=1;
iic_delay();
SCL=0;
}
/********************************************************************
等待ACK信号
***********************************************************************/
void iic_wait_ack()
{
uchar tt=200;
SDA=1;
iic_delay();
SCL=1;
iic_delay();
while(SDA && tt--){}
SCL=0;
}
/********************************************************************
向iic设备发送一个字节
说明:CY是溢出位
***********************************************************************/
void iic_send_byte(uchar sbyte)
{
uchar i;
for(i=0;i<8;i++)
{
sbyte<<=1;
SCL = 0;
_nop_();
SDA = CY;
iic_delay();
SCL = 1;
iic_delay();
}
SCL=0;
iic_delay();
SCL = 1;
iic_delay();
}
/********************************************************************
MCU从iic设备接收一个字节
***********************************************************************/
uchar iic_receive_byte()
{
uchar i;
uchar ddata=0;
SCL=0;
iic_delay();
SDA=1;
for(i=0;i<8;i++)
{
ddata <<= 1;
SCL=0;
iic_delay();
SCL=1;
iic_delay();
ddata |= SDA;
}
SCL=0;
return ddata;
}
/********************************************************************
向iic设备写入N个字节
说明:write_data,写入字节的数组
Address,从address处开始写入
n,写入的字节数
***********************************************************************/
void AT24C64_W(uchar d[], uint address, uchar num)
{
uchar i;
iic_start();
iic_send_byte(0xa0); //器件地址
iic_wait_ack();
iic_send_byte(address/256); //传高8位地址
iic_wait_ack();
iic_send_byte(address%256); //传低8位地址
iic_wait_ack();
for(i=0; i<num; i++)
{
iic_send_byte(d[i]);
iic_wait_ack();
}
iic_stop();
}
/********************************************************************
从iic设备读取N个字节
说明:read_data ,存放字节的数组 ;
address,指定从address处开始读取
num,读取的字节数
***********************************************************************/
void AT24C64_R(uchar d[] , uint address, uchar n)
{
uchar i;
uchar *pp;
pp = d;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address>>8);
iic_wait_ack();
iic_send_byte(address & 0xff);
iic_wait_ack();
iic_start();
iic_send_byte(0xa1);
iic_wait_ack();
for (i=0; i<n; i++)
{
*pp = iic_receive_byte();
pp++;
if (i <(n - 1))
{
ack();
}
}
iic_noack();
iic_stop();
}
void main()
{ uint j;
uchar aa[9]={0};
j=0x1100;
while(1)
{
AT24C64_W(n_data,j,9);
delay(5);
AT24C64_R(aa,0x0000,9);
j=j+9;
// P0=numtab[aa[0]]; //数码管的数据位
if (j==0xffff)
{ j=0x00;
}
}
}
|