LCD module Switch Science SKU#1405, which driver IC is ST7032i.

Committer:
coisme
Date:
Sat Jul 01 16:01:37 2017 +0000
Revision:
0:92bfc61fb13b
First commit.

Who changed what in which revision?

UserRevisionLine numberNew 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 }