找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11655|回复: 6
收起左侧

pic 怎么向24C08存储块里写程序。

[复制链接]
ID:3230 发表于 2008-7-11 21:47 | 显示全部楼层 |阅读模式
各位大侠好!

 小弟遇到一个问题,PIC怎么向存储块24C08里面里写程序,这个程序怎么写。请大虾帮我一下,感谢不尽。
回复

使用道具 举报

ID:3230 发表于 2008-7-11 21:48 | 显示全部楼层

我要的掉电存储。谢谢

回复

使用道具 举报

ID:3271 发表于 2008-7-15 15:57 | 显示全部楼层

网上有

回复

使用道具 举报

ID:4661 发表于 2008-8-28 16:16 | 显示全部楼层
baidu上搜24c01代码。
回复

使用道具 举报

ID:67495 发表于 2014-10-16 18:38 | 显示全部楼层
baidu上搜
回复

使用道具 举报

ID:66032 发表于 2014-10-22 11:46 | 显示全部楼层
给你写了一个,编译了一下没有问题, 运行也没问题
//********************* AT24C08 Application ******************************//

#include <pic.h>

__CONFIG(HS&WDTDIS&LVPDIS);
//__CONFIG(0x3B31);
#define uchar unsigned char
#define uint  unsigned int

//LCD 1602 Port Configuration
#define E   RB3            //RB3 is connected to LCD 1602 Pin_E;
#define RW  RB4            //RB4 is connected to LCD 1602 Pin_RW;
#define RS  RB5            //RB5 is Connected to LCD 1602 RS;

//Hardware I2C Configuration
#define SCL   RC3      //AT24C08  Pin_SCL is connected to RC3;
#define SDA   RC4      //AT24C08  Pin_SDA is connected to RC4;
#define I2C_PageSize      16               
uchar Databuf;     //define the data;
uint boot_times1, boot_times2;

void I2C_Initialize(void)
{
    SSPADD=0x02;           //¨o¡à?¨®=Fosc/(4*(SSPADD+1)),¡à?¨¤y?a333KHz
    SSPSTAT=0X80;          //2¨|¨®?¡à¨o¡á??¡ê¨o?¡ê?¨o?¨¨?|ì????¨2¡á?IIC¡á¨1??¡à¨o¡á?
    SSPCON=0X28;           //IIC¨a¡§D?1|?¨1¨o1?¨1,IIC?¡Â??¡¤?¨o?
    SSPCON2=0;             //3?¨o??¡¥SSPCON2??¡ä??¡Â
}


void Write_AT24C08(uchar WriteAddr,uchar Databuf)
{
    SEN=1;                 //2¨2¨|¨2IIC???¡¥D?o?
    while(SEN==1);         //?¡à|ì????¡¥?a?1
    SSPIF=0;               //??SSPIF¡à¨o????

    SSPBUF=0xA0;           //¡¤¡é?¨aAT24C08|ì??¡Â?t|ì??¡¤o¨aD¡äD?o?
    while(SSPIF==0);       //?¡à|ì?¡¤¡é?¨a¨a¨o¡à??a?1
    SSPIF=0;               //??SSPIF¡à¨o????

    SSPBUF=WriteAddr;
    while(SSPIF==0);       //?¡à|ì?¡¤¡é?¨a¨a¨o¡à??a?1
    SSPIF=0;               //??SSPIF¡à¨o????

    SSPBUF=Databuf;        //¡¤¡é?¨a¨oy?Y
    while(SSPIF==0);       //?¡à|ì?¡¤¡é?¨a¨a¨o¡à??a?1
    SSPIF=0;               //??SSPIF¡à¨o????

    PEN=1;                 //2¨2¨|¨2IIC¨a¡ê?1D?o?
    while(PEN==1);         //?¡à|ì?¨a¡ê?1?a?1
    SSPIF=0;               //??SSPIF¡à¨o????
}


unsigned Read_AT24C08(uchar Addr)
{
    unsigned char buf;     //?¡§¨°?¨°?????¡ä??¡Â¨®?¨¤¡ä?Y¡ä??¨¢3?|ì?¨oy?Y
    SEN=1;                 //2¨2¨|¨2IIC???¡¥D?o?
    while(SEN==1);         //?¡à|ì????¡¥?a?1
    SSPIF=0;               //??SSPIF¡à¨o????

    SSPBUF=0xA0;           //¡¤¡é?¨aAT24C08|ì??¡Â?t|ì??¡¤o¨aD¡äD?o?
    while(SSPIF==0);       //?¡à|ì?¡¤¡é?¨a¨a¨o¡à??a?1
    SSPIF=0;               //??SSPIF¡à¨o????

    SSPBUF=Addr;        //¡¤¡é?¨a|ì??¡¤
    while(SSPIF==0);       //?¡à|ì?¡¤¡é?¨a¨a¨o¡à??a?1
    SSPIF=0;               //??SSPIF¡à¨o????

    RSEN=1;                //2¨2¨|¨2IIC?????¡¥D?o?
    while(SSPIF==0);       //?¡à|ì????¡¥?a?1
    SSPIF=0;               //??SSPIF¡à¨o????

    SSPBUF=0xA1;           //¡¤¡é?¨aAT24C08|ì??¡Â?t|ì??¡¤o¨a?¨¢D?o?
    while(SSPIF==0);       //?¡à|ì?¡¤¡é?¨a¨a¨o¡à??a?1
    SSPIF=0;               //??SSPIF¡à¨o????

    RCEN=1;                //¨|¨¨???¨¢?¨oD¨a
    while(SSPIF==0);       //?¡à|ì?¡¤¡é¨a¨o?a?1
    buf=SSPBUF;            //?¨¢3?¨oy?Y¡¤?¨¨?buf?D?Y¡ä?
    ACKDT=1;               //?¡ä¨¨¡¤¨¨?¨oy?Y??
    ACKEN=1;               //¡¤¡é?¨a¨®|¡äeD?o?
    while(SSPIF==0);       //?¡à|ì?¡¤¡é?¨a¨a¨o¡à??a?1
    SSPIF=0;               //??SSPIF¡à¨o????

    PEN=1;                 //2¨2¨|¨2IIC¨a¡ê?1D?o?
    while(PEN==1);         //?¡à|ì?¨a¡ê?1?a?1
    SSPIF=0;               //??SSPIF¡à¨o????

    return(buf);           //???¨¢3?¨oy?Y¡¤|ì??
}


void I2C_PageWrite(uchar* pBuffer, uchar WriteAddr, uint NumByteToWrite)
{
  
    while(NumByteToWrite--)  
     {
      /* Send the current byte */
      Write_AT24C08(WriteAddr,*pBuffer);   
      pBuffer++;
     }
  }

void I2C_BufferWrite(uchar* pBuffer, uchar WriteAddr, uint NumByteToWrite)
{
  uchar NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;
  Addr = WriteAddr % I2C_PageSize;
  count = I2C_PageSize - Addr;
  NumOfPage =  NumByteToWrite / I2C_PageSize;
  NumOfSingle = NumByteToWrite % I2C_PageSize;

  /* If WriteAddr is I2C_PageSize aligned  */
  if(Addr == 0)
  {
    /* If NumByteToWrite < I2C_PageSize */
    if(NumOfPage == 0)
      I2C_PageWrite(pBuffer, WriteAddr, NumOfSingle);
    /* If NumByteToWrite > I2C_PageSize */
    else  
    {
      while(NumOfPage--)
      {
        I2C_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
        WriteAddr +=  I2C_PageSize;
        pBuffer += I2C_PageSize;
      }

      if(NumOfSingle!=0)
        I2C_PageWrite(pBuffer, WriteAddr, NumOfSingle);
    }
  }
  /* If WriteAddr is not I2C_PageSize aligned  */
  else
  {
    /* If NumByteToWrite < I2C_PageSize */
    if(NumOfPage== 0)
      I2C_PageWrite(pBuffer, WriteAddr, NumOfSingle);
    /* If NumByteToWrite > I2C_PageSize */
    else
    {
      NumByteToWrite -= count;
      NumOfPage =  NumByteToWrite / I2C_PageSize;
      NumOfSingle = NumByteToWrite % I2C_PageSize;       
      
      if(count != 0)
      {  
        I2C_PageWrite(pBuffer, WriteAddr, count);
        WriteAddr += count;
        pBuffer += count;
      }
      
      while(NumOfPage--)
      {
        I2C_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
        WriteAddr +=  I2C_PageSize;
        pBuffer += I2C_PageSize;  
      }
      if(NumOfSingle != 0)
      {
        I2C_PageWrite(pBuffer, WriteAddr, NumOfSingle);
      
      }
    }
  }  
}


void Delay1602(uint t)
{
     uint k;
     for(k=0;k<t;k++);    //?¨®¨o¡à
}


void LCD1602_busy(void)
{
     TRISD7=1;            //??RD7?¨2¨|¨¨???a¨o?¨¨??¨2¡ê??a?¨¢¡á?¡á?¡à?
     RS=0;                //RS=0?¡éRW=1?¡éE=1¨o¡à¡ê??|D?o?¨o?3?|ì?DB7¡ê?¨®¨|RD7?¨¢¨¨?
     RW=1;                //RS=0?¡éRW=1?¡éE=1¨o¡à¡ê??|D?o?¨o?3?|ì?DB7¡ê?¨®¨|RD7?¨¢¨¨?
     E=1;                 //RS=0?¡éRW=1?¡éE=1¨o¡à¡ê??|D?o?¨o?3?|ì?DB7¡ê?¨®¨|RD7?¨¢¨¨?
     while(RD7==1);       //¨®¨|RD7?¨¢¨¨?1¡ê?¡à¨a¨o?1602¨°o?¡ì?|¡ê?D¨¨¨°a|쨨¡äy
     E=0;                 //?¨¢¨a¨o¨°?o¨®¡ê????¡äE|ì?|ì???
     TRISD7=0;            //??RD7?¨2¨|¨¨???a¨o?3??¨2
}


void LCD1602_Write_com(uchar combuf)
{
     RS=0;                //??????¨¢???¡ä??¡Â
     RW=0;                //????D¡ä¡á¡ä¨¬?
     PORTD=combuf;        //???¨1¨¢?¡á?¨a¡§1yRD?¨2?¨a?¨¢DB
     E=1;                 //E??|ì??????¨1¨¢?¡á?D¡ä¨¨?1602¨°o?¡ì
     asm("NOP");          //¨¬¨a?¨®¨°?????2¨′¡á¡Â¡ê?¨o1??|ì????¨¢¨|¨′??3?1us
     E=0;                 //D¡ä¨a¨o¨°?o¨®¡ê????¡äE|ì?|ì???
}


void LCD1602_Write_com_busy(uchar combuf)
{
     LCD1602_busy();            //|ì¡Â¨®??|?¨¬2ao¡¥¨oy
     LCD1602_Write_com(combuf); //|ì¡Â¨®??|?¨¬2ao¡¥¨oy
}


void LCD1602_Write_data_busy(uchar databuf)
{
     LCD1602_busy();      //|ì¡Â¨®??|?¨¬2ao¡¥¨oy
     RS=1;                //????¨oy?Y??¡ä??¡Â
     RW=0;                //????D¡ä¡á¡ä¨¬?
     PORTD=databuf;        //???¨1¨¢?¡á?¨a¡§1yRD?¨2?¨a?¨¢DB
     E=1;                 //E??|ì??????¨1¨¢?¡á?D¡ä¨¨?1602¨°o?¡ì
     asm("NOP");          //¨¬¨a?¨®¨°?????2¨′¡á¡Â¡ê?¨o1??|ì????¨¢¨|¨′??3?1us
     E=0;                 //D¡ä¨a¨o¨°?o¨®¡ê????¡äE|ì?|ì???
}


void LCD1602_Write_address(uchar x,uchar y)
{
     x&=0x0f;             //¨¢D|ì??¡¤?T???¨20-15??
     y&=0x01;             //DD|ì??¡¤?T???¨20-1??
     if(y==0)             //¨¨?1?¨o?|ì¨2¨°?DD
         LCD1602_Write_com_busy(x|0x80);        //??¨¢D|ì??¡¤D¡ä¨¨?
     else                 //¨¨?1?¨o?|ì¨2?tDD
         LCD1602_Write_com_busy((x+0x40)|0x80); //??¨¢D|ì??¡¤D¡ä¨¨?
}


void LCD1602_init(void)
{
     Delay1602(1500);          //|ì¡Â¨®??¨®¨o¡ào¡¥¨oy
     LCD1602_Write_com(0x38);  //8??¨oy?Y¡á¨1??¡ê?¨¢?DD??¨o??¡ê¨o?¡ê?5*7|ì??¨®??¨o?
     Delay1602(500);           //|ì¡Â¨®??¨®¨o¡ào¡¥¨oy
     LCD1602_Write_com(0x38);  //8??¨oy?Y¡á¨1??¡ê?¨¢?DD??¨o??¡ê¨o?¡ê?5*7|ì??¨®??¨o?
     Delay1602(500);           //|ì¡Â¨®??¨®¨o¡ào¡¥¨oy
     LCD1602_Write_com(0x38);  //8??¨oy?Y¡á¨1??¡ê?¨¢?DD??¨o??¡ê¨o?¡ê?5*7|ì??¨®??¨o?
     LCD1602_Write_com_busy(0x38);  //8??¨oy?Y¡á¨1??¡ê?¨¢?DD??¨o??¡ê¨o?¡ê?5*7|ì??¨®??¨o?
     LCD1602_Write_com_busy(0x08);  //??¨o?1|?¨11?¡ê??T1a¡à¨o
     LCD1602_Write_com_busy(0x01);  //???¨¢
     LCD1602_Write_com_busy(0x06);  //D¡ä¨¨?D?|ì?¨oy?Yo¨®¡ê?1a¡à¨o¨®¨°¨°?¡ê???¨o??¨¢2?¨°??¡¥
     LCD1602_Write_com_busy(0x0C);  //??¨o?1|?¨1?a¡ê??T1a¡à¨o
}


void LCD1602_Disp(uchar x,uchar y,uchar buf)
{
     LCD1602_Write_address(x,y);    //?¨¨??|ì??¡¤D??¡éD¡ä¨¨?
     LCD1602_Write_data_busy(buf);  //?¨′D¡ä¨¨?¨°a??¨o?|ì?¨oy?Y
}


void main(void)            //?¡Âo¡¥¨oy,|죤???¨2?a?¨2o¨®?¨a¨o?¡ä¨®?a??o¡¥¨oy?a¨o???DD
{

    TRISB=0B11000111;      //3?¨o??¡¥RB7-RB0|ì?¨o?¨¨?¨o?3?¡¤??¨°
    TRISC=0B11111111;      //3?¨o??¡¥RC7-RC0|ì?¨o?¨¨?¨o?3?¡¤??¨°
    TRISD=0B00000000;      //3?¨o??¡¥RD7-RD0|ì?¨o?¨¨?¨o?3?¡¤??¨°
    PORTB=0B00000000;      //3?¨o??¡¥RB7-RB0|ì?¨oy?|ì
    PORTC=0B00000000;      //3?¨o??¡¥RC7-RC0|ì?¨oy?|ì
    PORTD=0B00000000;      //3?¨o??¡¥RD7-RD0|ì?¨oy?|ì

    I2C_Initialize();
    LCD1602_init();        //|ì¡Â¨®?1602¨°o?¡ì3?¨o??¡¥o¡¥¨oy
    //***due to count the reboot times, no need to use the Pagewrite;
    //if possible you could use the 16-bits to show the times,you need to uncomment
    //below 8 rows
   
   // boot_times1=Read_AT24C08(0x00); //¡ä¨®AT24C08?D|ì??¡¤0X18?¨¢¨¨?¨oy?Y
   // boot_times2=Read_AT24C08(0x01); //¡ä¨®AT24C08?D|ì??¡¤0X18?¨¢¨¨?¨oy?Y
   // Databuf=boot_times1*256+boot_times2;
   // Databuf++;                   //?¨¢3?¨oy?Y+1
   // boot_times1=Databuf/256;
   // boot_times2=Databuf%256;
   // Write_AT24C08(0x00,boot_times1);  //??+1o¨®|ì?¨oy?Y¡à¡ê¡ä?|ì?0X18?D
   // Write_AT24C08(0x01,boot_times2);  //??+1o¨®|ì?¨oy?Y¡à¡ê¡ä?|ì?0X18?D

    Databuf=Read_AT24C08(0x00); //¡ä¨®AT24C08?D|ì??¡¤0X18?¨¢¨¨?¨oy?Y
    Databuf++;                   //?¨¢3?¨oy?Y+1
    Write_AT24C08(0x00,Databuf);  //??+1o¨®|ì?¨oy?Y¡à¡ê¡ä?|ì?0X18?D

    LCD1602_Disp(0,0,'M');
    LCD1602_Disp(1,0,'Y');

    LCD1602_Disp(3,0,'M');
    LCD1602_Disp(4,0,'C');
    LCD1602_Disp(5,0,'U');

    LCD1602_Disp(0,1,'B');
    LCD1602_Disp(1,1,'O');
    LCD1602_Disp(2,1,'O');
    LCD1602_Disp(3,1,'T');
   
    LCD1602_Disp(5,1,'T');
    LCD1602_Disp(6,1,'I');
    LCD1602_Disp(7,1,'M');
    LCD1602_Disp(8,1,'E');
    LCD1602_Disp(9,1,'S');
    LCD1602_Disp(10,1,':');
  
    LCD1602_Disp(12,1,Databuf/100+0x30);     //??¨o?¡ã¨′??
    LCD1602_Disp(13,1,(Databuf%100)/10+0x30); //??¨o?¨o???
    LCD1602_Disp(14,1,Databuf%10+0x30);      //??¨o?????
    while(1);
}
回复

使用道具 举报

ID:72073 发表于 2015-1-20 14:45 | 显示全部楼层
版主真厉害!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表