Change LCD Initialization for Winstar LCD to 8bits

Change LCD Initialization for Winstar LCD to 8bits, thanks Garry and
Superdavex
Be Noted : a RESTART is MANDATORY after flashing
This should fix white screen and scramble screen at start
pull/21/merge
Luc 2015-01-13 09:24:20 +08:00
rodzic f6dfc8aa8a
commit 195076d162
2 zmienionych plików z 119 dodań i 55 usunięć

Wyświetl plik

@ -288,8 +288,12 @@ const long baudrates[] PROGMEM = {9600,14400,19200,28800,38400,56000,57600,76800
#define LCD_4BIT LCD_CONFIGURATION | 0x00 /**< 4 bits interface */
#define LCD_2LINE LCD_CONFIGURATION | 0x08 /**< 2 line display */
#define LCD_1LINE LCD_CONFIGURATION | 0x00 /**< 1 line display */
//for HD44780 and clones
#define LCD_5X10 LCD_CONFIGURATION | 0x04 /**< 5 X 10 dots */
#define LCD_5X7 LCD_CONFIGURATION | 0x00 /**< 5 X 7 dots */
//for Winstar 1604A
#define LCD_5X11 LCD_CONFIGURATION | 0x04 /**< 5 X 18 dots */
#define LCD_5X8 LCD_CONFIGURATION | 0x00 /**< 5 X 8 dots */
#define LCD_SETCGRAMADDR 0x40
@ -412,6 +416,10 @@ void initializeLCD()
#endif
#if UI_DISPLAY_TYPE == DISPLAY_4BIT || UI_DISPLAY_TYPE == DISPLAY_8BIT
#if UI_DISPLAY_TYPE == DISPLAY_4BIT
#define BIT_INTERFACE LCD_4BIT
void lcdWriteNibble(uint8_t value)
{
WRITE(UI_DISPLAY_D4_PIN,value & 1);
@ -419,10 +427,9 @@ void lcdWriteNibble(uint8_t value)
WRITE(UI_DISPLAY_D6_PIN,value & 4);
WRITE(UI_DISPLAY_D7_PIN,value & 8);
WRITE(UI_DISPLAY_ENABLE_PIN, HIGH);// enable pulse must be >450ns
DELAY1MICROSECOND;
HAL::delayMicroseconds(5);
WRITE(UI_DISPLAY_ENABLE_PIN, LOW);
DELAY1MICROSECOND;
HAL::delayMicroseconds(15); //tc must be >1200ns
}
void lcdWriteByte(uint8_t c,uint8_t rs)
@ -443,13 +450,13 @@ void lcdWriteByte(uint8_t c,uint8_t rs)
DELAY1MICROSECOND;
busy = READ(UI_DISPLAY_D7_PIN);
WRITE(UI_DISPLAY_ENABLE_PIN, LOW);
DELAY1MICROSECOND;
HAL::delayMicroseconds(5);
WRITE(UI_DISPLAY_ENABLE_PIN, HIGH);
DELAY1MICROSECOND;
HAL::delayMicroseconds(5);
WRITE(UI_DISPLAY_ENABLE_PIN, LOW);
DELAY1MICROSECOND;
HAL::delayMicroseconds(5);
}
while (busy);
@ -460,34 +467,96 @@ void lcdWriteByte(uint8_t c,uint8_t rs)
WRITE(UI_DISPLAY_RW_PIN, LOW);
#endif
WRITE(UI_DISPLAY_RS_PIN, rs);
HAL::delayMicroseconds(5);
WRITE(UI_DISPLAY_D4_PIN, c & 0x10);
WRITE(UI_DISPLAY_D5_PIN, c & 0x20);
WRITE(UI_DISPLAY_D6_PIN, c & 0x40);
WRITE(UI_DISPLAY_D7_PIN, c & 0x80);
WRITE(UI_DISPLAY_ENABLE_PIN, HIGH); // enable pulse must be >450ns
DELAY1MICROSECOND;
HAL::delayMicroseconds(5);
WRITE(UI_DISPLAY_ENABLE_PIN, LOW);
DELAY1MICROSECOND;
HAL::delayMicroseconds(5);//tc must be >1200ns
WRITE(UI_DISPLAY_D4_PIN, c & 0x01);
WRITE(UI_DISPLAY_D5_PIN, c & 0x02);
WRITE(UI_DISPLAY_D6_PIN, c & 0x04);
WRITE(UI_DISPLAY_D7_PIN, c & 0x08);
WRITE(UI_DISPLAY_ENABLE_PIN, HIGH); // enable pulse must be >450ns
DELAY1MICROSECOND;
HAL::delayMicroseconds(5);
WRITE(UI_DISPLAY_ENABLE_PIN, LOW);
DELAY1MICROSECOND;
HAL::delayMicroseconds(5);//tc must be >1200ns
}
#else //DISPLAY_8BIT
#define BIT_INTERFACE LCD_8BIT
void lcdWriteByte(uint8_t c,uint8_t rs)
{
#if UI_DISPLAY_RW_PIN<0
HAL::delayMicroseconds(UI_DELAYPERCHAR);
#else
SET_INPUT(UI_DISPLAY_D4_PIN);
SET_INPUT(UI_DISPLAY_D5_PIN);
SET_INPUT(UI_DISPLAY_D6_PIN);
SET_INPUT(UI_DISPLAY_D7_PIN);
WRITE(UI_DISPLAY_RW_PIN, HIGH);
WRITE(UI_DISPLAY_RS_PIN, LOW);
uint8_t busy;
do
{
WRITE(UI_DISPLAY_ENABLE_PIN, HIGH);
DELAY1MICROSECOND;
busy = READ(UI_DISPLAY_D7_PIN);
WRITE(UI_DISPLAY_ENABLE_PIN, LOW);
HAL::delayMicroseconds(5);
WRITE(UI_DISPLAY_ENABLE_PIN, HIGH);
HAL::delayMicroseconds(5);
WRITE(UI_DISPLAY_ENABLE_PIN, LOW);
HAL::delayMicroseconds(5);
}
while (busy);
SET_OUTPUT(UI_DISPLAY_D4_PIN);
SET_OUTPUT(UI_DISPLAY_D5_PIN);
SET_OUTPUT(UI_DISPLAY_D6_PIN);
SET_OUTPUT(UI_DISPLAY_D7_PIN);
WRITE(UI_DISPLAY_RW_PIN, LOW);
#endif
WRITE(UI_DISPLAY_RS_PIN, rs);
HAL::delayMicroseconds(5);
WRITE(UI_DISPLAY_D0_PIN, c & 0x01);
WRITE(UI_DISPLAY_D1_PIN, c & 0x02);
WRITE(UI_DISPLAY_D2_PIN, c & 0x04);
WRITE(UI_DISPLAY_D3_PIN, c & 0x08);
WRITE(UI_DISPLAY_D4_PIN, c & 0x10);
WRITE(UI_DISPLAY_D5_PIN, c & 0x20);
WRITE(UI_DISPLAY_D6_PIN, c & 0x40);
WRITE(UI_DISPLAY_D7_PIN, c & 0x80);
WRITE(UI_DISPLAY_ENABLE_PIN, HIGH); // enable pulse must be >450ns
HAL::delayMicroseconds(5);
WRITE(UI_DISPLAY_ENABLE_PIN, LOW); //tc must be >1200ns
HAL::delayMicroseconds(5);
}
#endif
void initializeLCD()
{
playsound(5000,240);
playsound(3000,240);
// SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!
// according to datasheet, we need at least 40ms after power rises above 2.7V
playsound(3000,120);
#if UI_DISPLAY_TYPE == DISPLAY_8BIT
playsound(5000,120);
SET_OUTPUT(UI_DISPLAY_D0_PIN);
SET_OUTPUT(UI_DISPLAY_D1_PIN);
SET_OUTPUT(UI_DISPLAY_D2_PIN);
SET_OUTPUT(UI_DISPLAY_D3_PIN);
#endif
// SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!
// according to HD44780 datasheet, we need at least 40ms after power rises above 2.7V
// before sending commands. Arduino can turn on way before 4.5V.
// is this delay long enough for all cases??
HAL::delayMilliseconds(500);
@ -496,56 +565,51 @@ void initializeLCD()
SET_OUTPUT(UI_DISPLAY_D6_PIN);
SET_OUTPUT(UI_DISPLAY_D7_PIN);
SET_OUTPUT(UI_DISPLAY_RS_PIN);
//init pins to a known state
WRITE(UI_DISPLAY_D0_PIN, HIGH);
WRITE(UI_DISPLAY_D1_PIN, HIGH);
WRITE(UI_DISPLAY_D2_PIN, HIGH);
WRITE(UI_DISPLAY_D3_PIN, HIGH);
WRITE(UI_DISPLAY_D4_PIN, HIGH);
WRITE(UI_DISPLAY_D5_PIN, HIGH);
WRITE(UI_DISPLAY_D6_PIN, HIGH);
WRITE(UI_DISPLAY_D7_PIN, HIGH);
#if UI_DISPLAY_RW_PIN>-1
SET_OUTPUT(UI_DISPLAY_RW_PIN);
#endif
SET_OUTPUT(UI_DISPLAY_ENABLE_PIN);
// Now we pull both RS and R/W low to begin commands
WRITE(UI_DISPLAY_RS_PIN, LOW);
HAL::delayMicroseconds(5);
//move set output late to be sure pin is not affected before
SET_OUTPUT(UI_DISPLAY_ENABLE_PIN);
HAL::delayMicroseconds(5);
WRITE(UI_DISPLAY_ENABLE_PIN, LOW);
//put the LCD into 4 bit mode
// this is according to the hitachi HD44780 datasheet
// figure 24, pg 46
// we start in 8bit mode, try to set 4 bit mode
// at this point we are in 8 bit mode but of course in this
// interface 4 pins are dangling unconnected and the values
// on them don't matter for these instructions.
WRITE(UI_DISPLAY_RS_PIN, LOW);
HAL::delayMicroseconds(10);
lcdWriteNibble(0x03);
HAL::delayMicroseconds(5500); // I have one LCD for which 4500 here was not long enough.
// second try
lcdWriteNibble(0x03);
HAL::delayMicroseconds(150); // wait
// third go!
lcdWriteNibble(0x03);
HAL::delayMicroseconds(150);
// finally, set to 4-bit interface
lcdWriteNibble(0x02);
HAL::delayMilliseconds(10); // Just to be safe
//initialization sequence for 4bits/8bits of Winstar 1604A Screen
//16 rows, 4 lines
#if UI_DISPLAY_TYPE == DISPLAY_4BIT
lcdWriteNibble(0x03);//Init Function Set for 4bits
HAL::delayMicroseconds(150); //more than 39micro seconds
#endif
lcdCommand( BIT_INTERFACE | LCD_2LINE | LCD_5X11); //LCD Configuration: Bits, Lines and Font
HAL::delayMicroseconds(150); //more than 39micro seconds
lcdCommand(BIT_INTERFACE | LCD_2LINE | LCD_5X8);//LCD Configuration: Bits, Lines and Font
HAL::delayMicroseconds(150); //more than 39micro seconds
lcdCommand( LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKINGOFF); //Display Control : Display on/off, Cursor, Blinking Cursor
HAL::delayMicroseconds(150);
lcdCommand(LCD_DISPLAYOFF);
HAL::delayMicroseconds(120);
lcdCommand(LCD_CLEAR); //Clear Screen
HAL::delayMilliseconds(8); // clear is slow operation more than 1.53ms
lcdCommand(LCD_CLEAR); //- Clear Screen
HAL::delayMilliseconds(10); // clear is slow operation
// finally, set # lines, font size, etc.
lcdCommand(LCD_4BIT | LCD_2LINE | LCD_5X7);
HAL::delayMicroseconds(120);
lcdCommand(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKINGOFF); //- Display on
lcdCommand(LCD_INCREASE | LCD_DISPLAYSHIFTOFF); //Entrymode: Sets cursor move direction (I/D); specifies to shift the display
HAL::delayMicroseconds(150);
lcdCommand(LCD_INCREASE | LCD_DISPLAYSHIFTOFF); //- Entrymode (Display Shift: off, Increment Address Counter)
HAL::delayMicroseconds(150);
lcdCommand(LCD_CLEAR); //- Clear Screen
HAL::delayMilliseconds(10); // clear is slow operation
HAL::delayMilliseconds(10);//no recommendation so just a feeling
uid.lastSwitch = uid.lastRefresh = HAL::timeInMilliseconds();
uid.createChar(1,character_back);
@ -2220,7 +2284,7 @@ void UIDisplay::refreshPage()
printRow(y,cache[y] + UI_COLS - scroll,&displayCache[y][off[y]],scroll);
}
}
#if DISPLAY_TYPE != 5
#if UI_DISPLAY_TYPE != 5
HAL::delayMilliseconds(transition<3 ? 200 : 70);
#endif
HAL::pingWatchdog();

Wyświetl plik

@ -105,7 +105,7 @@ What display type do you use?
If you have Sanguino and want to use the library, you need to have Arduino 023 or older. (13.04.2012)
5 = U8G supported display
*/
#define UI_DISPLAY_TYPE 1
#define UI_DISPLAY_TYPE DISPLAY_8BIT
#if UI_DISPLAY_TYPE == DISPLAY_U8G // Special case for graphic displays