This driver is meant for the monochrome LCD display (model no: LS013B4DN04) from Sharp; but it should be easily adaptable to other Sharp displays.

Dependents:   sharpLCD-demo

Committer:
rgrover1
Date:
Wed Jul 23 10:40:35 2014 +0000
Revision:
0:62d7cfac67ca
Child:
1:ffc1d1d55581
initial working checkin

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 0:62d7cfac67ca 1 /* mbed Microcontroller Library
rgrover1 0:62d7cfac67ca 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 0:62d7cfac67ca 3 *
rgrover1 0:62d7cfac67ca 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 0:62d7cfac67ca 5 * you may not use this file except in compliance with the License.
rgrover1 0:62d7cfac67ca 6 * You may obtain a copy of the License at
rgrover1 0:62d7cfac67ca 7 *
rgrover1 0:62d7cfac67ca 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 0:62d7cfac67ca 9 *
rgrover1 0:62d7cfac67ca 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 0:62d7cfac67ca 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 0:62d7cfac67ca 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 0:62d7cfac67ca 13 * See the License for the specific language governing permissions and
rgrover1 0:62d7cfac67ca 14 * limitations under the License.
rgrover1 0:62d7cfac67ca 15 */
rgrover1 0:62d7cfac67ca 16
rgrover1 0:62d7cfac67ca 17 #include "mbed.h"
rgrover1 0:62d7cfac67ca 18 #include "font.h"
rgrover1 0:62d7cfac67ca 19
rgrover1 0:62d7cfac67ca 20 #ifndef __SHARP_LCD_HPP__
rgrover1 0:62d7cfac67ca 21 #define __SHARP_LCD_HPP__
rgrover1 0:62d7cfac67ca 22
rgrover1 0:62d7cfac67ca 23 /**
rgrover1 0:62d7cfac67ca 24 * This driver is meant for the monochrome LCD display (model
rgrover1 0:62d7cfac67ca 25 * no: LS013B4DN04) from Sharp.
rgrover1 0:62d7cfac67ca 26 *
rgrover1 0:62d7cfac67ca 27 * The LCD has the following pixel dimensions: width=96pixels,
rgrover1 0:62d7cfac67ca 28 * height=96pixels. This is a monochrome display with an inbuilt
rgrover1 0:62d7cfac67ca 29 * memory of 1 bit per pixel. If a pixel-bit is set to one, the
rgrover1 0:62d7cfac67ca 30 * corresponding pixel will show as black.
rgrover1 0:62d7cfac67ca 31 *
rgrover1 0:62d7cfac67ca 32 * The LCD memory is accessible to the micro-controller only through a
rgrover1 0:62d7cfac67ca 33 * serial interface; and <i>only for write operations</i>. It is
rgrover1 0:62d7cfac67ca 34 * necessary for the application to maintain its own frame-buffer
rgrover1 0:62d7cfac67ca 35 * memory in the micro-controller's SRAM (see fb_alloc())---the
rgrover1 0:62d7cfac67ca 36 * application is not restricted to a single framebuffer; if SRAM size
rgrover1 0:62d7cfac67ca 37 * permits, multiple buffers may be employed. In order to update the
rgrover1 0:62d7cfac67ca 38 * LCD, the application first draws (bitmaps or text) into some
rgrover1 0:62d7cfac67ca 39 * framebuffer memory, and then flushes the framebuffer to the LCD
rgrover1 0:62d7cfac67ca 40 * over the serial interface.
rgrover1 0:62d7cfac67ca 41 *
rgrover1 0:62d7cfac67ca 42 * Here's some sample code to drive the LCD display:
rgrover1 0:62d7cfac67ca 43 *
rgrover1 0:62d7cfac67ca 44 * DigitalOut led1(LED1);
rgrover1 0:62d7cfac67ca 45 * SharpLCD lcd(p9, MBED_SPI0);
rgrover1 0:62d7cfac67ca 46 *
rgrover1 0:62d7cfac67ca 47 * uint8_t framebuffer[SharpLCD::SIZEOF_FRAMEBUFFER_FOR_ALLOC];
rgrover1 0:62d7cfac67ca 48 *
rgrover1 0:62d7cfac67ca 49 * int main(void)
rgrover1 0:62d7cfac67ca 50 * {
rgrover1 0:62d7cfac67ca 51 * SharpLCD::FrameBuffer fb(framebuffer);
rgrover1 0:62d7cfac67ca 52 *
rgrover1 0:62d7cfac67ca 53 * lcd.enableDisplay();
rgrover1 0:62d7cfac67ca 54 * lcd.clear();
rgrover1 0:62d7cfac67ca 55 * fb.printString(lookupFontFace("DejaVu Serif", 8),
rgrover1 0:62d7cfac67ca 56 * 20,
rgrover1 0:62d7cfac67ca 57 * 40,
rgrover1 0:62d7cfac67ca 58 * BLACK,
rgrover1 0:62d7cfac67ca 59 * "Rohit");
rgrover1 0:62d7cfac67ca 60 * lcd.drawFrameBuffer(fb);
rgrover1 0:62d7cfac67ca 61 *
rgrover1 0:62d7cfac67ca 62 * led1 = 1;
rgrover1 0:62d7cfac67ca 63 * while (true) {
rgrover1 0:62d7cfac67ca 64 * wait(0.5);
rgrover1 0:62d7cfac67ca 65 * led1 = !led1;
rgrover1 0:62d7cfac67ca 66 * }
rgrover1 0:62d7cfac67ca 67 * }
rgrover1 0:62d7cfac67ca 68 */
rgrover1 0:62d7cfac67ca 69
rgrover1 0:62d7cfac67ca 70 class SharpLCD {
rgrover1 0:62d7cfac67ca 71 public:
rgrover1 0:62d7cfac67ca 72 class FrameBuffer {
rgrover1 0:62d7cfac67ca 73 public:
rgrover1 0:62d7cfac67ca 74 /**
rgrover1 0:62d7cfac67ca 75 * \brief initialize the hardware dependent component of a given
rgrover1 0:62d7cfac67ca 76 * framebuffer; and set it up to show all-white.
rgrover1 0:62d7cfac67ca 77 *
rgrover1 0:62d7cfac67ca 78 * \note This does not update the LCD automatically; it only
rgrover1 0:62d7cfac67ca 79 * initializes a framebuffer.
rgrover1 0:62d7cfac67ca 80 *
rgrover1 0:62d7cfac67ca 81 * \param[in] fb
rgrover1 0:62d7cfac67ca 82 * A memory buffer to initialize.
rgrover1 0:62d7cfac67ca 83 */
rgrover1 0:62d7cfac67ca 84 FrameBuffer(uint8_t *fb);
rgrover1 0:62d7cfac67ca 85
rgrover1 0:62d7cfac67ca 86 /**
rgrover1 0:62d7cfac67ca 87 * \brief Copy over a bitmap to a specified location into the framebuffer.
rgrover1 0:62d7cfac67ca 88 *
rgrover1 0:62d7cfac67ca 89 * This is the main work-horse for displaying bitmaps on the LCD. We
rgrover1 0:62d7cfac67ca 90 * only support mono-chrome bitmaps with an encoding of 1 for white
rgrover1 0:62d7cfac67ca 91 * and 0 for black. We have rendering tools to convert a bitmap into
rgrover1 0:62d7cfac67ca 92 * the required encoding.
rgrover1 0:62d7cfac67ca 93
rgrover1 0:62d7cfac67ca 94 * \note The placement of the target bitmap is limited to the LCD's
rgrover1 0:62d7cfac67ca 95 * boundary--otherwise this routine fails.
rgrover1 0:62d7cfac67ca 96 *
rgrover1 0:62d7cfac67ca 97 * In case you are wondering, 'blit' stands for Block Image Transfer.
rgrover1 0:62d7cfac67ca 98 *
rgrover1 0:62d7cfac67ca 99 * Sample code:
rgrover1 0:62d7cfac67ca 100 * <pre>
rgrover1 0:62d7cfac67ca 101 fb_bitBlit(fb,
rgrover1 0:62d7cfac67ca 102 (const uint8_t *)pixel_data,
rgrover1 0:62d7cfac67ca 103 width,
rgrover1 0:62d7cfac67ca 104 height,
rgrover1 0:62d7cfac67ca 105 0, // posx
rgrover1 0:62d7cfac67ca 106 0 // posy
rgrover1 0:62d7cfac67ca 107 );
rgrover1 0:62d7cfac67ca 108 lcd_drawFrameBuffer(fb);
rgrover1 0:62d7cfac67ca 109 </pre>
rgrover1 0:62d7cfac67ca 110 */
rgrover1 0:62d7cfac67ca 111 void bitBlit(const uint8_t *bitmap,
rgrover1 0:62d7cfac67ca 112 unsigned int width, /*!< width of the bitmap */
rgrover1 0:62d7cfac67ca 113 unsigned int height, /*!< height of the bitmap */
rgrover1 0:62d7cfac67ca 114 unsigned int posx, /*!< x-offset for the
rgrover1 0:62d7cfac67ca 115 * placement of the top-left
rgrover1 0:62d7cfac67ca 116 * corner of the bitmap
rgrover1 0:62d7cfac67ca 117 * w.r.t. the top-left
rgrover1 0:62d7cfac67ca 118 * corner of the screen */
rgrover1 0:62d7cfac67ca 119 unsigned int posy /*!< y-offset for the
rgrover1 0:62d7cfac67ca 120 * placement of the top-left
rgrover1 0:62d7cfac67ca 121 * corner of the bitmap
rgrover1 0:62d7cfac67ca 122 * w.r.t. the top-left
rgrover1 0:62d7cfac67ca 123 * corner of the screen */
rgrover1 0:62d7cfac67ca 124 );
rgrover1 0:62d7cfac67ca 125
rgrover1 0:62d7cfac67ca 126 /*
rgrover1 0:62d7cfac67ca 127 * \brief Fetch a byte (8-bit pixel sequence) from a given scan-line
rgrover1 0:62d7cfac67ca 128 * in the framebuffer.
rgrover1 0:62d7cfac67ca 129 *
rgrover1 0:62d7cfac67ca 130 * The scan-line is identified by the row; and pixels are grouped into
rgrover1 0:62d7cfac67ca 131 * 8-bit bytes within a row.
rgrover1 0:62d7cfac67ca 132 *
rgrover1 0:62d7cfac67ca 133 * \note This function is declared inline for a faster implementation.
rgrover1 0:62d7cfac67ca 134 *
rgrover1 0:62d7cfac67ca 135 * \param[in] framebuffer
rgrover1 0:62d7cfac67ca 136 * The framebuffer to fetch the byte from.
rgrover1 0:62d7cfac67ca 137 *
rgrover1 0:62d7cfac67ca 138 * \param[in] row
rgrover1 0:62d7cfac67ca 139 * The row index of the scan line.
rgrover1 0:62d7cfac67ca 140 *
rgrover1 0:62d7cfac67ca 141 * \param[in] byteIndex
rgrover1 0:62d7cfac67ca 142 * The pixel-index expressed as a byte-index.
rgrover1 0:62d7cfac67ca 143 */
rgrover1 0:62d7cfac67ca 144 uint8_t
rgrover1 0:62d7cfac67ca 145 getRowByte(unsigned int row, unsigned int byteIndex) {
rgrover1 0:62d7cfac67ca 146 return buffer[rowColToIndex(row, byteIndex)];
rgrover1 0:62d7cfac67ca 147 }
rgrover1 0:62d7cfac67ca 148
rgrover1 0:62d7cfac67ca 149 /*
rgrover1 0:62d7cfac67ca 150 * \brief Set a byte (8-bit pixel sequence) for a given scan-line in
rgrover1 0:62d7cfac67ca 151 * the framebuffer.
rgrover1 0:62d7cfac67ca 152 *
rgrover1 0:62d7cfac67ca 153 * The scan-line is identified by the row; and pixels are grouped into
rgrover1 0:62d7cfac67ca 154 * 8-bit bytes within a row.
rgrover1 0:62d7cfac67ca 155 *
rgrover1 0:62d7cfac67ca 156 * \note This function is declared inline for a faster implementation.
rgrover1 0:62d7cfac67ca 157 *
rgrover1 0:62d7cfac67ca 158 * \param[in] framebuffer
rgrover1 0:62d7cfac67ca 159 * The framebuffer to set the byte into.
rgrover1 0:62d7cfac67ca 160 *
rgrover1 0:62d7cfac67ca 161 * \param[in] row
rgrover1 0:62d7cfac67ca 162 * The row index of the scan line.
rgrover1 0:62d7cfac67ca 163 *
rgrover1 0:62d7cfac67ca 164 * \param[in] byteIndex
rgrover1 0:62d7cfac67ca 165 * The pixel-index expressed as a byte-index.
rgrover1 0:62d7cfac67ca 166 *
rgrover1 0:62d7cfac67ca 167 * \param[in] pixels
rgrover1 0:62d7cfac67ca 168 * The actual 8 pixels to set.
rgrover1 0:62d7cfac67ca 169 */
rgrover1 0:62d7cfac67ca 170 void
rgrover1 0:62d7cfac67ca 171 setRowByte(unsigned int row, unsigned int byteIndex, uint8_t pixels) {
rgrover1 0:62d7cfac67ca 172 buffer[rowColToIndex(row, byteIndex)] = pixels;
rgrover1 0:62d7cfac67ca 173 }
rgrover1 0:62d7cfac67ca 174
rgrover1 0:62d7cfac67ca 175 /**
rgrover1 0:62d7cfac67ca 176 * \brief The printf function for the frameBuffer.
rgrover1 0:62d7cfac67ca 177 *
rgrover1 0:62d7cfac67ca 178 * This can be used to render strings in a given
rgrover1 0:62d7cfac67ca 179 * font-face. Internally, it uses fb_bitBlit to bilt the glyphs onto a
rgrover1 0:62d7cfac67ca 180 * framebuffer. Currently, since bitBlit doesn't handle the case where
rgrover1 0:62d7cfac67ca 181 * a bitmap exceeds the framebuffer's boundary, you must be very
rgrover1 0:62d7cfac67ca 182 * careful about the placement of the text string. Later, when
rgrover1 0:62d7cfac67ca 183 * fb_bitBlit is able to handle bitmaps which fall outside the LCD's
rgrover1 0:62d7cfac67ca 184 * boundary, the rendered text may be clipped if it doesn't fit the
rgrover1 0:62d7cfac67ca 185 * frame.
rgrover1 0:62d7cfac67ca 186 *
rgrover1 0:62d7cfac67ca 187 * \param[in] face
rgrover1 0:62d7cfac67ca 188 * The font-face to be used for rendering the text.
rgrover1 0:62d7cfac67ca 189 *
rgrover1 0:62d7cfac67ca 190 * \param[in] baselineX
rgrover1 0:62d7cfac67ca 191 * The X-offset from the left corner of the screen of the starting
rgrover1 0:62d7cfac67ca 192 * pen position; this defines the X-coordinate of the baseline.
rgrover1 0:62d7cfac67ca 193 *
rgrover1 0:62d7cfac67ca 194 * \param[in] baselineY
rgrover1 0:62d7cfac67ca 195 * The Y-offset from the top corner of the screen of the starting
rgrover1 0:62d7cfac67ca 196 * pen position; this defines the Y-coordinate of the baseline.
rgrover1 0:62d7cfac67ca 197 *
rgrover1 0:62d7cfac67ca 198 * \param[in] fgColor
rgrover1 0:62d7cfac67ca 199 * The foreground colour.
rgrover1 0:62d7cfac67ca 200 *
rgrover1 0:62d7cfac67ca 201 * \param[in] string
rgrover1 0:62d7cfac67ca 202 * The text to be rendered.
rgrover1 0:62d7cfac67ca 203 *
rgrover1 0:62d7cfac67ca 204 * Sample code:
rgrover1 0:62d7cfac67ca 205 * <pre>
rgrover1 0:62d7cfac67ca 206 * face = lookupFontFace("DejaVu Serif", 9);
rgrover1 0:62d7cfac67ca 207 * if (face == NULL) {
rgrover1 0:62d7cfac67ca 208 * TRACE_FATAL("failed to find face for DejaVu Serif; 10\n");
rgrover1 0:62d7cfac67ca 209 * }
rgrover1 0:62d7cfac67ca 210 * fb_printString(fb,
rgrover1 0:62d7cfac67ca 211 * face,
rgrover1 0:62d7cfac67ca 212 * 90, // baselineX
rgrover1 0:62d7cfac67ca 213 * 140, // baselineY
rgrover1 0:62d7cfac67ca 214 * BLACK, // foregroundColor
rgrover1 0:62d7cfac67ca 215 * "Hello Mr. Obama!");
rgrover1 0:62d7cfac67ca 216 * lcd_drawFrameBuffer(fb);
rgrover1 0:62d7cfac67ca 217 * </pre>
rgrover1 0:62d7cfac67ca 218 */
rgrover1 0:62d7cfac67ca 219 void printString(const font_face_t *face,
rgrover1 0:62d7cfac67ca 220 unsigned short baselineX,
rgrover1 0:62d7cfac67ca 221 unsigned short baselineY,
rgrover1 0:62d7cfac67ca 222 font_color_t fgColor,
rgrover1 0:62d7cfac67ca 223 const char *string);
rgrover1 0:62d7cfac67ca 224
rgrover1 0:62d7cfac67ca 225 const uint8_t *getBuffer(void) const {
rgrover1 0:62d7cfac67ca 226 return (buffer);
rgrover1 0:62d7cfac67ca 227 }
rgrover1 0:62d7cfac67ca 228
rgrover1 0:62d7cfac67ca 229 uint8_t *getBuffer(void) {
rgrover1 0:62d7cfac67ca 230 return (buffer);
rgrover1 0:62d7cfac67ca 231 }
rgrover1 0:62d7cfac67ca 232
rgrover1 0:62d7cfac67ca 233 private:
rgrover1 0:62d7cfac67ca 234 unsigned rowColToIndex(unsigned row, unsigned col) {
rgrover1 0:62d7cfac67ca 235 return (row * LCD_FRAMEBUFFER_SIZEOF_SCAN_LINE) + LCD_FRAMEBUFFER_SIZEOF_SCAN_LINE_METADATA + col;
rgrover1 0:62d7cfac67ca 236 }
rgrover1 0:62d7cfac67ca 237
rgrover1 0:62d7cfac67ca 238 private:
rgrover1 0:62d7cfac67ca 239 uint8_t *const buffer;
rgrover1 0:62d7cfac67ca 240 };
rgrover1 0:62d7cfac67ca 241
rgrover1 0:62d7cfac67ca 242 public:
rgrover1 0:62d7cfac67ca 243 SharpLCD(PinName _displayEnablePin, PinName mosi, PinName miso_unused, PinName sclk, PinName _unused=NC) :
rgrover1 0:62d7cfac67ca 244 displayEnable(_displayEnablePin), chipSelect(p8), spi(mosi, miso_unused, sclk, _unused) {
rgrover1 0:62d7cfac67ca 245 displayEnable = 0;
rgrover1 0:62d7cfac67ca 246 chipSelect = 0;
rgrover1 0:62d7cfac67ca 247 spi.frequency(1000000);
rgrover1 0:62d7cfac67ca 248 spi.format(8, 0);
rgrover1 0:62d7cfac67ca 249 };
rgrover1 0:62d7cfac67ca 250
rgrover1 0:62d7cfac67ca 251 /**
rgrover1 0:62d7cfac67ca 252 * \brief Turn on the LCD's display.
rgrover1 0:62d7cfac67ca 253 *
rgrover1 0:62d7cfac67ca 254 * \note Updates to the LCD's memory won't show up on the display
rgrover1 0:62d7cfac67ca 255 * until the display is enabled through this function.
rgrover1 0:62d7cfac67ca 256 */
rgrover1 0:62d7cfac67ca 257 void enableDisplay(void);
rgrover1 0:62d7cfac67ca 258
rgrover1 0:62d7cfac67ca 259 /**
rgrover1 0:62d7cfac67ca 260 * \brief Turn off the LCD's display---i.e. make it go blank.
rgrover1 0:62d7cfac67ca 261 *
rgrover1 0:62d7cfac67ca 262 * \note The LCD will retain its memory even when the display is disabled.
rgrover1 0:62d7cfac67ca 263 *
rgrover1 0:62d7cfac67ca 264 * This is different from re-initializing the LCD's display, since it does
rgrover1 0:62d7cfac67ca 265 * not affect the LCD memory. When the display is re-enabled, the LCD
rgrover1 0:62d7cfac67ca 266 * will show the contents of its memory.
rgrover1 0:62d7cfac67ca 267 */
rgrover1 0:62d7cfac67ca 268 void disableDisplay(void);
rgrover1 0:62d7cfac67ca 269
rgrover1 0:62d7cfac67ca 270 /**
rgrover1 0:62d7cfac67ca 271 * \brief Clear the LCD's display
rgrover1 0:62d7cfac67ca 272 *
rgrover1 0:62d7cfac67ca 273 * Write all-white to the LCD's memory. If a frameBuffer is passed in
rgrover1 0:62d7cfac67ca 274 * then it is re-initialized as well; otherwise this function does not
rgrover1 0:62d7cfac67ca 275 * operate on any global frame-buffer and updating any
rgrover1 0:62d7cfac67ca 276 * application-specific frameBuffer is still the application's
rgrover1 0:62d7cfac67ca 277 * responsibility.
rgrover1 0:62d7cfac67ca 278 */
rgrover1 0:62d7cfac67ca 279 void clear(void);
rgrover1 0:62d7cfac67ca 280
rgrover1 0:62d7cfac67ca 281 static uint8_t bitReverse8(uint8_t byte) {
rgrover1 0:62d7cfac67ca 282 return (uint8_t)(__RBIT(byte) >> 24);
rgrover1 0:62d7cfac67ca 283 }
rgrover1 0:62d7cfac67ca 284
rgrover1 0:62d7cfac67ca 285 /**
rgrover1 0:62d7cfac67ca 286 * \brief Update LCD using a given framebuffer.
rgrover1 0:62d7cfac67ca 287 *
rgrover1 0:62d7cfac67ca 288 * The entire contents of the framebuffer will be DMA'd to the LCD;
rgrover1 0:62d7cfac67ca 289 * the calling thread will loose the CPU during the transfer, but
rgrover1 0:62d7cfac67ca 290 * other threads may remain active in that duration.
rgrover1 0:62d7cfac67ca 291 *
rgrover1 0:62d7cfac67ca 292 * \param[in] fb
rgrover1 0:62d7cfac67ca 293 * The frame buffer to send to the LCD hardware.
rgrover1 0:62d7cfac67ca 294 */
rgrover1 0:62d7cfac67ca 295 void drawFrameBuffer(const FrameBuffer &fb);
rgrover1 0:62d7cfac67ca 296
rgrover1 0:62d7cfac67ca 297 /**
rgrover1 0:62d7cfac67ca 298 * Toggle the VCOM mode of the LCD; it is recommended to trigger this
rgrover1 0:62d7cfac67ca 299 * periodically. Check the datasheet.
rgrover1 0:62d7cfac67ca 300 */
rgrover1 0:62d7cfac67ca 301 void toggleVCOM(void);
rgrover1 0:62d7cfac67ca 302
rgrover1 0:62d7cfac67ca 303 private:
rgrover1 0:62d7cfac67ca 304 /**
rgrover1 0:62d7cfac67ca 305 * Helper function to write out a buffer onto the LCD's SPI channel.
rgrover1 0:62d7cfac67ca 306 */
rgrover1 0:62d7cfac67ca 307 void writeBuffer(const uint8_t *buffer, unsigned len);
rgrover1 0:62d7cfac67ca 308
rgrover1 0:62d7cfac67ca 309 public:
rgrover1 0:62d7cfac67ca 310 static const unsigned LCD_WIDTH = 96; ///< Constant defining the LCD's geometry.
rgrover1 0:62d7cfac67ca 311 static const unsigned LCD_HEIGHT = 96; ///< Constant defining the LCD's geometry.
rgrover1 0:62d7cfac67ca 312 static const unsigned LCD_END_OF_DUMMY_SIZE = 2;
rgrover1 0:62d7cfac67ca 313 static const unsigned LCD_FRAMEBUFFER_SIZEOF_SCAN_LINE_METADATA =
rgrover1 0:62d7cfac67ca 314 (1 + /* mode byte in SPI update command */
rgrover1 0:62d7cfac67ca 315 1 /* addr byte in SPI update command */);
rgrover1 0:62d7cfac67ca 316 static const unsigned LCD_FRAMEBUFFER_SIZEOF_SCAN_LINE =
rgrover1 0:62d7cfac67ca 317 (LCD_FRAMEBUFFER_SIZEOF_SCAN_LINE_METADATA + (LCD_WIDTH / 8));
rgrover1 0:62d7cfac67ca 318
rgrover1 0:62d7cfac67ca 319 static const unsigned SIZEOF_FRAMEBUFFER = (LCD_HEIGHT * LCD_FRAMEBUFFER_SIZEOF_SCAN_LINE);
rgrover1 0:62d7cfac67ca 320 static const unsigned SIZEOF_FRAMEBUFFER_FOR_ALLOC = SIZEOF_FRAMEBUFFER + LCD_END_OF_DUMMY_SIZE;
rgrover1 0:62d7cfac67ca 321
rgrover1 0:62d7cfac67ca 322 private:
rgrover1 0:62d7cfac67ca 323 /* Constants for the LCD's command protocol */
rgrover1 0:62d7cfac67ca 324 static const uint8_t M0_FLAG = 0x80;
rgrover1 0:62d7cfac67ca 325 static const uint8_t M1_FLAG = 0x40;
rgrover1 0:62d7cfac67ca 326 static const uint8_t M2_FLAG = 0x20;
rgrover1 0:62d7cfac67ca 327 static const uint8_t DUMMY8 = 0x00;
rgrover1 0:62d7cfac67ca 328
rgrover1 0:62d7cfac67ca 329 private:
rgrover1 0:62d7cfac67ca 330 DigitalOut displayEnable;
rgrover1 0:62d7cfac67ca 331 DigitalOut chipSelect;
rgrover1 0:62d7cfac67ca 332 SPI spi;
rgrover1 0:62d7cfac67ca 333 };
rgrover1 0:62d7cfac67ca 334
rgrover1 0:62d7cfac67ca 335 inline void
rgrover1 0:62d7cfac67ca 336 SharpLCD::enableDisplay(void) {
rgrover1 0:62d7cfac67ca 337 displayEnable = 1;
rgrover1 0:62d7cfac67ca 338 }
rgrover1 0:62d7cfac67ca 339
rgrover1 0:62d7cfac67ca 340 inline void
rgrover1 0:62d7cfac67ca 341 SharpLCD::disableDisplay(void) {
rgrover1 0:62d7cfac67ca 342 displayEnable = 0;
rgrover1 0:62d7cfac67ca 343 }
rgrover1 0:62d7cfac67ca 344
rgrover1 0:62d7cfac67ca 345 #endif /* #ifndef __SHARP_LCD_HPP__ */