Library for Adafruit SHARP Memory Displays. This is a port of the original Arduino library available at: https://github.com/adafruit/Adafruit_SHARP_Memory_Display .
Dependents: Adafruit_SHARP_Memory_Display_demo Analog_Clock
Library for Adafruit Sharp Memory Displays. A demo is available here: https://developer.mbed.org/users/marcpl/code/Adafruit_SHARP_Memory_Display_demo/
Diff: Adafruit_SharpMem.cpp
- Revision:
- 0:070c76a8d782
- Child:
- 3:99cc0e72e165
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Adafruit_SharpMem.cpp Tue Jun 23 16:49:02 2015 +0000 @@ -0,0 +1,215 @@ +/********************************************************************* +This is an Arduino library for our Monochrome SHARP Memory Displays + + Pick one up today in the adafruit shop! + ------> http://www.adafruit.com/products/1393 + +These displays use SPI to communicate, 3 pins are required to +interface + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information +All text above, and the splash screen must be included in any redistribution +*********************************************************************/ + + /* + * Modified by Marc PLOUHINEC 23/06/2015 for use in mbed + */ + +#include "Adafruit_SharpMem.h" + +/************************************************************************** + Sharp Memory Display Connector + ----------------------------------------------------------------------- + Pin Function Notes + === ============== =============================== + 1 VIN 3.3-5.0V (into LDO supply) + 2 3V3 3.3V out + 3 GND + 4 SCLK Serial Clock + 5 MOSI Serial Data Input + 6 CS Serial Chip Select + 9 EXTMODE COM Inversion Select (Low = SW clock/serial) + 7 EXTCOMIN External COM Inversion Signal + 8 DISP Display On(High)/Off(Low) + + **************************************************************************/ + +#define SHARPMEM_BIT_WRITECMD (0x80) +#define SHARPMEM_BIT_VCOM (0x40) +#define SHARPMEM_BIT_CLEAR (0x20) +#define TOGGLE_VCOM do { _sharpmem_vcom = _sharpmem_vcom ? 0x00 : SHARPMEM_BIT_VCOM; } while(0); + +uint8_t sharpmem_buffer[(SHARPMEM_LCDWIDTH * SHARPMEM_LCDHEIGHT) / 8]; + +/* ************* */ +/* CONSTRUCTORS */ +/* ************* */ +Adafruit_SharpMem::Adafruit_SharpMem(PinName enable, PinName cs, PinName mosi, PinName miso_unused, PinName sclk, PinName _unused) : + Adafruit_GFX(SHARPMEM_LCDWIDTH, SHARPMEM_LCDHEIGHT), spi(mosi, miso_unused, sclk, _unused), displayEnable(enable, 0), chipSelect(cs, 0), _sharpmem_vcom(SHARPMEM_BIT_VCOM) { + + spi.frequency(1000000); + spi.format(8, 0); +} + +void Adafruit_SharpMem::begin() { + setRotation(2); +} + +/* ************** */ +/* PUBLIC METHODS */ +/* ************** */ + +// 1<<n is a costly operation on AVR -- table usu. smaller & faster +static const uint8_t + set[] = { 1, 2, 4, 8, 16, 32, 64, 128 }, + clr[] = { ~1, ~2, ~4, ~8, ~16, ~32, ~64, ~128 }; + +/**************************************************************************/ +/*! + @brief Draws a single pixel in image buffer + + @param[in] x + The x position (0 based) + @param[in] y + The y position (0 based) +*/ +/**************************************************************************/ +void Adafruit_SharpMem::drawPixel(int16_t x, int16_t y, uint16_t color) +{ + if((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) return; + + switch(rotation) { + case 1: + swap(x, y); + x = _rawWidth - 1 - x; + break; + case 2: + x = _rawWidth - 1 - x; + y = _rawHeight - 1 - y; + break; + case 3: + swap(x, y); + y = _rawHeight - 1 - y; + break; + } + + if(color) { + sharpmem_buffer[(y*SHARPMEM_LCDWIDTH + x) / 8] |= set[x & 7]; + } else { + sharpmem_buffer[(y*SHARPMEM_LCDWIDTH + x) / 8] &= clr[x & 7]; + } +} + +/**************************************************************************/ +/*! + @brief Gets the value (1 or 0) of the specified pixel from the buffer + + @param[in] x + The x position (0 based) + @param[in] y + The y position (0 based) + + @return 1 if the pixel is enabled, 0 if disabled +*/ +/**************************************************************************/ +uint8_t Adafruit_SharpMem::getPixel(uint16_t x, uint16_t y) +{ + if((x >= _width) || (y >= _height)) return 0; // <0 test not needed, unsigned + + switch(rotation) { + case 1: + swap(x, y); + x = _rawWidth - 1 - x; + break; + case 2: + x = _rawWidth - 1 - x; + y = _rawHeight - 1 - y; + break; + case 3: + swap(x, y); + y = _rawHeight - 1 - y; + break; + } + + return sharpmem_buffer[(y*SHARPMEM_LCDWIDTH + x) / 8] & set[x & 7] ? 1 : 0; +} + +/**************************************************************************/ +/*! + @brief Clears the screen +*/ +/**************************************************************************/ +void Adafruit_SharpMem::clearDisplay() +{ + memset(sharpmem_buffer, 0xff, (SHARPMEM_LCDWIDTH * SHARPMEM_LCDHEIGHT) / 8); + // Send the clear screen command rather than doing a HW refresh (quicker) + chipSelect = 1; + spi.write(_sharpmem_vcom | SHARPMEM_BIT_CLEAR); + spi.write(0x00); + TOGGLE_VCOM; + chipSelect = 0; +} + +/**************************************************************************/ +/*! + @brief Renders the contents of the pixel buffer on the LCD +*/ +/**************************************************************************/ +void Adafruit_SharpMem::refresh(void) +{ + uint16_t i, totalbytes, currentline, oldline; + totalbytes = (SHARPMEM_LCDWIDTH * SHARPMEM_LCDHEIGHT) / 8; + + // Send the write command + chipSelect = 1; + spi.write(SHARPMEM_BIT_WRITECMD | _sharpmem_vcom); + TOGGLE_VCOM; + + // Send the address for line 1 + oldline = currentline = 1; + spi.write(bitReverse8(currentline)); + + // Send image buffer + for (i=0; i<totalbytes; i++) + { + spi.write(bitReverse8(sharpmem_buffer[i])); + currentline = ((i+1)/(SHARPMEM_LCDWIDTH/8)) + 1; + if(currentline != oldline) + { + // Send end of line and address bytes + spi.write(0x00); + if (currentline <= SHARPMEM_LCDHEIGHT) + { + spi.write(bitReverse8(currentline)); + } + oldline = currentline; + } + } + + // Send another trailing 8 bits for the last line + spi.write(0x00); + chipSelect = 0; +} + +/**************************************************************************/ +/*! + @brief Turn on the screen +*/ +/**************************************************************************/ +void Adafruit_SharpMem::enableDisplay() { + displayEnable = 1; +} + +/**************************************************************************/ +/*! + @brief Turn off the screen +*/ +/**************************************************************************/ +void Adafruit_SharpMem::disableDisplay() { + displayEnable = 0; +} \ No newline at end of file