Pages: [1]   Go Down
Author Topic: Nokia LCD shield & Arduino Mega via software S  (Read 902 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 92
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi all,

I recently got one of those nifty color LCD screen shield from nuelectronics, and was disappointed to find out it didn't work out of the box because the SPI pins on the Arduino Mega are at a different location. I found some hardware rewiring hacks but I felt a pure software fix would be more elegant.

So I fixed the library so that it makes use of software SPI, using pins 10, 11, 12 and 13 for SS, MOSI, MISO and SCK respectively. I'm pleased to say it works like a charm.

Basically you'll need to go into PCF8833.h and redefine the pins so that it reads:

Code:
#define LCD_CS(x)           PORTB = (x)? (PORTB|(1<<PB4)) : (PORTB&~(1<<PB4))
#define LCD_CLK(x)          PORTB = (x)? (PORTB|(1<<PB7)) : (PORTB&~(1<<PB7))
#define LCD_DATA(x)         PORTB = (x)? (PORTB|(1<<PB5)) : (PORTB&~(1<<PB5))
#define LCD_RESET(x)        PORTH = (x)? (PORTH|(1<<PH6)) : (PORTH&~(1<<PH6))
#define LCD_BACKLIGHT(x)    PORTH = (x)? (PORTH|(1<<PH5)) : (PORTH&~(1<<PH5))

Then in PCF8833.c change the SendColor and SendLCD functions to read

Code:

void SendLcd_color(unsigned char color)
{
      unsigned char i;

      LCD_DATA(LCDData); // set up first bit as command or data

      LCD_CLK(0); // Pull Clock LOW
      LCD_CLK(1); // Pul Clock HIGH

      // clock over the byte
      for (i=0; i<8; i++)
      {
            LCD_DATA(color & 0x80);
            color <<= 1;

            LCD_CLK(0); // Pull Clock LOW
            LCD_CLK(1); // Pul Clock HIGH
      }
}

void SendLcd(unsigned char type, unsigned char dat)
{
      unsigned char i;

      LCD_DATA(type); // set up first bit as command or data
      LCD_CS(0); // Enable device CS

      LCD_CLK(0); // Pull Clock LOW
      LCD_CLK(1); // Pul Clock HIGH

      // clock over the byte
      for (i=0; i<8; i++)
      {
            LCD_DATA(dat & 0x80);
            dat <<= 1;

            LCD_CLK(0); // Pull Clock LOW
            LCD_CLK(1); // Pul Clock HIGH
      }

      LCD_CS(1);
}

This was a quick hack and it's late so I may have messed up somewhere, but I think this should do it.

Cheers,

- Niels

« Last Edit: September 24, 2009, 05:39:11 pm by niels.brouwers » Logged

The Big Smoke
Offline Offline
Sr. Member
****
Karma: 0
Posts: 260
Hacking and Slashing
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Well done, I wish NuElectronics would take this onboard. They're good on the hardware side but piss poor on the software side.

I may try this for the black+white version
Logged

Pages: [1]   Go Up
Jump to: