Well, I didn't get anywhere with the 4 bit library, and it was getting annoying recompiling the library for a bunch of trial and error, so I tried this:
http://www.arduino.cc/cgi-bin/yabb2/...m=1160586800/0
I didn't get results at first and don't recall everything that was involved (predefined timings was one of the gotchas). But here are my current pin assignments and the mpguino display code. It does a good job of highlighting the sequence of events but the delays do need to be redone as status checks and pushed back into the lcd library. Note, with this code I had to hit the reset button after downloading the script or powering up sometimes.
Code:
LCD arduino
1 ground
2 5v
3 digital 6
4 digital 4
5 digital 0
6 digital 5
7 not connected
8 not connected
9 not connected
10 not connected
11 digital 7
12 digital 8
13 digital 12
14 digital 13
15 5v
16 ground
Code:
int DI = 4; // register select RS
int RW = 0;
int db4=7; int db5=8; int db6=12; int db7=13;
int contrast=6;
int Enable = 5;
void tickleEnable()
{
// send a pulse to enable
digitalWrite(Enable,HIGH);
delayMicroseconds(1); // pause 1 ms according to datasheet
digitalWrite(Enable,LOW);
delayMicroseconds(1); // pause 1 ms according to datasheet
}
void cmdWriteSet()
{
digitalWrite(Enable,LOW);
delayMicroseconds(1); // pause 1 ms according to datasheet
digitalWrite(DI,0);
digitalWrite(RW,0);
}
void LcdCommandWrite(int value)
{
int i = 0;
digitalWrite(db7, value & 128);
value <<= 1;
digitalWrite(db6, value & 128);
value <<= 1;
digitalWrite(db5, value & 128);
value <<= 1;
digitalWrite(db4, value & 128);
value <<= 1;
cmdWriteSet();
tickleEnable();
digitalWrite(db7, value & 128);
value <<= 1;
digitalWrite(db6, value & 128);
value <<= 1;
digitalWrite(db5, value & 128);
value <<= 1;
digitalWrite(db4, value & 128);
value <<= 1;
cmdWriteSet();
tickleEnable();
}
void LcdDataWrite(int value)
{
int i = 0;
digitalWrite(DI, HIGH);
digitalWrite(RW, LOW);
digitalWrite(db7, value & 128);
value <<= 1;
digitalWrite(db6, value & 128);
value <<= 1;
digitalWrite(db5, value & 128);
value <<= 1;
digitalWrite(db4, value & 128);
value <<= 1;
tickleEnable();
digitalWrite(db7, value & 128);
value <<= 1;
digitalWrite(db6, value & 128);
value <<= 1;
digitalWrite(db5, value & 128);
value <<= 1;
digitalWrite(db4, value & 128);
value <<= 1;
tickleEnable();
delay(5);
}
void setup (void)
{
pinMode(Enable,OUTPUT);
pinMode(RW,OUTPUT);
pinMode(DI,OUTPUT);
pinMode(db4,OUTPUT);
pinMode(db5,OUTPUT);
pinMode(db6,OUTPUT);
pinMode(db7,OUTPUT);
delay(100);
LcdCommandWrite(0x2c); // function set:
delay(64); // 4-bit interface, 2 display lines, 5x7 font
// other interaces:
// 0x20 = 4 bit, 1 display line
LcdCommandWrite(0x06); // entry mode set:
// increment automatically, no display shift
delay(20);
LcdCommandWrite(0x0c); // display control:
// turn display on, cursor on, no blinking
delay(20);
LcdCommandWrite(0x01); // clear display, set cursor position to zero
delay(100);
LcdCommandWrite(0x80); // set dram to zero (necessary?
delay(20);
analogWrite(contrast,75);
delay(20);
}
int i='0';
void loop (void)
{
delay(500); // stop the program for some time
LcdCommandWrite(0x01); // set cursor position to zero
delay(20);
firstDisplay();
boolean asc=true;
while(true){
for(int x = 0; x < 256; x++){
analogWrite(contrast,x);
delay(8);
}
for(int x = 255; x >0; x--){
analogWrite(contrast,x);
delay(8);
}
};
}
void firstDisplay()
{
// LcdDataWrite(value);
LcdDataWrite('O');
LcdDataWrite('P');
LcdDataWrite('E');
LcdDataWrite('N');
LcdDataWrite('G');
LcdDataWrite('A');
LcdDataWrite('U');
LcdDataWrite('G');
LcdDataWrite('E');
LcdCommandWrite(0xC9); // C0 would be start of second line
delay(20);
LcdDataWrite('M');
LcdDataWrite('P');
LcdDataWrite('G');
LcdDataWrite('U');
LcdDataWrite('I');
LcdDataWrite('N');
LcdDataWrite('O');
}