请教一个24c02的数据读写问题,谢谢大家了

2019-07-15 11:48发布

我想通过24c02,led1602实现按K1键写一个数(数的大小要求在0到9999,这个程序是自己基于之前能正常实现功能但只能读写0到255的数的一段代码改的),按K2键屏幕显示之前写的数的数值。但是实际操作后每次读出来的数不是255就是511,不知道哪里出了问题,希望大家耐心帮帮忙看看哪边出了问题,谢谢!!!
unsigned char wordCode0[6] = "write:";
unsigned char wordCode1[6] = " read:";

void At24c02Write(unsigned char ,unsigned short int dat );
unsigned short int At24c02Read(unsigned char );
void Delay10ms(unsigned int c);  

void main()
{
        unsigned short int num0,num1 = 0,n;
        LcdInit();
        LcdWriteCom(0x80);
        for(n=0; n<6; n++)
        {
                LcdWriteData(wordCode0[n]);
        }
        LcdWriteCom(0x80 + 0x40);
        for(n=0; n<6; n++)
        {
                LcdWriteData(wordCode1[n]);
        }
        while(1)
        {
                if(K1 == 0)               
                {
                        Delay10ms(1);
                        if(K1 == 0)
                                At24c02Write(2,num0);
                        while((n < 50)&&(K3==0))
                        {
                                n++;
                                Delay10ms(1);       
                        }                       
                        n=0;
                }
                if(K2 == 0)                 
                {
                        Delay10ms(1);
                        if(K2 == 0)
                                num1 = At24c02Read(2);
                        while((n < 50)&&(K2 == 0))
                        {
                                n++;
                                Delay10ms(1);       
                        }                       
                        n=0;
                }                       
                if(K3 == 0)                 
                {
                        Delay10ms(1);
                        if(K3 == 0)
                                num0++;
                }
                       
                if(K4 == 0)               
                {
                        Delay10ms(1);
                        if(K4 == 0)
                                num0--;
               
                }

    LcdWriteCom(0x87);               
                LcdWriteData('0' + (num0/1000));               
                LcdWriteData('0' + (num0%1000/100));                                       
                LcdWriteData('0' + (num0%1000%100/10));
                LcdWriteData('0' + (num0%1000%100%10));

                LcdWriteCom(0x87 + 0x40);
                LcdWriteData('0' + (num1/1000));               
                LcdWriteData('0' + (num1%1000/100));                                       
                LcdWriteData('0' + (num1%1000%100/10));
                LcdWriteData('0' + (num1%1000%100%10));
               
                       
        }
}                                                                         


void Delay10ms(unsigned int c)   
{
    unsigned char a, b;

       
    for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }         
        }      
}



void At24c02Write(unsigned char addr,unsigned short int dat)
{
        unsigned short int a,b;
        uchar c,d;
        a=a|dat;
        a=a>>8;
        c=(uchar)a;
        b=b|dat;
        d=(uchar)b;
       
        I2C_Start();
        I2C_Sendbyte(0xa0);
  ack();
        I2C_Sendbyte(addr);
  ack();       
        I2C_Sendbyte(c);
        ack();
        I2C_Sendbyte(d);
        ack();
        I2C_Stop();
}


unsigned short int At24c02Read(unsigned char addr)
{
        unsigned short int num;
        uchar e,f;
        I2C_Start();
        I2C_Sendbyte(0xa0);
          ack();
        I2C_Sendbyte(addr);
          ack();
        I2C_Start();

        I2C_Sendbyte(0xa1);
          ack();
        e=I2C_Readbyte();
         ack();
        f=I2C_Readbyte();
        I2C_Stop();
        num=e;
        num=num<<8;
        num=num|f;
       
       

       
        return num;       
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
ST_Lover
1楼-- · 2019-07-15 13:21
这里有AT24C02代码,                                 
hobbye501
2楼-- · 2019-07-15 14:29
你写和读的时候要有延时,写到那个寄存处地址 就读哪个  这个还是很简单的 网上例子也多 不行可以换个驱动程序试一试,应该是时序的问题  
八桂魁汉子
3楼-- · 2019-07-15 18:11
at24C在读写一个byte的时候是byte操作,但是超过一个字节就是页操作了,对照规格书的页操作时序好好检查一下,估计是页操作的页地址和时序有问题。你自己翻书吧,总不能叫别人还翻书帮你查程序,那学到的经验是别人的又不是你的。
liweihao
4楼-- · 2019-07-15 19:41
 精彩回答 2  元偷偷看……

一周热门 更多>