From 9a423e9a891381b41ca31f0dd04b39002f99c7e2 Mon Sep 17 00:00:00 2001 From: Bob-the-Kuhn Date: Tue, 13 Feb 2018 21:59:18 -0600 Subject: [PATCH] tested --- .../dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp | 67 ++++++++++--------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp index bdab2efa8c..bc1e8bc16e 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -24,6 +24,7 @@ // file u8g_dev_st7920_128x64_HAL.cpp for the HAL version. #include "../../inc/MarlinConfig.h" +#include #if ENABLED(U8GLIB_ST7920) @@ -40,8 +41,6 @@ #define LCD_PIXEL_WIDTH 128 #define LCD_PIXEL_HEIGHT 64 -#include - //set optimization so ARDUINO optimizes this file #pragma GCC optimize (3) @@ -84,29 +83,35 @@ #define ST7920_DELAY_3 CPU_ST7920_DELAY_3 #endif +#define ST7920_SND_BIT \ + WRITE(ST7920_CLK_PIN, LOW); ST7920_DELAY_1; \ + WRITE(ST7920_DAT_PIN, val & 0x80); ST7920_DELAY_2; \ + WRITE(ST7920_CLK_PIN, HIGH); ST7920_DELAY_3; \ + val <<= 1 + +static void ST7920_SWSPI_SND_8BIT(uint8_t val) { + ST7920_SND_BIT; // 1 + ST7920_SND_BIT; // 2 + ST7920_SND_BIT; // 3 + ST7920_SND_BIT; // 4 + ST7920_SND_BIT; // 5 + ST7920_SND_BIT; // 6 + ST7920_SND_BIT; // 7 + ST7920_SND_BIT; // 8 +} + #if defined(DOGM_SPI_DELAY_US) && DOGM_SPI_DELAY_US > 0 #define U8G_DELAY() delayMicroseconds(DOGM_SPI_DELAY_US) #else #define U8G_DELAY() u8g_10MicroDelay() #endif -static void ST7920_WRITE_BYTE(uint8_t val) { - for (uint8_t i = 0; i < 8; i++) { - WRITE(ST7920_DAT_PIN, val & 0x80); - WRITE(ST7920_CLK_PIN, HIGH); - WRITE(ST7920_CLK_PIN, LOW); - val <<= 1; - } -} - -#define ST7920_SET_CMD() { ST7920_WRITE_BYTE(0xF8); U8G_DELAY(); } -#define ST7920_SET_DAT() { ST7920_WRITE_BYTE(0xFA); U8G_DELAY(); } -#define ST7920_WRITE_NIBBLES(a) { ST7920_WRITE_BYTE((uint8_t)((a)&0xF0u)); ST7920_WRITE_BYTE((uint8_t)((a)<<4u)); U8G_DELAY(); } -#define ST7920_WRITE_NIBBLES_P(p,l) { for (uint8_t i = l + 1; --i;) { ST7920_WRITE_BYTE(*p&0xF0); ST7920_WRITE_BYTE(*p<<4); p++; } U8G_DELAY(); } - - #define ST7920_CS() { WRITE(ST7920_CS_PIN,1); U8G_DELAY(); } #define ST7920_NCS() { WRITE(ST7920_CS_PIN,0); } +#define ST7920_SET_CMD() { ST7920_SWSPI_SND_8BIT(0xF8); U8G_DELAY(); } +#define ST7920_SET_DAT() { ST7920_SWSPI_SND_8BIT(0xFA); U8G_DELAY(); } +#define ST7920_WRITE_BYTE(a) { ST7920_SWSPI_SND_8BIT((uint8_t)((a)&0xF0u)); ST7920_SWSPI_SND_8BIT((uint8_t)((a)<<4u)); U8G_DELAY(); } +#define ST7920_WRITE_BYTES(p,l) { for (uint8_t i = l + 1; --i;) { ST7920_SWSPI_SND_8BIT(*p&0xF0); ST7920_SWSPI_SND_8BIT(*p<<4); p++; } U8G_DELAY(); } uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { uint8_t i, y; @@ -114,26 +119,24 @@ uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo case U8G_DEV_MSG_INIT: { OUT_WRITE(ST7920_CS_PIN, LOW); OUT_WRITE(ST7920_DAT_PIN, LOW); - OUT_WRITE(ST7920_CLK_PIN, LOW); + OUT_WRITE(ST7920_CLK_PIN, HIGH); ST7920_CS(); u8g_Delay(120); //initial delay for boot up ST7920_SET_CMD(); - ST7920_WRITE_NIBBLES(0x08); //display off, cursor+blink off - ST7920_WRITE_NIBBLES(0x01); //clear CGRAM ram + ST7920_WRITE_BYTE(0x08); //display off, cursor+blink off + ST7920_WRITE_BYTE(0x01); //clear CGRAM ram u8g_Delay(15); //delay for CGRAM clear - ST7920_WRITE_NIBBLES(0x3E); //extended mode + GDRAM active + ST7920_WRITE_BYTE(0x3E); //extended mode + GDRAM active for (y = 0; y < (LCD_PIXEL_HEIGHT) / 2; y++) { //clear GDRAM - ST7920_WRITE_NIBBLES(0x80 | y); //set y - ST7920_WRITE_NIBBLES(0x80); //set x = 0 + ST7920_WRITE_BYTE(0x80 | y); //set y + ST7920_WRITE_BYTE(0x80); //set x = 0 ST7920_SET_DAT(); for (i = 0; i < 2 * (LCD_PIXEL_WIDTH) / 8; i++) //2x width clears both segments - ST7920_WRITE_NIBBLES(0); + ST7920_WRITE_BYTE(0); ST7920_SET_CMD(); } - - ST7920_WRITE_NIBBLES(0x0C); //display on, cursor+blink off - + ST7920_WRITE_BYTE(0x0C); //display on, cursor+blink off ST7920_NCS(); } break; @@ -150,15 +153,15 @@ uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo for (i = 0; i < PAGE_HEIGHT; i ++) { ST7920_SET_CMD(); if (y < 32) { - ST7920_WRITE_NIBBLES(0x80 | y); //y - ST7920_WRITE_NIBBLES(0x80); //x=0 + ST7920_WRITE_BYTE(0x80 | y); //y + ST7920_WRITE_BYTE(0x80); //x=0 } else { - ST7920_WRITE_NIBBLES(0x80 | (y - 32)); //y - ST7920_WRITE_NIBBLES(0x80 | 8); //x=64 + ST7920_WRITE_BYTE(0x80 | (y - 32)); //y + ST7920_WRITE_BYTE(0x80 | 8); //x=64 } ST7920_SET_DAT(); - ST7920_WRITE_NIBBLES_P(ptr, (LCD_PIXEL_WIDTH) / 8); //ptr is incremented inside of macro + ST7920_WRITE_BYTES(ptr, (LCD_PIXEL_WIDTH) / 8); //ptr is incremented inside of macro y++; } ST7920_NCS();