Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[PIC] How to Interface external EEPROM to PIC

Status
Not open for further replies.

kalinga

Newbie level 5
Joined
May 19, 2009
Messages
8
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,355
This LED Scrolling messages display code is introduced by supra_56 (link below) and for it I did some changes. It worked fine with proteus.

Code:
 //***********************rows **********************************
#define PIN_ST_CP      PORTC.F1   // RCLK ----> Pin 12 ST_CP
#define PIN_SH_CP      PORTC.F2  // SRCLK ---> Pin 11 SH_CP
#define PIN_SER_IN    PORTC.F5  // SER -----> Pin 14
//***********************columns of hc595**********************************
#define clock     PORTB.F0    //RCLK ----> Pin 11 ST_CP
#define latch     PORTB.F2   //RCLK ---> Pin 12 SH_CP
#define data      PORTB.F1  //SER -----> Pin 14

char s1[80];
long i;

const char  msg_default[80] = "No bees, no honey; no work, no money"
                              " | Try and fail, but never fail to try.";
const char ascii4[96][5] = {
    { 0x00, 0x00, 0x00, 0x00, 0x00 },   // sp
    { 0x00, 0x2f, 0x00, 0x00, 0x00 },   // !
    { 0x00, 0x07, 0x00, 0x07, 0x00 },   // "
    { 0x14, 0x7f, 0x14, 0x7f, 0x14 },   // #
    { 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   // $
    { 0x23, 0x13, 0x08, 0x64, 0x62 },   // %
    { 0x36, 0x49, 0x55, 0x22, 0x50 },   // &
    { 0x00, 0x05, 0x03, 0x00, 0x00 },   // '
    { 0x00, 0x1c, 0x22, 0x41, 0x00 },   // (
    { 0x00, 0x41, 0x22, 0x1c, 0x00 },   // )
    { 0x14, 0x08, 0x3E, 0x08, 0x14 },   // *
    { 0x08, 0x08, 0x3E, 0x08, 0x08 },   // +
    { 0x00, 0x50, 0x30, 0x00, 0x00 },   // ,
    { 0x10, 0x10, 0x10, 0x10, 0x10 },   // -
    { 0x00, 0x60, 0x60, 0x00, 0x00 },   // .
    { 0x20, 0x10, 0x08, 0x04, 0x02 },   // /
    { 0x3E, 0x51, 0x49, 0x45, 0x3E },   // 0
    { 0x00, 0x42, 0x7F, 0x40, 0x00 },   // 1
    { 0x42, 0x61, 0x51, 0x49, 0x46 },   // 2
    { 0x21, 0x41, 0x45, 0x4B, 0x31 },   // 3
    { 0x18, 0x14, 0x12, 0x7F, 0x10 },   // 4
    { 0x27, 0x45, 0x45, 0x45, 0x39 },   // 5
    { 0x3C, 0x4A, 0x49, 0x49, 0x30 },   // 6
    { 0x01, 0x71, 0x09, 0x05, 0x03 },   // 7
    { 0x36, 0x49, 0x49, 0x49, 0x36 },   // 8
    { 0x06, 0x49, 0x49, 0x29, 0x1E },   // 9
    { 0x00, 0x36, 0x36, 0x00, 0x00 },   // :
    { 0x00, 0x56, 0x36, 0x00, 0x00 },   // ;
    { 0x08, 0x14, 0x22, 0x41, 0x00 },   // <
    { 0x14, 0x14, 0x14, 0x14, 0x14 },   // =
    { 0x00, 0x41, 0x22, 0x14, 0x08 },   // >
    { 0x02, 0x01, 0x51, 0x09, 0x06 },   // ?
    { 0x32, 0x49, 0x59, 0x51, 0x3E },   // @
    { 0x7E, 0x11, 0x11, 0x11, 0x7E },   // A
    { 0x7F, 0x49, 0x49, 0x49, 0x36 },   // B
    { 0x3E, 0x41, 0x41, 0x41, 0x22 },   // C
    { 0x7F, 0x41, 0x41, 0x22, 0x1C },   // D
    { 0x7F, 0x49, 0x49, 0x49, 0x41 },   // E
    { 0x7F, 0x09, 0x09, 0x09, 0x01 },   // F
    { 0x3E, 0x41, 0x49, 0x49, 0x7A },   // G
    { 0x7F, 0x08, 0x08, 0x08, 0x7F },   // H
    { 0x00, 0x41, 0x7F, 0x41, 0x00 },   // I
    { 0x20, 0x40, 0x41, 0x3F, 0x01 },   // J
    { 0x7F, 0x08, 0x14, 0x22, 0x41 },   // K
    { 0x7F, 0x40, 0x40, 0x40, 0x40 },   // L
    { 0x7F, 0x02, 0x0C, 0x02, 0x7F },   // M
    { 0x7F, 0x04, 0x08, 0x10, 0x7F },   // N
    { 0x3E, 0x41, 0x41, 0x41, 0x3E },   // O
    { 0x7F, 0x09, 0x09, 0x09, 0x06 },   // P
    { 0x3E, 0x41, 0x51, 0x21, 0x5E },   // Q
    { 0x7F, 0x09, 0x19, 0x29, 0x46 },   // R
    { 0x46, 0x49, 0x49, 0x49, 0x31 },   // S
    { 0x01, 0x01, 0x7F, 0x01, 0x01 },   // T
    { 0x3F, 0x40, 0x40, 0x40, 0x3F },   // U
    { 0x1F, 0x20, 0x40, 0x20, 0x1F },   // V
    { 0x3F, 0x40, 0x38, 0x40, 0x3F },   // W
    { 0x63, 0x14, 0x08, 0x14, 0x63 },   // X
    { 0x07, 0x08, 0x70, 0x08, 0x07 },   // Y
    { 0x61, 0x51, 0x49, 0x45, 0x43 },   // Z
    { 0x00, 0x7F, 0x41, 0x41, 0x00 },   // [
    { 0x02, 0x04, 0x08, 0x10, 0x20 },   // back slash
    { 0x00, 0x41, 0x41, 0x7f, 0x00 },   // ]
    { 0x04, 0x02, 0x01, 0x02, 0x04 },   // ^
    { 0x40, 0x40, 0x40, 0x40, 0x40 },   // _
    { 0x00, 0x01, 0x02, 0x04, 0x00 },   // '
    { 0x20, 0x54, 0x54, 0x54, 0x78 },   // a
    { 0x7F, 0x48, 0x44, 0x44, 0x38 },   // b
    { 0x38, 0x44, 0x44, 0x44, 0x20 },   // c
    { 0x38, 0x44, 0x44, 0x48, 0x7F },   // d
    { 0x38, 0x54, 0x54, 0x54, 0x18 },   // e
    { 0x08, 0x7E, 0x09, 0x01, 0x02 },   // f
    { 0x0C, 0x52, 0x52, 0x52, 0x3E },   // g
    { 0x7F, 0x08, 0x04, 0x04, 0x78 },   // h
    { 0x00, 0x44, 0x7D, 0x40, 0x00 },   // i
    { 0x20, 0x40, 0x44, 0x3D, 0x00 },   // j
    { 0x7F, 0x10, 0x28, 0x44, 0x00 },   // k
    { 0x00, 0x41, 0x7F, 0x40, 0x00 },   // l
    { 0x7C, 0x04, 0x18, 0x04, 0x78 },   // m
    { 0x7C, 0x08, 0x04, 0x04, 0x78 },   // n
    { 0x38, 0x44, 0x44, 0x44, 0x38 },   // o
    { 0x7C, 0x14, 0x14, 0x14, 0x08 },   // p
    { 0x08, 0x14, 0x14, 0x18, 0x7C },   // q
    { 0x7C, 0x08, 0x04, 0x04, 0x08 },   // r
    { 0x48, 0x54, 0x54, 0x54, 0x20 },   // s
    { 0x04, 0x3F, 0x44, 0x40, 0x20 },   // t
    { 0x3C, 0x40, 0x40, 0x20, 0x7C },   // u
    { 0x1C, 0x20, 0x40, 0x20, 0x1C },   // v
    { 0x3C, 0x40, 0x30, 0x40, 0x3C },   // w
    { 0x44, 0x28, 0x10, 0x28, 0x44 },   // x
    { 0x0C, 0x50, 0x50, 0x50, 0x3C },   // y
    { 0x44, 0x64, 0x54, 0x4C, 0x44 },   // z
    { 0x00, 0x08, 0x36, 0x41, 0x00 },   // {
    { 0x00, 0x00, 0x7f, 0x00, 0x00 },   // |
    { 0x00, 0x41, 0x36, 0x08, 0x00 },   // }
    { 0x04, 0x02, 0x04, 0x08, 0x04 },   // ~
    { 0x00, 0x00, 0x36, 0x00, 0x00 },   // ¦
};

void HC595_Display(unsigned char send_data)
{
  unsigned char bit_mask;

  for (bit_mask=1; bit_mask ;bit_mask <<=1)
  {
      if((send_data & bit_mask))
        data=1;
        else
        data=0;
        clock=1;
        delay_us(20);
        clock=0;
  }

      latch=1;
      delay_us(20);
      latch=0;
}

void main(){
     int char_index;
     int col_index;
     int x = 0;
     int delaycount;
     unsigned int startposition;

     ANSEL=0x00;
     ANSELH=0x00;
     TRISB=0x00;
     TRISC=0x00;
     HC595_Display(0);
     PORTC=0x00;
  startposition = 0;

   for(i=0; i<40; i++)
    s1[i] = msg_default[i];

        for(i=0; i<sizeof(msg_default); i++)
       s1[i] = msg_default[i];
      delay_us(100);

   while (1)
   {
    delaycount=2; //-------> a control scanning speed here .
     while (delaycount)
     {
      col_index = startposition %6;
      char_index = startposition /6;
       if (char_index >= sizeof(s1))
       {
        startposition = 0;
        char_index = 0;
        col_index = 0;
      }
      x = s1[char_index];

// 74HC595
      PIN_SH_CP=0;
      PIN_ST_CP=0;
      PIN_SER_IN=0;
      PIN_SH_CP=1;
      delay_us(1000);
      PIN_SH_CP=0;
      PIN_SER_IN=1;

       for (i=0;i<40;i++) // 80 We use one column
       {
        PIN_ST_CP=1;
        delay_us(20);
        PIN_ST_CP=0;
        delay_us(20);
        PIN_SH_CP=1;
        delay_us(20);
        PIN_SH_CP=0;

        if (col_index == 5)
       {
          col_index = 0;
          char_index++;
          if (char_index >= sizeof(s1))
            char_index = 0;
          x = s1[char_index];
       }
        else
        {
          if ( x < 40)
           HC595_Display(0);
           else if( x < 128)
            HC595_Display(ascii4[x-32][col_index]);
            col_index++;
          }
            delay_us(1000);  //brightness
            HC595_Display(0);
      }
            delaycount--;
    }
            startposition++;
  }
 }

https://www.edaboard.com/showthread.php?t=199511

I prefer to add more messages to display, but theres not enough memory in the PIC16F877. So I want to interface a external EEPROM (like 24C64) with the PIC. As I'm a beginner for PIC programming, I don't understand how to change the source code to interface the EEPROM. Please can anyone help me with this?
 

I prefer to add more messages to display, but theres not enough memory in the PIC16F877

Have a look at PIC18F4520, it seems pin compatible with PIC16F877, but with more memory.
 

Have a look at PIC18F4520, it seems pin compatible with PIC16F877, but with more memory.

Thank you for your opinion. But many PIC numbers are difficult to find in my country and some of the PICs are very expensive here. 18F4520 is also a pic number like that. So I think use of external EEPROM is a much easy way, they are not expensive as well.
 

You can use even external flash memory. It works over SPI interface much faster (up to 80 MHz clock speed)
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top