51单片机E2PROM读写问题

2019-07-15 09:03发布

   I2C 总线上,PCF8591 可以直接在1602上显示, 数据变化正常,但是PCF8591接入E2PROM后,读取出来的数据一直都是0XFF,哪位大神帮忙看看什么原因?
#include <reg52.h>
#include "i2c.h"
#define  DATA P0
sbit rs=P1^3;
sbit rw=P1^4;
sbit en=P1^5;
u8 lcd1602[5];

void write_1602com(u8 com)
{
     rs=0;
         rw=0;
         en=0;
         en=1;
         DATA=com;
         delay(5);
         en=0;
}
void write_1602dat(u8 dat)
{
     rs=1;
         rw=0;
         en=0;
         en=1;
         DATA=dat;
         delay(5);
         en=0;
}
void init()
{
      write_1602com(0x02);
          write_1602com(0x06);
          write_1602com(0x0c);
          write_1602com(0x38);
          write_1602com(0x01);
}
void display(u8 dat)
{
         u16 t;
                 t=dat*(50000.0/255)*2;                                 //        不知道为什么要乘上2,不然最大值只有一半
                 lcd1602[4]=t/10000;                                
         lcd1602[3]=(t-lcd1602[4]*10000)/1000;                  
         lcd1602[2]=(t-lcd1602[4]*10000-lcd1602[3]*1000)/100;                        
         lcd1602[1]=(t-lcd1602[4]*10000-lcd1602[3]*1000-lcd1602[2]*100)/10;         
         lcd1602[0]=t%10;                        
             write_1602com(0x83);
             write_1602dat(lcd1602[4]+'0');
                 delay(2);
                 write_1602com(0x84);
             write_1602dat(lcd1602[3]+'0');
                    delay(2);
                 write_1602com(0x85);
             write_1602dat(lcd1602[2]+'0');
                    delay(2);
                 write_1602com(0x86);
             write_1602dat(lcd1602[1]+'0');
                    delay(2);
                 write_1602com(0x87);
             write_1602dat(lcd1602[0]+'0');
                    delay(2);
}
u8 read_PCF8591()
{
        u8 fun;
                start_i2c();
                write_i2c(0x90);   
             i2c_wait_ack();
                 // return 1;
                write_i2c(0x00);  
                i2c_wait_ack();
                  //return 1;
                start_i2c();
                write_i2c(0x91);
                i2c_wait_ack();
                  //return 1;
                fun=read_i2c();
                ack_i2c(0);
                stop_i2c();
                return fun;
}
void main()
{         
         init();
         while(1)
             {        
           write_i2c_address( 532 ,read_PCF8591());
                 
                display(read_i2c_address( 532 ));
          //        display(read_PCF8591());
                //delay(1000);
          }
}

#include "i2c.h"
void delay(u8 n)
{
   u8 x,y;
   for(x=n;x>0;x--)
     for(y=110;y>0;y--);
}
void nops()                  //5ns延时  
{
  do{_nop_();_nop_();_nop_();_nop_();_nop_();} while(0);
}
void start_i2c()         
{
           sda=1;
        nops();
        scl=1;
        nops();
        sda=0;
        nops();
}
void stop_i2c()               
{
    sda=0;
        nops();
        scl=1;
        nops();
        sda=1;
        nops();
}
void ack_i2c(bit ck)   
{
    if(ck)                          
           sda=0;               
        else
           sda=1;               
        nops();
        scl=1;                                
        nops();
        scl=0;                                 
        nops();
        sda=1;                                 
        nops();   
}                        
void i2c_wait_ack()                 
{
         u8 i;  
         scl=1;  
         nops();  
         while((sda==1)&&(i<250)) i++;  
         scl=0;  
         nops();
}
void write_i2c(u8 dat)           
{
    u8 i;
        for(i=0;i<8;i++)           
          {
             scl=0;                        
                 nops();
             if(dat&0x80)         
                  sda=1;                  
                 else
                  sda=0;                 
                  nops();
                  
                  scl=1;                          
                  dat<<=1;                  
                  nops();
          }
}
u8 read_i2c()                        
{

         u8 i,temp=0;  
         scl=0;  
         nops();  
         sda=1;     
         nops();  
         for(i=0;i<8;i++)  
         {   
           temp=temp<<1;   
           scl=1;   
           nops();  
           temp=temp|sda;   
           scl=0;   
           nops();
          }  
          return (temp);
}
void write_i2c_address(u8 add,u8 dat_byte)               
{
    start_i2c();
    write_i2c(0xa2);
        i2c_wait_ack();        
        write_i2c(add/256);
        i2c_wait_ack();
        write_i2c(add%256);
        i2c_wait_ack();
        write_i2c(dat_byte);
        i2c_wait_ack();
        stop_i2c();
        delay(5000);
}
u8 read_i2c_address(u8 read_add)                        
{        
    u8 read_byte=0;
    start_i2c();
        write_i2c(0xa2);
    i2c_wait_ack();
    write_i2c(read_add/256);        
        i2c_wait_ack();
        write_i2c(read_add%256);        
        i2c_wait_ack();
        start_i2c();
        write_i2c(0xa3);
    i2c_wait_ack();
        read_byte=read_i2c();
//        ack_i2c(0);
        stop_i2c();
        return read_byte;
}                        

0条回答

一周热门 更多>