diff --git a/driver/st7565.c b/driver/st7565.c index d3680fb..dc6b125 100644 --- a/driver/st7565.c +++ b/driver/st7565.c @@ -46,6 +46,53 @@ void ST7565_DrawLine(const unsigned int Column, const unsigned int Line, const u SPI_ToggleMasterMode(&SPI0->CR, true); } + +// Optimization +// +// ST7565_BlitScreen(0) = ST7565_BlitStatusLine() +// ST7565_BlitScreen(1..7) = ST7565_BlitLine() +// ST7565_BlitScreen(8) = ST7565_BlitFullScreen() +// + +static void ST7565_BlitScreen(uint8_t line) +{ + SPI_ToggleMasterMode(&SPI0->CR, false); + ST7565_WriteByte(0x40); + + if(line == 0) + { + DrawLine(0, 0, gStatusLine, LCD_WIDTH); + } + else if(line <= FRAME_LINES) + { + DrawLine(0, line, gFrameBuffer[line - 1], LCD_WIDTH); + } + else + { + for (line = 1; line <= FRAME_LINES; line++) { + DrawLine(0, line, gFrameBuffer[line - 1], LCD_WIDTH); + } + } + + SPI_ToggleMasterMode(&SPI0->CR, true); +} + +void ST7565_BlitFullScreen(void) +{ + ST7565_BlitScreen(8); +} + +void ST7565_BlitLine(unsigned line) +{ + ST7565_BlitScreen(line + 1); +} + +void ST7565_BlitStatusLine(void) +{ + ST7565_BlitScreen(0); +} + +/* void ST7565_BlitFullScreen(void) { SPI_ToggleMasterMode(&SPI0->CR, false); @@ -71,6 +118,9 @@ void ST7565_BlitStatusLine(void) DrawLine(0, 0, gStatusLine, LCD_WIDTH); SPI_ToggleMasterMode(&SPI0->CR, true); } +*/ + + void ST7565_FillScreen(uint8_t value) { diff --git a/ui/status.c b/ui/status.c index 10f6d4f..6e1b8aa 100644 --- a/ui/status.c +++ b/ui/status.c @@ -181,7 +181,7 @@ void UI_DisplayStatus() for (uint8_t i = 71; i < 79; i++) { - gFrameBuffer[-1][i] ^= 0x7F; + gStatusLine[i] ^= 0x7F; } x1 = x; } diff --git a/ui/welcome.c b/ui/welcome.c index 6b1357f..3b98583 100644 --- a/ui/welcome.c +++ b/ui/welcome.c @@ -121,7 +121,7 @@ void UI_DisplayWelcome(void) UI_PrintStringSmallNormal(Version, 0, 127, 6); #endif - ST7565_BlitStatusLine(); // blank status line + //ST7565_BlitStatusLine(); // blank status line : I think it's useless ST7565_BlitFullScreen(); } }