Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

PIC18F4455 in MikroC and 3310 LCD: Not working (yet).

Status
Not open for further replies.

Vizier87

Active Member
Hi Guys,

As the title says, I'm trying to move higher by going through SPI protocols this time. And the item to be communicated to with is the ubiquitous 3310 LCD, where I looked for codes in various sites but they're just too difficult to understand for me.

I've also read about SPI protocols and the 3310's datasheet, PCD8544 and still I've not managed to link between these two. Reading the codes in the 'net messed my understanding too.

As for the connections the 8 pins of the LCD terminals, I'm very sure all is in order:
SCK : RB1
SDIN : RC7
D/C : RB0
SCE : RB2
RESET: RB3

According to the pinouts, the pins which are really important to be assigned to the right PIC pins is only connecting PIC's RB1 (also SCK) to SCK and RC7(also SDO) to SDIN, am I correct? Anyway here's a pinout diagram:
**broken link removed**


Also, I built a voltage divider out of three 100Ω resistors (I think sufficient current should branch out properly from the divider, since they're only 100Ω), and got a 3.29V output for the LCD supply. Supply is from my PC's USB PIC programmer.

Can anyone please provide a simple code to just display something to prove that my LCD is not damaged? It looks pristine, but I don't know if that is the case. I've tried a couple of codes, but I'm not sure if they should just display anything in my case, since there might be other configurations needed to be set. Like this one:

C:
void spisend(unsigned char);
void wrdata(unsigned char);
void wrcmd(unsigned char);
void pixelxy(unsigned char, unsigned char);
void cursorxy(unsigned char, unsigned char);
void clearram(void);
void initlcd(void);
void putchar(unsigned char);
void putstr (unsigned char*);

/* Modify it to fit your schematic */
#define SCK rb1_bit
#define DAT rc7_bit
#define DC rb0_bit
#define CE rb2_bit
#define RES rb3_bit

/* Lookup Table for Nokia LCD */
unsigned char const FontLookup [][5] =
{
    { 0x00, 0x00, 0x00, 0x00, 0x00 },  // sp
    { 0x00, 0x00, 0x2f, 0x00, 0x00 },   // !
    { 0x00, 0x07, 0x00, 0x07, 0x00 },   // "
    { 0x14, 0x7f, 0x14, 0x7f, 0x14 },   // #
    { 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   // $
    { 0xc4, 0xc8, 0x10, 0x26, 0x46 },   // %
    { 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, 0x00, 0x50, 0x30, 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 },   // [
    { 0x55, 0x2A, 0x55, 0x2A, 0x55 },   // 55
    { 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
};

/* Send single byte on SPI Bus (software) */
/* Input Arguments: x -> Byte to send     */

void spisend(unsigned char x)
{
        unsigned char i;
        for(i=8;i>0;i--){
                SCK = 0;
                if((x&0x80)){
                        DAT = 1;
                } else {
                        DAT = 0;
                }
                SCK = 1;
                x <<= 1;
        }
}

/* Write Data Byte to Nokia LCD              */
/* Input Arguments: x-> Data Byte to be sent */

void wrdata(unsigned char x)
{
        DC = 1;
        CE = 0;
        spisend(x);
        CE = 1;
}

/* Write Command Byte to Nokia LCD               */
/* Input Arguments: x -> Command Byte to be sent */
void wrcmd(unsigned char x)
{
        DC = 0;
        CE = 0;
        spisend(x);
        CE = 1;
}

/* Brings ram pointer to X,Y pixel position            */
/* Input Arguments: x-> X cordinate range from 0 to 83 */
/* Input Arguments: y-> Y cordinate range from 0 to 5  */
void pixelxy(unsigned char x, unsigned char y)
{
        wrcmd(0x40|(y&0x07));   // Y axis
        wrcmd(0x80|(x&0x7f));   // X axis
}

/* Clears the screen */
void clearram(void)
{
        int ddram;
        pixelxy(0,0);                                                                           // Cursor Home.
        for (ddram=504;ddram>0;ddram--) {wrdata(0x00);}         // 6*84 = 504 DDRAM addresses.
}

/* Nokia3310 LCD Initialization */
void initlcd(void)
{
        RES = 1;        // Set _RES HIGH.
        CE = 1;         // Disable Chip.
        RES = 0;                // Reset the LCD.
        delay_ms(240);  // Wait 100ms.
        RES = 1;                // Awake LCD from RESET state.

        wrcmd(0x21);            // Activate Chip and H=1.
        wrcmd(0xC2);            // Set LCD Voltage to about 7V.
        wrcmd(0x13);            // Adjust voltage bias.
        wrcmd(0x20);            // Horizontal addressing and H=0.
        wrcmd(0x09);            // Activate all segments.
        clearram();                     // Erase all pixel on the DDRAM.
        wrcmd(0x08);            // Blank the Display.
        wrcmd(0x0C);            // Display Normal.
        pixelxy(0,0);           // Cursor Home.
}

/* Bring cursor to Line and character specified                     */
/* Input Arguments: row    -> Line number range from 1 to 6         */
/* Input Arguments: Column -> character position range from 1 to 14 */
/* You can have maximum of 6 lines of text on LCD and each line
   containing 14 characters. Address is auto increment              */

void cursorxy(unsigned char row, unsigned char col)
{
        if((row>6) || (row<1) || (col<1) || (col>14))
                return;
        pixelxy(((col-1)*6),(row-1));
}

/* Writes single character on LCD                   */
/* Input Arguments: ch -> Character to be displayed */
void putchar(unsigned char ch)
{
        unsigned char i, temp;
        if ( (ch < 0x20) || (ch > 0x7b) ){
                ch = 92;
        }
        for(i=0;i<5;i++){
                temp = FontLookup[ch - 32][i] << 1;
                wrdata(temp);
        }
        wrdata(0x00);
}

/* Writes character string on LCD                            */
/* Input Arguments: str -> Pointer to string to be displayed */
void putstr (unsigned char *str)
{
        while(*str)
                putchar(*str++);
}


/*
  Main code by Ronald Arthur
  Accra - Ghana
  (c) 2010
*/
void main()
{
  cmcon = 0x07;  //convert all comparators to digital pins
  trisa = 0xff;  //set porta as input
  trisb = 0x00;  //set portb as output
        initlcd();
  while(1)
  {
  while(porta.f0==1)
  {
  cursorxy(1,1);
  putstr("FUSE 1 IS OK");
  }
  clearram();
  while(porta.f0==0)
  {
  cursorxy(1,1);
  putstr("FUSE 1 ALERT");
  clearram();
  delay_ms(1000);
  cursorxy(1,1);
  putstr("FUSE 1 ALERT");
  delay_ms(1000);
  }
  clearram();
  }
}

It's a long question and I sure appreciate the time spent on this.
Thanks.
Vizier87
 
Last edited:
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top