void ST7920LCDDriver::begin(bool gmode) { // Set up the SPI interface for talking to the LCD. We have to set MOSI, SCLK and SS to outputs, then enable SPI. digitalWrite(clockPin, LOW); digitalWrite(dataPin, LOW); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); if (useSpi) { SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0); // enable SPI, master mode, clock low when idle, data sampled on rising edge, clock = f/16 (= 1MHz), send MSB first //SPSR = (1 << SPI2X); // double the speed to 2MHz (optional) } gfxMode = false; sendLcdCommand(LcdFunctionSetBasicAlpha); delay(1); sendLcdCommand(LcdFunctionSetBasicAlpha); commandDelay(); sendLcdCommand(LcdEntryModeSet); commandDelay(); extendedMode = false; gfxMode = true; sendLcdCommand(LcdDisplayOn); commandDelay(); }
//------------------------------------------------------------------------------ void lcdl_exit(void) { lcdl_clear(); sendLcdCommand(deviceHandle_l, kLcdCmdDisplayOff, NULL); sendLcdCommand(deviceHandle_l, kLcdCmdBlinkingCursorOff, NULL); alt_i2c_disable(deviceHandle_l); alt_i2c_uninit(deviceHandle_l); }
//------------------------------------------------------------------------------ void lcdl_clear(void) { // Clear screen if (sendLcdCommand(deviceHandle_l, kLcdCmdClearScreen, NULL) != ALT_E_SUCCESS) { DEBUG_LVL_ERROR_TRACE("LCD ERR: Failed to clear screen\n"); } }
void ST7920LCDDriver::ensureExtendedMode() { if (!extendedMode) { sendLcdCommand(gfxMode ? LcdFunctionSetExtendedGraphic : LcdFunctionSetExtendedAlpha); commandDelay(); extendedMode = true; } }
void ST7920LCDDriver::ensureBasicMode() { if (extendedMode) { sendLcdCommand(gfxMode ? LcdFunctionSetBasicGraphic : LcdFunctionSetBasicAlpha); commandDelay(); extendedMode = false; } }
void ST7920LCDDriver::setGraphicsAddress(unsigned int r, unsigned int c) { if (gfxMode) { ensureExtendedMode(); sendLcdCommand(LcdSetGdramAddress | (r & 31)); //commandDelay(); // don't seem to need this one sendLcdCommand(LcdSetGdramAddress | c | ((r & 32) >> 2)); commandDelay(); // we definitely need this one } }
//------------------------------------------------------------------------------ INT lcdl_changeToLine(unsigned INT line_p) { UINT8 param; if (line_p < 2) param = LCD_POS_1ST_LINE; else param = LCD_POS_2ND_LINE; if (sendLcdCommand(deviceHandle_l, kLcdCmdSetCursor, ¶m) != ALT_E_SUCCESS) return -1; else return 0; }
//------------------------------------------------------------------------------ void lcdl_init(void) { INT ret = 0; ALT_I2C_MASTER_CONFIG_t cfg; UINT32 speed; // Init I2C module if (alt_i2c_init(ALT_I2C_I2C0, deviceHandle_l) != ALT_E_SUCCESS) { ret = -1; goto Exit; } if (alt_i2c_enable(deviceHandle_l) != ALT_E_SUCCESS) // Enable I2C module { ret = -1; goto Exit; } if (alt_i2c_master_config_get(deviceHandle_l, &cfg) != ALT_E_SUCCESS) // Configure I2C module { ret = -1; goto Exit; } if (alt_i2c_master_config_speed_get(deviceHandle_l, &cfg, &speed) != ALT_E_SUCCESS) { ret = -1; goto Exit; } PRINTF("LCD INFO: Current I2C speed = %d Hz.\n", (INT)speed); if (alt_i2c_master_config_speed_set(deviceHandle_l, &cfg, LCD_I2C_SPEED) != ALT_E_SUCCESS) { ret = -1; goto Exit; } if (alt_i2c_master_config_speed_get(deviceHandle_l, &cfg, &speed) != ALT_E_SUCCESS) { ret = -1; goto Exit; } else { PRINTF("LCD INFO: New I2C speed = %d Hz.\n", (INT)speed); cfg.addr_mode = ALT_I2C_ADDR_MODE_7_BIT; cfg.restart_enable = ALT_E_TRUE; if (alt_i2c_master_config_set(deviceHandle_l, &cfg) != ALT_E_SUCCESS) { ret = -1; goto Exit; } if (alt_i2c_sda_hold_time_set(deviceHandle_l, 8) != ALT_E_SUCCESS) { ret = -1; goto Exit; } if (alt_i2c_master_target_set(deviceHandle_l, LCD_I2C_ADDRESS) != ALT_E_SUCCESS) // Set target display I2C address { ret = -1; goto Exit; } if (sendLcdCommand(deviceHandle_l, kLcdCmdDisplayOn, NULL) != ALT_E_SUCCESS) // Turn display on { ret = -1; goto Exit; } if (sendLcdCommand(deviceHandle_l, kLcdCmdBlinkingCursorOn, NULL) != ALT_E_SUCCESS) // Turn cursor on { ret = -1; goto Exit; } else ret = 0; } Exit: if (ret != 0) DEBUG_LVL_ERROR_TRACE("LCD ERR: Initialization Failed!!\n"); return; }