LCD module Switch Science SKU#1405, which driver IC is ST7032i.
st7032i.cpp@0:92bfc61fb13b, 2017-07-01 (annotated)
- Committer:
- coisme
- Date:
- Sat Jul 01 16:01:37 2017 +0000
- Revision:
- 0:92bfc61fb13b
First commit.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
coisme | 0:92bfc61fb13b | 1 | #include "st7032i.h" |
coisme | 0:92bfc61fb13b | 2 | |
coisme | 0:92bfc61fb13b | 3 | #define SLAVE_ADDR 0x3e |
coisme | 0:92bfc61fb13b | 4 | |
coisme | 0:92bfc61fb13b | 5 | #define MAX_VAL_CONTRAST 63 |
coisme | 0:92bfc61fb13b | 6 | |
coisme | 0:92bfc61fb13b | 7 | #define CONTINUE 0x80 |
coisme | 0:92bfc61fb13b | 8 | #define INSTRUCTION 0x00 |
coisme | 0:92bfc61fb13b | 9 | #define NOT_CONTINUE 0x00 |
coisme | 0:92bfc61fb13b | 10 | #define DATA 0x40 |
coisme | 0:92bfc61fb13b | 11 | |
coisme | 0:92bfc61fb13b | 12 | #define MAX_VAL_COLUMN 8 |
coisme | 0:92bfc61fb13b | 13 | #define MAX_VAL_ROW 2 |
coisme | 0:92bfc61fb13b | 14 | |
coisme | 0:92bfc61fb13b | 15 | St7032i::St7032i(I2C *obj){ |
coisme | 0:92bfc61fb13b | 16 | i2c = obj; |
coisme | 0:92bfc61fb13b | 17 | } |
coisme | 0:92bfc61fb13b | 18 | |
coisme | 0:92bfc61fb13b | 19 | St7032i::Status St7032i::init(){ |
coisme | 0:92bfc61fb13b | 20 | // Initialization command sequence. Check the data sheet. |
coisme | 0:92bfc61fb13b | 21 | const char initSequence[] = { |
coisme | 0:92bfc61fb13b | 22 | 0x38, // Function set |
coisme | 0:92bfc61fb13b | 23 | 0x39, // Function set |
coisme | 0:92bfc61fb13b | 24 | 0x14, // Internal OSC frequency |
coisme | 0:92bfc61fb13b | 25 | 0x70, // Contrast set |
coisme | 0:92bfc61fb13b | 26 | 0x56, // Power/ICON/Contrast control |
coisme | 0:92bfc61fb13b | 27 | 0x6c, // Follower control |
coisme | 0:92bfc61fb13b | 28 | 0x38, // Function set |
coisme | 0:92bfc61fb13b | 29 | 0x0c, // Display ON/OFF control |
coisme | 0:92bfc61fb13b | 30 | 0x01 // Clear Display |
coisme | 0:92bfc61fb13b | 31 | }; |
coisme | 0:92bfc61fb13b | 32 | |
coisme | 0:92bfc61fb13b | 33 | // wait time after a command sent. Check the data sheet. |
coisme | 0:92bfc61fb13b | 34 | const int t_wait_us[] = { |
coisme | 0:92bfc61fb13b | 35 | 27, 27, 27, 27, 27, 200000, 27, 27, 1080 // micro-seconds |
coisme | 0:92bfc61fb13b | 36 | }; |
coisme | 0:92bfc61fb13b | 37 | |
coisme | 0:92bfc61fb13b | 38 | /* Somehow this workaround was needed on my test environment (BLENano) to |
coisme | 0:92bfc61fb13b | 39 | * make the module work correctly. Maybe the following issue is related to |
coisme | 0:92bfc61fb13b | 40 | * this problem. |
coisme | 0:92bfc61fb13b | 41 | * https://strawberry-linux.com/pub/i2c_lcd-an004.pdf |
coisme | 0:92bfc61fb13b | 42 | */ |
coisme | 0:92bfc61fb13b | 43 | { |
coisme | 0:92bfc61fb13b | 44 | i2c->start(); // start condition |
coisme | 0:92bfc61fb13b | 45 | wait_us(100); |
coisme | 0:92bfc61fb13b | 46 | i2c->stop(); // stop condition |
coisme | 0:92bfc61fb13b | 47 | wait_us(100); |
coisme | 0:92bfc61fb13b | 48 | } |
coisme | 0:92bfc61fb13b | 49 | |
coisme | 0:92bfc61fb13b | 50 | // number of commands |
coisme | 0:92bfc61fb13b | 51 | int n_cmd = sizeof(initSequence)/sizeof(char); |
coisme | 0:92bfc61fb13b | 52 | |
coisme | 0:92bfc61fb13b | 53 | // Execute the initialization sequence. |
coisme | 0:92bfc61fb13b | 54 | for(int i=0; i < n_cmd; i++){ |
coisme | 0:92bfc61fb13b | 55 | char data[2] = {(INSTRUCTION | NOT_CONTINUE), initSequence[i]}; |
coisme | 0:92bfc61fb13b | 56 | if(i2c->write((SLAVE_ADDR << 1), data, 2) != 0){ |
coisme | 0:92bfc61fb13b | 57 | return ERROR_I2C_NO_ACK; |
coisme | 0:92bfc61fb13b | 58 | } |
coisme | 0:92bfc61fb13b | 59 | wait_us(t_wait_us[i]); |
coisme | 0:92bfc61fb13b | 60 | } |
coisme | 0:92bfc61fb13b | 61 | |
coisme | 0:92bfc61fb13b | 62 | return SUCCESS; |
coisme | 0:92bfc61fb13b | 63 | } |
coisme | 0:92bfc61fb13b | 64 | |
coisme | 0:92bfc61fb13b | 65 | St7032i::Status St7032i::setContrast(uint8_t val){ |
coisme | 0:92bfc61fb13b | 66 | const int t_wait_us = 27; // wait time in micro-seconds |
coisme | 0:92bfc61fb13b | 67 | |
coisme | 0:92bfc61fb13b | 68 | // sanity check |
coisme | 0:92bfc61fb13b | 69 | if(MAX_VAL_CONTRAST < val){ |
coisme | 0:92bfc61fb13b | 70 | return INPUT_OUT_OF_RANGE; |
coisme | 0:92bfc61fb13b | 71 | } |
coisme | 0:92bfc61fb13b | 72 | |
coisme | 0:92bfc61fb13b | 73 | char high = (0x54 | ((val & 0x30) >> 4)); |
coisme | 0:92bfc61fb13b | 74 | char low = (0x70 | (val & 0x0F)); |
coisme | 0:92bfc61fb13b | 75 | |
coisme | 0:92bfc61fb13b | 76 | char sequence[] = {0x39, high, low, 0x38}; |
coisme | 0:92bfc61fb13b | 77 | |
coisme | 0:92bfc61fb13b | 78 | // Execute the command sequence |
coisme | 0:92bfc61fb13b | 79 | int n = sizeof(sequence)/sizeof(char); |
coisme | 0:92bfc61fb13b | 80 | for(int i=0; i < n; i++){ |
coisme | 0:92bfc61fb13b | 81 | char data[2] = {(INSTRUCTION | NOT_CONTINUE), sequence[i]}; |
coisme | 0:92bfc61fb13b | 82 | if(i2c->write((SLAVE_ADDR << 1), data, 2) != 0){ |
coisme | 0:92bfc61fb13b | 83 | return ERROR_I2C_NO_ACK; |
coisme | 0:92bfc61fb13b | 84 | } |
coisme | 0:92bfc61fb13b | 85 | wait_us(t_wait_us); |
coisme | 0:92bfc61fb13b | 86 | } |
coisme | 0:92bfc61fb13b | 87 | |
coisme | 0:92bfc61fb13b | 88 | return SUCCESS; |
coisme | 0:92bfc61fb13b | 89 | } |
coisme | 0:92bfc61fb13b | 90 | |
coisme | 0:92bfc61fb13b | 91 | St7032i::Status St7032i::setCursorPosition(uint8_t col, uint8_t row){ |
coisme | 0:92bfc61fb13b | 92 | // sanity check |
coisme | 0:92bfc61fb13b | 93 | if( col > MAX_VAL_COLUMN || row > MAX_VAL_ROW){ |
coisme | 0:92bfc61fb13b | 94 | return INPUT_OUT_OF_RANGE; |
coisme | 0:92bfc61fb13b | 95 | } |
coisme | 0:92bfc61fb13b | 96 | |
coisme | 0:92bfc61fb13b | 97 | char ddramAddr = (0x80 | (((row & 0x01) << 6) | (col & 0x0f))); |
coisme | 0:92bfc61fb13b | 98 | |
coisme | 0:92bfc61fb13b | 99 | char data[2] = {0x00, ddramAddr}; |
coisme | 0:92bfc61fb13b | 100 | if(i2c->write((SLAVE_ADDR << 1), data, 2) != 0){ |
coisme | 0:92bfc61fb13b | 101 | return ERROR_I2C_NO_ACK; |
coisme | 0:92bfc61fb13b | 102 | } |
coisme | 0:92bfc61fb13b | 103 | |
coisme | 0:92bfc61fb13b | 104 | return SUCCESS; |
coisme | 0:92bfc61fb13b | 105 | } |
coisme | 0:92bfc61fb13b | 106 | |
coisme | 0:92bfc61fb13b | 107 | St7032i::Status St7032i::putc(char c){ |
coisme | 0:92bfc61fb13b | 108 | char data[2] = {(NOT_CONTINUE | DATA), c}; |
coisme | 0:92bfc61fb13b | 109 | if(i2c->write((SLAVE_ADDR << 1), data, 2) != 0){ |
coisme | 0:92bfc61fb13b | 110 | return ERROR_I2C_NO_ACK; |
coisme | 0:92bfc61fb13b | 111 | } |
coisme | 0:92bfc61fb13b | 112 | return SUCCESS; |
coisme | 0:92bfc61fb13b | 113 | } |
coisme | 0:92bfc61fb13b | 114 | |
coisme | 0:92bfc61fb13b | 115 | |
coisme | 0:92bfc61fb13b | 116 | St7032i::Status St7032i::clear(bool wait){ |
coisme | 0:92bfc61fb13b | 117 | const int TIME_WAIT = 1080; // in micro-seconds |
coisme | 0:92bfc61fb13b | 118 | char data[2] = {(NOT_CONTINUE | INSTRUCTION), 0x01}; |
coisme | 0:92bfc61fb13b | 119 | if(i2c->write((SLAVE_ADDR << 1), data, 2) != 0){ |
coisme | 0:92bfc61fb13b | 120 | return ERROR_I2C_NO_ACK; |
coisme | 0:92bfc61fb13b | 121 | } |
coisme | 0:92bfc61fb13b | 122 | if(wait){ |
coisme | 0:92bfc61fb13b | 123 | wait_us(TIME_WAIT); |
coisme | 0:92bfc61fb13b | 124 | } |
coisme | 0:92bfc61fb13b | 125 | return SUCCESS; |
coisme | 0:92bfc61fb13b | 126 | } |
coisme | 0:92bfc61fb13b | 127 | |
coisme | 0:92bfc61fb13b | 128 | St7032i::Status St7032i::puts(const char *str, bool wrap){ |
coisme | 0:92bfc61fb13b | 129 | Status st; |
coisme | 0:92bfc61fb13b | 130 | if((st=setCursorPosition(0,0)) != SUCCESS){ |
coisme | 0:92bfc61fb13b | 131 | return st; |
coisme | 0:92bfc61fb13b | 132 | } |
coisme | 0:92bfc61fb13b | 133 | for(int i=0; i < MAX_VAL_ROW; i++){ |
coisme | 0:92bfc61fb13b | 134 | for(int j=0; j < MAX_VAL_COLUMN; j++){ |
coisme | 0:92bfc61fb13b | 135 | char c = str[i*MAX_VAL_COLUMN+j]; |
coisme | 0:92bfc61fb13b | 136 | if(c == '\0'){ |
coisme | 0:92bfc61fb13b | 137 | return SUCCESS; |
coisme | 0:92bfc61fb13b | 138 | } |
coisme | 0:92bfc61fb13b | 139 | putc(c); |
coisme | 0:92bfc61fb13b | 140 | } |
coisme | 0:92bfc61fb13b | 141 | if(wrap){ |
coisme | 0:92bfc61fb13b | 142 | if((st=setCursorPosition(0,1)) != SUCCESS){ |
coisme | 0:92bfc61fb13b | 143 | return st; |
coisme | 0:92bfc61fb13b | 144 | } |
coisme | 0:92bfc61fb13b | 145 | } |
coisme | 0:92bfc61fb13b | 146 | } |
coisme | 0:92bfc61fb13b | 147 | return SUCCESS; |
coisme | 0:92bfc61fb13b | 148 | } |