Add LCD contrast control

i2cLcdOnContrast = 127 // (0..255)
UNTESTED sh1106 support
	LCDName = sh1106_128x64
This commit is contained in:
penfold42 2018-06-23 13:58:05 +10:00
parent f0e90cf385
commit 8f67aef459
3 changed files with 26 additions and 8 deletions

View file

@ -108,8 +108,7 @@ SSD1306::SSD1306(int BSCMaster, u8 address, int flip, int type)
SendCommand(SSD1306_ENABLE_CHARGE_PUMP); // Enable charge pump regulator SendCommand(SSD1306_ENABLE_CHARGE_PUMP); // Enable charge pump regulator
SendCommand(0x14); // external = 0x10 internal = 0x14 SendCommand(0x14); // external = 0x10 internal = 0x14
/* /* only for page mode addressing? so can be deleted
// only for page mode addressing
SendCommand(0x00); // Set Lower Column Start Address SendCommand(0x00); // Set Lower Column Start Address
SendCommand(0x10); // Set Higher Column Start Address SendCommand(0x10); // Set Higher Column Start Address
SendCommand(0xB0); // Set Page Start Address for Page Addressing Mode SendCommand(0xB0); // Set Page Start Address for Page Addressing Mode
@ -118,6 +117,9 @@ SSD1306::SSD1306(int BSCMaster, u8 address, int flip, int type)
SendCommand(SSD1306_CMD_SET_MEMORY_ADDRESSING_MODE); // Set Memory Addressing Mode SendCommand(SSD1306_CMD_SET_MEMORY_ADDRESSING_MODE); // Set Memory Addressing Mode
SendCommand(0x00); // 00 - Horizontal Addressing Mode SendCommand(0x00); // 00 - Horizontal Addressing Mode
Home();
/* replaced by Home
SendCommand(SSD1306_CMD_SET_COLUMN_ADDRESS); // 0x21 Set Column Address (only for horizontal or vertical mode) SendCommand(SSD1306_CMD_SET_COLUMN_ADDRESS); // 0x21 Set Column Address (only for horizontal or vertical mode)
SendCommand(0x00); // start 0 SendCommand(0x00); // start 0
SendCommand(0x7F); // end 127 SendCommand(0x7F); // end 127
@ -125,6 +127,7 @@ SSD1306::SSD1306(int BSCMaster, u8 address, int flip, int type)
SendCommand(SSD1306_CMD_SET_PAGE_ADDRESS); // 0x22 SendCommand(SSD1306_CMD_SET_PAGE_ADDRESS); // 0x22
SendCommand(0x00); // start 0 SendCommand(0x00); // start 0
SendCommand(0x07); // end 7 (so 8 vertical bytes == 64 row display) SendCommand(0x07); // end 7 (so 8 vertical bytes == 64 row display)
*/
SendCommand(SSD1306_CMD_DEACTIVATE_SCROLL); SendCommand(SSD1306_CMD_DEACTIVATE_SCROLL);
} }
@ -151,12 +154,7 @@ void SSD1306::SendData(u8 data)
void SSD1306::Home() void SSD1306::Home()
{ {
SendCommand(0x21); // column range MoveCursorByte(0, 0);
SendCommand(0x00); // set start to 0
SendCommand(0x7F); // set end to 0x7F
SendCommand(0x22); // row range
SendCommand(0x00); // set start to 0
SendCommand(0x07); // set end to 0x07
} }
void SSD1306::MoveCursorByte(u8 row, u8 col) void SSD1306::MoveCursorByte(u8 row, u8 col)
@ -164,12 +162,18 @@ void SSD1306::MoveCursorByte(u8 row, u8 col)
if (col > 127) { col = 127; } if (col > 127) { col = 127; }
if (row > 7) { row = 7; } if (row > 7) { row = 7; }
if (type == 1106)
SetDisplayWindow(col+2, 129, row, 7); // sh1106 has 132x64 ram, display is centreed
else
SetDisplayWindow(col+0, 127, row, 7);
/*
SendCommand(0x21); // set column SendCommand(0x21); // set column
SendCommand(col); // start = col SendCommand(col); // start = col
SendCommand(0x7F); // end = col max SendCommand(0x7F); // end = col max
SendCommand(0x22); // set row SendCommand(0x22); // set row
SendCommand(row); // start = row SendCommand(row); // start = row
SendCommand(0x07); // end = row max SendCommand(0x07); // end = row max
*/
} }
void SSD1306::MoveCursorCharacter(u8 row, u8 col) void SSD1306::MoveCursorCharacter(u8 row, u8 col)
@ -235,6 +239,17 @@ void SSD1306::SetVCOMDeselect(u8 value)
SendCommand( (value & 7) << 4 ); SendCommand( (value & 7) << 4 );
} }
void SSD1306::SetDisplayWindow(u8 x1, u8 x2, u8 y1, u8 y2)
{
SendCommand(SSD1306_CMD_SET_COLUMN_ADDRESS); // 0x21 Set Column Address (only for horizontal or vertical mode)
SendCommand(x1); // start 0
SendCommand(x2); // end 127
SendCommand(SSD1306_CMD_SET_PAGE_ADDRESS); // 0x22
SendCommand(y1); // start 0
SendCommand(y2); // end 7 (so 8 vertical bytes == 64 row display)
}
void SSD1306::Plottext(int x, int y, char* str, bool inverse) void SSD1306::Plottext(int x, int y, char* str, bool inverse)
{ {
int i; int i;

View file

@ -85,6 +85,7 @@ public:
void ClearScreen(); void ClearScreen();
void RefreshScreen(); void RefreshScreen();
void RefreshRows(u8 start, u8 amountOfRows); void RefreshRows(u8 start, u8 amountOfRows);
void SetDisplayWindow(u8 x1, u8 y1, u8 x2, u8 y2);
protected: protected:
void SendCommand(u8 command); void SendCommand(u8 command);

View file

@ -1028,6 +1028,8 @@ static void CheckOptions()
screen.PrintText(false, 0, y_pos+=16, tempBuffer, COLOUR_WHITE, COLOUR_BLACK); screen.PrintText(false, 0, y_pos+=16, tempBuffer, COLOUR_WHITE, COLOUR_BLACK);
snprintf(tempBuffer, tempBufferSize, "i2cLcdFlip = %d\r\n", options.I2CLcdFlip()); snprintf(tempBuffer, tempBufferSize, "i2cLcdFlip = %d\r\n", options.I2CLcdFlip());
screen.PrintText(false, 0, y_pos+=16, tempBuffer, COLOUR_WHITE, COLOUR_BLACK); screen.PrintText(false, 0, y_pos+=16, tempBuffer, COLOUR_WHITE, COLOUR_BLACK);
snprintf(tempBuffer, tempBufferSize, "LCDName = %s\r\n", options.GetLCDName());
screen.PrintText(false, 0, y_pos+=16, tempBuffer, COLOUR_WHITE, COLOUR_BLACK);
IEC_Bus::WaitMicroSeconds(5 * 1000000); IEC_Bus::WaitMicroSeconds(5 * 1000000);
} }