Initial version for Modtronix LCD2S I2C and SPI serial LCD displays. For details, see http://modtronix.com/products-serial-lcd-board/
lcd2s_i2c.cpp@2:fe0c1e27f362, 2015-08-07 (annotated)
- Committer:
- modtronix
- Date:
- Fri Aug 07 18:27:11 2015 +1000
- Revision:
- 2:fe0c1e27f362
- Parent:
- 1:429b7d3f7b95
Improvements
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
modtronix | 1:429b7d3f7b95 | 1 | /** |
modtronix | 1:429b7d3f7b95 | 2 | * File: lcd2s_i2c.cpp |
modtronix | 1:429b7d3f7b95 | 3 | * |
modtronix | 1:429b7d3f7b95 | 4 | * Author: Modtronix Engineering - www.modtronix.com |
modtronix | 1:429b7d3f7b95 | 5 | * |
modtronix | 1:429b7d3f7b95 | 6 | * Description: |
modtronix | 1:429b7d3f7b95 | 7 | * |
modtronix | 1:429b7d3f7b95 | 8 | * Software License Agreement: |
modtronix | 1:429b7d3f7b95 | 9 | * This software has been written or modified by Modtronix Engineering. The code |
modtronix | 1:429b7d3f7b95 | 10 | * may be modified and can be used free of charge for commercial and non commercial |
modtronix | 1:429b7d3f7b95 | 11 | * applications. If this is modified software, any license conditions from original |
modtronix | 1:429b7d3f7b95 | 12 | * software also apply. Any redistribution must include reference to 'Modtronix |
modtronix | 1:429b7d3f7b95 | 13 | * Engineering' and web link(www.modtronix.com) in the file header. |
modtronix | 1:429b7d3f7b95 | 14 | * |
modtronix | 1:429b7d3f7b95 | 15 | * THIS SOFTWARE IS PROVIDED IN AN 'AS IS' CONDITION. NO WARRANTIES, WHETHER EXPRESS, |
modtronix | 1:429b7d3f7b95 | 16 | * IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF |
modtronix | 1:429b7d3f7b95 | 17 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE |
modtronix | 1:429b7d3f7b95 | 18 | * COMPANY SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR |
modtronix | 1:429b7d3f7b95 | 19 | * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. |
modtronix | 1:429b7d3f7b95 | 20 | */ |
modtronix | 1:429b7d3f7b95 | 21 | #include "mbed.h" |
modtronix | 1:429b7d3f7b95 | 22 | #include "lcd2s_i2c.h" |
modtronix | 1:429b7d3f7b95 | 23 | |
modtronix | 1:429b7d3f7b95 | 24 | |
modtronix | 1:429b7d3f7b95 | 25 | // DEFINES //////////////////////////////////////////////////////////////////// |
modtronix | 1:429b7d3f7b95 | 26 | |
modtronix | 1:429b7d3f7b95 | 27 | |
modtronix | 1:429b7d3f7b95 | 28 | // GLOBAL VARIABLES /////////////////////////////////////////////////////////// |
modtronix | 1:429b7d3f7b95 | 29 | |
modtronix | 1:429b7d3f7b95 | 30 | |
modtronix | 1:429b7d3f7b95 | 31 | // Function Prototypes //////////////////////////////////////////////////////// |
modtronix | 1:429b7d3f7b95 | 32 | |
modtronix | 1:429b7d3f7b95 | 33 | |
modtronix | 1:429b7d3f7b95 | 34 | LCD2S_I2C::LCD2S_I2C(I2C* i2c, uint8_t rows/* = 4*/, uint8_t columns/* = 20*/) |
modtronix | 1:429b7d3f7b95 | 35 | : LCD2S(rows, columns) |
modtronix | 1:429b7d3f7b95 | 36 | { |
modtronix | 1:429b7d3f7b95 | 37 | pI2C = i2c; |
modtronix | 1:429b7d3f7b95 | 38 | i2cAdr = 0x50; //Default I2C address of the LCD |
modtronix | 1:429b7d3f7b95 | 39 | } |
modtronix | 1:429b7d3f7b95 | 40 | |
modtronix | 1:429b7d3f7b95 | 41 | /** Initializes the LCD2S device with default values |
modtronix | 1:429b7d3f7b95 | 42 | * - Interrupt pin is Open Collector output type |
modtronix | 1:429b7d3f7b95 | 43 | * - Backlight On |
modtronix | 1:429b7d3f7b95 | 44 | * - Display On |
modtronix | 1:429b7d3f7b95 | 45 | * - Backlight 200 (value from 0 to 255) |
modtronix | 1:429b7d3f7b95 | 46 | * - Cursor off, block cursor off |
modtronix | 1:429b7d3f7b95 | 47 | * - Cursor moves forward |
modtronix | 1:429b7d3f7b95 | 48 | * - Keypad is 4x4 button type (if present) |
modtronix | 1:429b7d3f7b95 | 49 | * - OUT1 disabled |
modtronix | 1:429b7d3f7b95 | 50 | * - GPIO1 to 3 disabled |
modtronix | 1:429b7d3f7b95 | 51 | * - Keypad Buzzer off |
modtronix | 1:429b7d3f7b95 | 52 | * - Keypad repeat rate = 320ms |
modtronix | 1:429b7d3f7b95 | 53 | * - Keypad Repeat Delay = 1 second |
modtronix | 1:429b7d3f7b95 | 54 | * - Keypad Debounce Time = 64ms |
modtronix | 1:429b7d3f7b95 | 55 | * |
modtronix | 1:429b7d3f7b95 | 56 | * @param contrast The display contrast, a value from 0 to 255 |
modtronix | 1:429b7d3f7b95 | 57 | */ |
modtronix | 1:429b7d3f7b95 | 58 | void LCD2S_I2C::initDefault(uint8_t contrast) { |
modtronix | 1:429b7d3f7b95 | 59 | char cmd[8]; |
modtronix | 1:429b7d3f7b95 | 60 | |
modtronix | 1:429b7d3f7b95 | 61 | //Byte 1 = 0x95 |
modtronix | 1:429b7d3f7b95 | 62 | //Configure LCD using "Configure Device" command |
modtronix | 1:429b7d3f7b95 | 63 | cmd[0] = LCD2S_CMD_CONFIG_DEVICE; |
modtronix | 1:429b7d3f7b95 | 64 | |
modtronix | 1:429b7d3f7b95 | 65 | //Byte 2 (Display) of command |
modtronix | 1:429b7d3f7b95 | 66 | //xx1x xxxx - Interrupt pin is Open Collector output type |
modtronix | 1:429b7d3f7b95 | 67 | //xxx1 1xxx - Backlight On, Display On |
modtronix | 1:429b7d3f7b95 | 68 | //xxxx x001 - Cursor off, block cursor off, Cursor moves forward |
modtronix | 1:429b7d3f7b95 | 69 | //0011 1001 = 0x39 |
modtronix | 1:429b7d3f7b95 | 70 | cmd[1] = 0x39; |
modtronix | 1:429b7d3f7b95 | 71 | |
modtronix | 1:429b7d3f7b95 | 72 | //Byte 3 (Contrast and Brightness) of command |
modtronix | 1:429b7d3f7b95 | 73 | //01xx xxxx - Set Backlight to 100 (range is 0 to 255) |
modtronix | 1:429b7d3f7b95 | 74 | //xx11 0111 - Set contrast to 220 (0x37 x 4) |
modtronix | 1:429b7d3f7b95 | 75 | //0111 0111 = 0x77 |
modtronix | 1:429b7d3f7b95 | 76 | cmd[2] = 0x77; |
modtronix | 1:429b7d3f7b95 | 77 | |
modtronix | 1:429b7d3f7b95 | 78 | //Byte 4 (keypad and IO) of command |
modtronix | 1:429b7d3f7b95 | 79 | //0x0f Configures device for 4x4 keypad (if present), OUT1 disabled, GPIO1 to 3 disabled |
modtronix | 1:429b7d3f7b95 | 80 | cmd[3] = 0x0f; |
modtronix | 1:429b7d3f7b95 | 81 | |
modtronix | 1:429b7d3f7b95 | 82 | //Byte 5 (Keypad and Buzzer) of command |
modtronix | 1:429b7d3f7b95 | 83 | //01xx xxxx - Keypad Buzzer off |
modtronix | 1:429b7d3f7b95 | 84 | //xx10 xxxx - Keypad repeat rate = 320ms |
modtronix | 1:429b7d3f7b95 | 85 | //xxxx 10xx - Keypad Repeat Delay = 1 second |
modtronix | 1:429b7d3f7b95 | 86 | //xxxx xx10 - Keypad Debounce Time = 64ms |
modtronix | 1:429b7d3f7b95 | 87 | //0110 1010 = 0x6A |
modtronix | 1:429b7d3f7b95 | 88 | cmd[4] = 0x6a; |
modtronix | 1:429b7d3f7b95 | 89 | |
modtronix | 1:429b7d3f7b95 | 90 | pI2C->write(i2cAdr, cmd, 5); |
modtronix | 1:429b7d3f7b95 | 91 | } |
modtronix | 1:429b7d3f7b95 | 92 | |
modtronix | 1:429b7d3f7b95 | 93 | |
modtronix | 1:429b7d3f7b95 | 94 | /** Causes the display to be updated with buffer content |
modtronix | 1:429b7d3f7b95 | 95 | */ |
modtronix | 2:fe0c1e27f362 | 96 | uint8_t LCD2S_I2C::display(void) { |
modtronix | 2:fe0c1e27f362 | 97 | uint8_t retVal = 0; |
modtronix | 1:429b7d3f7b95 | 98 | uint8_t row, col; |
modtronix | 1:429b7d3f7b95 | 99 | uint8_t colFirstDirty = 0xff; |
modtronix | 1:429b7d3f7b95 | 100 | uint8_t colLastDirty = 0xff; |
modtronix | 1:429b7d3f7b95 | 101 | uint32_t mask = 0; |
modtronix | 1:429b7d3f7b95 | 102 | char cmd[32]; |
modtronix | 1:429b7d3f7b95 | 103 | |
modtronix | 1:429b7d3f7b95 | 104 | // bool changed = FALSE; |
modtronix | 1:429b7d3f7b95 | 105 | // |
modtronix | 1:429b7d3f7b95 | 106 | // //Check if anything changed |
modtronix | 1:429b7d3f7b95 | 107 | // for (row=0; row<rows; row++) { |
modtronix | 1:429b7d3f7b95 | 108 | // if(pDirtyRows[row] != 0) { |
modtronix | 1:429b7d3f7b95 | 109 | // changed = TRUE; |
modtronix | 1:429b7d3f7b95 | 110 | // break; |
modtronix | 1:429b7d3f7b95 | 111 | // } |
modtronix | 1:429b7d3f7b95 | 112 | // } |
modtronix | 1:429b7d3f7b95 | 113 | // |
modtronix | 1:429b7d3f7b95 | 114 | // if (changed == FALSE) |
modtronix | 1:429b7d3f7b95 | 115 | // return; |
modtronix | 1:429b7d3f7b95 | 116 | |
modtronix | 1:429b7d3f7b95 | 117 | //Write to dirty rows |
modtronix | 1:429b7d3f7b95 | 118 | for (row=0; row<rows; row++) { |
modtronix | 1:429b7d3f7b95 | 119 | if(pDirtyRows[row] != 0) { |
modtronix | 1:429b7d3f7b95 | 120 | mask = 0x01; |
modtronix | 1:429b7d3f7b95 | 121 | //Get first and last dirty characters in current row |
modtronix | 1:429b7d3f7b95 | 122 | for(col=0; col<columns; col++) { |
modtronix | 1:429b7d3f7b95 | 123 | //Is current char dirty? |
modtronix | 1:429b7d3f7b95 | 124 | if ((pDirtyRows[row] & mask) != 0) { |
modtronix | 1:429b7d3f7b95 | 125 | if(colFirstDirty == 0xff) |
modtronix | 1:429b7d3f7b95 | 126 | colFirstDirty = col; |
modtronix | 1:429b7d3f7b95 | 127 | colLastDirty=col; |
modtronix | 1:429b7d3f7b95 | 128 | } |
modtronix | 1:429b7d3f7b95 | 129 | mask = mask << 1; |
modtronix | 1:429b7d3f7b95 | 130 | } |
modtronix | 1:429b7d3f7b95 | 131 | |
modtronix | 1:429b7d3f7b95 | 132 | //Set cursor position |
modtronix | 1:429b7d3f7b95 | 133 | cmd[0] = LCD2S_CMD_SET_CURSOR_POSITION; |
modtronix | 1:429b7d3f7b95 | 134 | cmd[1] = row+1; |
modtronix | 1:429b7d3f7b95 | 135 | cmd[2] = colFirstDirty+1; |
modtronix | 2:fe0c1e27f362 | 136 | if ((retVal = pI2C->write(this->i2cAdr, cmd, 3)) != 0) { |
modtronix | 2:fe0c1e27f362 | 137 | return retVal; //Return error code |
modtronix | 2:fe0c1e27f362 | 138 | } |
modtronix | 1:429b7d3f7b95 | 139 | wait_ms(5); |
modtronix | 1:429b7d3f7b95 | 140 | |
modtronix | 1:429b7d3f7b95 | 141 | //Write string - only dirty characters are written |
modtronix | 1:429b7d3f7b95 | 142 | cmd[0] = LCD2S_CMD_WRITE_STRING; |
modtronix | 1:429b7d3f7b95 | 143 | for(col=colFirstDirty; col<=colLastDirty; col++) { |
modtronix | 1:429b7d3f7b95 | 144 | cmd[col-colFirstDirty+1] = pBuf[(row*columns)+col]; |
modtronix | 1:429b7d3f7b95 | 145 | } |
modtronix | 2:fe0c1e27f362 | 146 | if ((retVal = pI2C->write(this->i2cAdr, cmd, colLastDirty-colFirstDirty+2)) != 0) { |
modtronix | 2:fe0c1e27f362 | 147 | return retVal; //Return error code |
modtronix | 2:fe0c1e27f362 | 148 | } |
modtronix | 1:429b7d3f7b95 | 149 | } |
modtronix | 1:429b7d3f7b95 | 150 | } |
modtronix | 2:fe0c1e27f362 | 151 | |
modtronix | 2:fe0c1e27f362 | 152 | return retVal; |
modtronix | 1:429b7d3f7b95 | 153 | } |
modtronix | 1:429b7d3f7b95 | 154 | |
modtronix | 1:429b7d3f7b95 | 155 | int LCD2S_I2C::writeChar(uint8_t c) { |
modtronix | 1:429b7d3f7b95 | 156 | //Write to buffer |
modtronix | 1:429b7d3f7b95 | 157 | pBuf[(cursor_row * columns) + cursor_col] = c; |
modtronix | 1:429b7d3f7b95 | 158 | |
modtronix | 1:429b7d3f7b95 | 159 | //Set dirty flag |
modtronix | 1:429b7d3f7b95 | 160 | pDirtyRows[cursor_row] |= 0x01 << cursor_col; |
modtronix | 1:429b7d3f7b95 | 161 | |
modtronix | 1:429b7d3f7b95 | 162 | if (++cursor_col >= columns) { |
modtronix | 1:429b7d3f7b95 | 163 | cursor_col = 0; |
modtronix | 1:429b7d3f7b95 | 164 | |
modtronix | 1:429b7d3f7b95 | 165 | if (++cursor_row >= rows) { |
modtronix | 1:429b7d3f7b95 | 166 | cursor_row = 0; |
modtronix | 1:429b7d3f7b95 | 167 | } |
modtronix | 1:429b7d3f7b95 | 168 | } |
modtronix | 1:429b7d3f7b95 | 169 | return 0; |
modtronix | 1:429b7d3f7b95 | 170 | } |
modtronix | 1:429b7d3f7b95 | 171 | |
modtronix | 1:429b7d3f7b95 | 172 | //void LCD2S_I2C::write(const char* str) { |
modtronix | 1:429b7d3f7b95 | 173 | // char cmd[32]; |
modtronix | 1:429b7d3f7b95 | 174 | // |
modtronix | 1:429b7d3f7b95 | 175 | // cmd[0] = LCD2S_CMD_WRITE_STRING; |
modtronix | 1:429b7d3f7b95 | 176 | // cmd[1] = 0x0c; //Clear display and go to first line |
modtronix | 1:429b7d3f7b95 | 177 | // cmd[2] = 'H'; |
modtronix | 1:429b7d3f7b95 | 178 | // cmd[3] = 'o'; |
modtronix | 1:429b7d3f7b95 | 179 | // pI2C->write(this->i2cAdr, cmd, 4); |
modtronix | 1:429b7d3f7b95 | 180 | //} |