A lib for accessing ST7626 based lcds. It provides a set_pixel function. It is only tested with one display.
lcd.c@2:04fb8af3ecb0, 2011-01-08 (annotated)
- Committer:
- nullsub
- Date:
- Sat Jan 08 22:28:13 2011 +0000
- Revision:
- 2:04fb8af3ecb0
- Parent:
- 1:ae0b4880e9db
- Child:
- 3:5b7d04c36d1a
did some cleanin...
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nullsub | 0:9b24f296bc0e | 1 | #ifndef lcd_c |
nullsub | 0:9b24f296bc0e | 2 | #define lcd_c lcd_c |
nullsub | 0:9b24f296bc0e | 3 | #include "lcd.h" |
nullsub | 0:9b24f296bc0e | 4 | |
nullsub | 1:ae0b4880e9db | 5 | #ifdef LCD_BACKLIGHT_LED |
nullsub | 0:9b24f296bc0e | 6 | DigitalOut lcd_led(LCD_LED); |
nullsub | 1:ae0b4880e9db | 7 | #endif |
nullsub | 1:ae0b4880e9db | 8 | |
nullsub | 0:9b24f296bc0e | 9 | DigitalOut lcd_a0(LCD_A0); |
nullsub | 0:9b24f296bc0e | 10 | DigitalOut lcd_cs(LCD_CS); |
nullsub | 0:9b24f296bc0e | 11 | DigitalOut lcd_wr(LCD_WR); |
nullsub | 0:9b24f296bc0e | 12 | DigitalOut lcd_reset(LCD_RESET); |
nullsub | 0:9b24f296bc0e | 13 | |
nullsub | 0:9b24f296bc0e | 14 | PortOut lcd_data_l(LCD_DATA_PORT_L, LCD_DATA_PORT_MASK_L); |
nullsub | 0:9b24f296bc0e | 15 | PortOut lcd_data_h(LCD_DATA_PORT_H, LCD_DATA_PORT_MASK_H); |
nullsub | 0:9b24f296bc0e | 16 | |
nullsub | 0:9b24f296bc0e | 17 | ////////////////////////////////////////////////////////////////////////// |
nullsub | 0:9b24f296bc0e | 18 | void LoadPaint(void) { |
nullsub | 0:9b24f296bc0e | 19 | Write(COMMAND, 0x31); // Ext = 1 |
nullsub | 0:9b24f296bc0e | 20 | Write(COMMAND, 0x20); // Palette FRC1 Setup |
nullsub | 0:9b24f296bc0e | 21 | Write(DATA, 0x00); // RGB Level0 Setup |
nullsub | 0:9b24f296bc0e | 22 | Write(DATA, 0x02); // RGB Level1 Setup |
nullsub | 0:9b24f296bc0e | 23 | Write(DATA, 0x04); // RGB Level2 Setup |
nullsub | 0:9b24f296bc0e | 24 | Write(DATA, 0x06); // RGB Level3 Setup |
nullsub | 0:9b24f296bc0e | 25 | Write(DATA, 0x08); // RGB Level4 Setup |
nullsub | 0:9b24f296bc0e | 26 | Write(DATA, 0x0A); // RGB Level5 Setup |
nullsub | 0:9b24f296bc0e | 27 | Write(DATA, 0x0C); // RGB Level6 Setup |
nullsub | 0:9b24f296bc0e | 28 | Write(DATA, 0x0E); // RGB Level7 Setup |
nullsub | 0:9b24f296bc0e | 29 | Write(DATA, 0x10); // RGB Level8 Setup |
nullsub | 0:9b24f296bc0e | 30 | Write(DATA, 0x12); // RGB Level9 Setup |
nullsub | 0:9b24f296bc0e | 31 | Write(DATA, 0x14); // RGB Level10 Setup |
nullsub | 0:9b24f296bc0e | 32 | Write(DATA, 0x16); // RGB Level11 Setup |
nullsub | 0:9b24f296bc0e | 33 | Write(DATA, 0x18); // RGB Level12 Setup |
nullsub | 0:9b24f296bc0e | 34 | Write(DATA, 0x1A); // RGB Level13 Setup |
nullsub | 0:9b24f296bc0e | 35 | Write(DATA, 0x1C); // RGB Level14 Setup |
nullsub | 0:9b24f296bc0e | 36 | Write(DATA, 0x1E); // RGB Level15 Setup |
nullsub | 0:9b24f296bc0e | 37 | |
nullsub | 0:9b24f296bc0e | 38 | Write(COMMAND, 0x21); // Palette FRC2 Setup |
nullsub | 0:9b24f296bc0e | 39 | Write(DATA, 0x00); // RGB Level0 Setup |
nullsub | 0:9b24f296bc0e | 40 | Write(DATA, 0x02); // RGB Level1 Setup |
nullsub | 0:9b24f296bc0e | 41 | Write(DATA, 0x04); // RGB Level2 Setup |
nullsub | 0:9b24f296bc0e | 42 | Write(DATA, 0x06); // RGB Level3 Setup |
nullsub | 0:9b24f296bc0e | 43 | Write(DATA, 0x08); // RGB Level4 Setup |
nullsub | 0:9b24f296bc0e | 44 | Write(DATA, 0x0A); // RGB Level5 Setup |
nullsub | 0:9b24f296bc0e | 45 | Write(DATA, 0x0C); // RGB Level6 Setup |
nullsub | 0:9b24f296bc0e | 46 | Write(DATA, 0x0E); // RGB Level7 Setup |
nullsub | 0:9b24f296bc0e | 47 | Write(DATA, 0x10); // RGB Level8 Setup |
nullsub | 0:9b24f296bc0e | 48 | Write(DATA, 0x12); // RGB Level9 Setup |
nullsub | 0:9b24f296bc0e | 49 | Write(DATA, 0x14); // RGB Level10 Setup |
nullsub | 0:9b24f296bc0e | 50 | Write(DATA, 0x16); // RGB Level11 Setup |
nullsub | 0:9b24f296bc0e | 51 | Write(DATA, 0x18); // RGB Level12 Setup |
nullsub | 0:9b24f296bc0e | 52 | Write(DATA, 0x1A); // RGB Level13 Setup |
nullsub | 0:9b24f296bc0e | 53 | Write(DATA, 0x1C); // RGB Level14 Setup |
nullsub | 0:9b24f296bc0e | 54 | Write(DATA, 0x1E); // RGB Level15 Setup |
nullsub | 0:9b24f296bc0e | 55 | |
nullsub | 0:9b24f296bc0e | 56 | Write(COMMAND, 0x22); // Palette FRC3 Setup |
nullsub | 0:9b24f296bc0e | 57 | Write(DATA, 0x00); // RGB Level0 Setup |
nullsub | 0:9b24f296bc0e | 58 | Write(DATA, 0x02); // RGB Level1 Setup |
nullsub | 0:9b24f296bc0e | 59 | Write(DATA, 0x04); // RGB Level2 Setup |
nullsub | 0:9b24f296bc0e | 60 | Write(DATA, 0x06); // RGB Level3 Setup |
nullsub | 0:9b24f296bc0e | 61 | Write(DATA, 0x08); // RGB Level4 Setup |
nullsub | 0:9b24f296bc0e | 62 | Write(DATA, 0x0A); // RGB Level5 Setup |
nullsub | 0:9b24f296bc0e | 63 | Write(DATA, 0x0C); // RGB Level6 Setup |
nullsub | 0:9b24f296bc0e | 64 | Write(DATA, 0x0E); // RGB Level7 Setup |
nullsub | 0:9b24f296bc0e | 65 | Write(DATA, 0x10); // RGB Level8 Setup |
nullsub | 0:9b24f296bc0e | 66 | Write(DATA, 0x12); // RGB Level9 Setup |
nullsub | 0:9b24f296bc0e | 67 | Write(DATA, 0x14); // RGB Level10 Setup |
nullsub | 0:9b24f296bc0e | 68 | Write(DATA, 0x16); // RGB Level11 Setup |
nullsub | 0:9b24f296bc0e | 69 | Write(DATA, 0x18); // RGB Level12 Setup |
nullsub | 0:9b24f296bc0e | 70 | Write(DATA, 0x1A); // RGB Level13 Setup |
nullsub | 0:9b24f296bc0e | 71 | Write(DATA, 0x1C); // RGB Level14 Setup |
nullsub | 0:9b24f296bc0e | 72 | Write(DATA, 0x1E); // RGB Level15 Setup |
nullsub | 0:9b24f296bc0e | 73 | |
nullsub | 0:9b24f296bc0e | 74 | Write(COMMAND, 0x23); // Palette FRC4 Setup |
nullsub | 0:9b24f296bc0e | 75 | Write(DATA, 0x00); // RGB Level0 Setup |
nullsub | 0:9b24f296bc0e | 76 | Write(DATA, 0x02); // RGB Level1 Setup |
nullsub | 0:9b24f296bc0e | 77 | Write(DATA, 0x04); // RGB Level2 Setup |
nullsub | 0:9b24f296bc0e | 78 | Write(DATA, 0x06); // RGB Level3 Setup |
nullsub | 0:9b24f296bc0e | 79 | Write(DATA, 0x08); // RGB Level4 Setup |
nullsub | 0:9b24f296bc0e | 80 | Write(DATA, 0x0A); // RGB Level5 Setup |
nullsub | 0:9b24f296bc0e | 81 | Write(DATA, 0x0C); // RGB Level6 Setup |
nullsub | 0:9b24f296bc0e | 82 | Write(DATA, 0x0E); // RGB Level7 Setup |
nullsub | 0:9b24f296bc0e | 83 | Write(DATA, 0x10); // RGB Level8 Setup |
nullsub | 0:9b24f296bc0e | 84 | Write(DATA, 0x12); // RGB Level9 Setup |
nullsub | 0:9b24f296bc0e | 85 | Write(DATA, 0x14); // RGB Level10 Setup |
nullsub | 0:9b24f296bc0e | 86 | Write(DATA, 0x16); // RGB Level11 Setup |
nullsub | 0:9b24f296bc0e | 87 | Write(DATA, 0x18); // RGB Level12 Setup |
nullsub | 0:9b24f296bc0e | 88 | Write(DATA, 0x1A); // RGB Level13 Setup |
nullsub | 0:9b24f296bc0e | 89 | Write(DATA, 0x1C); // RGB Level14 Setup |
nullsub | 0:9b24f296bc0e | 90 | Write(DATA, 0x1E); // RGB Level15 Setup |
nullsub | 0:9b24f296bc0e | 91 | Write(COMMAND, 0x30); // Ext = 0 |
nullsub | 0:9b24f296bc0e | 92 | } |
nullsub | 0:9b24f296bc0e | 93 | |
nullsub | 0:9b24f296bc0e | 94 | void LoadEEPROM(void) { |
nullsub | 0:9b24f296bc0e | 95 | Write(COMMAND, 0x31); // Ext = 1 |
nullsub | 0:9b24f296bc0e | 96 | Write(COMMAND, 0xcd); // Enable EEPROM |
nullsub | 0:9b24f296bc0e | 97 | Write(DATA, 0x00); // |
nullsub | 0:9b24f296bc0e | 98 | wait_ms(50); // Delay 50ms |
nullsub | 0:9b24f296bc0e | 99 | Write(COMMAND, 0xfd); // Load EEPROM |
nullsub | 0:9b24f296bc0e | 100 | wait_ms(50); // Delay 50ms |
nullsub | 0:9b24f296bc0e | 101 | Write(COMMAND, 0xcc); // Disable EEPROM |
nullsub | 0:9b24f296bc0e | 102 | Write(COMMAND, 0x30); // Ext = 0 |
nullsub | 0:9b24f296bc0e | 103 | } |
nullsub | 0:9b24f296bc0e | 104 | |
nullsub | 0:9b24f296bc0e | 105 | void ST7626_Init(void) { |
nullsub | 0:9b24f296bc0e | 106 | lcd_cs = 1; |
nullsub | 1:ae0b4880e9db | 107 | /* lcd_reset = 0; |
nullsub | 1:ae0b4880e9db | 108 | wait_ms(10); |
nullsub | 1:ae0b4880e9db | 109 | lcd_reset = 1; |
nullsub | 1:ae0b4880e9db | 110 | wait_ms(50);*/ |
nullsub | 0:9b24f296bc0e | 111 | resetdisp(); |
nullsub | 0:9b24f296bc0e | 112 | |
nullsub | 0:9b24f296bc0e | 113 | Write(COMMAND, 0x30); // Ext = 0 |
nullsub | 0:9b24f296bc0e | 114 | Write(COMMAND, 0x04); // Sleep In/Out Preparation |
nullsub | 0:9b24f296bc0e | 115 | Write(DATA, 0x3e); // Sleep In/Out Sequencing |
nullsub | 0:9b24f296bc0e | 116 | Write(COMMAND, 0x31); // Ext = 1 |
nullsub | 0:9b24f296bc0e | 117 | Write(COMMAND, 0xf4); // Internal Initialize Preparation |
nullsub | 0:9b24f296bc0e | 118 | Write(DATA, 0x58); // Internal Initialize Sequencing |
nullsub | 0:9b24f296bc0e | 119 | Write(COMMAND, 0x30); // Ext = 0 |
nullsub | 0:9b24f296bc0e | 120 | Write(COMMAND, 0x94); // Sleep Out |
nullsub | 0:9b24f296bc0e | 121 | Write(COMMAND, 0xd1); // Internal OSC on |
nullsub | 0:9b24f296bc0e | 122 | Write(COMMAND, 0xca); // Display Control |
nullsub | 0:9b24f296bc0e | 123 | Write(DATA, 0x00); // CL divisions Ratio |
nullsub | 0:9b24f296bc0e | 124 | Write(DATA, 0x10); // Duty Setting (= 68) |
nullsub | 0:9b24f296bc0e | 125 | Write(DATA, 0x00); // N-Line Inverse-set value |
nullsub | 0:9b24f296bc0e | 126 | Write(COMMAND, 0x31); // Ext = 1 |
nullsub | 0:9b24f296bc0e | 127 | Write(COMMAND, 0x32); // Analog Setting |
nullsub | 0:9b24f296bc0e | 128 | Write(DATA, 0x00); // OSC Freqency adjustment |
nullsub | 0:9b24f296bc0e | 129 | Write(DATA, 0x02); // Booster Efficiency Setting = Level 3 |
nullsub | 0:9b24f296bc0e | 130 | Write(DATA, 0x03); // Bias Setting (=1/9) |
nullsub | 0:9b24f296bc0e | 131 | Write(DATA, 0x04); // Booster X 5 |
nullsub | 0:9b24f296bc0e | 132 | Write(COMMAND, 0x30); // Ext = 0 |
nullsub | 0:9b24f296bc0e | 133 | Write(COMMAND, 0x81); // Electronic Volume Control |
nullsub | 1:ae0b4880e9db | 134 | Write(DATA, 0x1d); // EV:Vop[5:0]_6bit //previously Write(DATA,0x2D); |
nullsub | 0:9b24f296bc0e | 135 | Write(DATA, 0x02); // EV:Vop[8:6]_3bit |
nullsub | 0:9b24f296bc0e | 136 | // Vop is 10.52V under this condition for example |
nullsub | 0:9b24f296bc0e | 137 | Write( COMMAND, 0x20); // Power Control |
nullsub | 0:9b24f296bc0e | 138 | Write( DATA, 0x0b); // B/F/R = On/On/On |
nullsub | 0:9b24f296bc0e | 139 | wait_ms(50); // Delay 50ms |
nullsub | 0:9b24f296bc0e | 140 | LoadEEPROM(); // Load EEPROM (refer page 68) |
nullsub | 0:9b24f296bc0e | 141 | LoadPaint(); // Load Gamma Table Parameter (refer page 64) |
nullsub | 0:9b24f296bc0e | 142 | Write(COMMAND, 0x30); // Ext = 0 |
nullsub | 0:9b24f296bc0e | 143 | Write(COMMAND, 0xa7); // Inverse Display |
nullsub | 0:9b24f296bc0e | 144 | Write(COMMAND, 0xbb); // Com Scan Direction |
nullsub | 0:9b24f296bc0e | 145 | Write(DATA, 0x01); // 0~33 / 67~34 |
nullsub | 0:9b24f296bc0e | 146 | Write(COMMAND, 0xbc); // Data Scan Direction |
nullsub | 0:9b24f296bc0e | 147 | Write(DATA, 0x00); // Page / Column Address Setting |
nullsub | 0:9b24f296bc0e | 148 | Write(DATA, 0x00); // RGB arrangement (0:RGB 1:BGR) |
nullsub | 0:9b24f296bc0e | 149 | Write(DATA, 0x01); // Gray-scale setup ( 64-gray: 01H) |
nullsub | 0:9b24f296bc0e | 150 | Write(COMMAND, 0x75); // Page address set |
nullsub | 0:9b24f296bc0e | 151 | Write(DATA, 0x00); // From page address 0 |
nullsub | 0:9b24f296bc0e | 152 | Write(DATA, 0x43); // to page address 67 |
nullsub | 0:9b24f296bc0e | 153 | Write(COMMAND, 0x15); // Column address set |
nullsub | 0:9b24f296bc0e | 154 | Write(DATA, 0x00); // From column address 0 |
nullsub | 0:9b24f296bc0e | 155 | Write(DATA, 0x5f); // to column address 97 |
nullsub | 0:9b24f296bc0e | 156 | Write(COMMAND, 0xaf); // Display On |
nullsub | 0:9b24f296bc0e | 157 | Write(COMMAND, 0x30); // Ext = 0 |
nullsub | 1:ae0b4880e9db | 158 | #ifdef LCD_BACKLIGHT_LED |
nullsub | 0:9b24f296bc0e | 159 | lcd_led = 1; |
nullsub | 1:ae0b4880e9db | 160 | #endif |
nullsub | 0:9b24f296bc0e | 161 | } |
nullsub | 0:9b24f296bc0e | 162 | |
nullsub | 0:9b24f296bc0e | 163 | |
nullsub | 2:04fb8af3ecb0 | 164 | void lcd_putpixel( int x, int y, int16_t color { |
nullsub | 1:ae0b4880e9db | 165 | Write(COMMAND, 0x30); // Ext = 0 |
nullsub | 1:ae0b4880e9db | 166 | Write(COMMAND, 0x15); // Column address set |
nullsub | 1:ae0b4880e9db | 167 | Write(DATA, x); // From column address 0 to 97 |
nullsub | 1:ae0b4880e9db | 168 | Write(DATA, x+1 ); |
nullsub | 1:ae0b4880e9db | 169 | Write(COMMAND, 0x75); // Page address set |
nullsub | 1:ae0b4880e9db | 170 | Write(DATA, y); // From page address 0 to 67 |
nullsub | 1:ae0b4880e9db | 171 | Write(DATA, y+1); |
nullsub | 1:ae0b4880e9db | 172 | Write(COMMAND, 0x5c); // Entry Memory Write Mode |
nullsub | 1:ae0b4880e9db | 173 | |
nullsub | 1:ae0b4880e9db | 174 | Write(DATA, (int8_t)(color&0xFF)); |
nullsub | 1:ae0b4880e9db | 175 | Write(DATA, (int8_t)((color>>8)&0xFF)); |
nullsub | 1:ae0b4880e9db | 176 | } |
nullsub | 1:ae0b4880e9db | 177 | |
nullsub | 1:ae0b4880e9db | 178 | |
nullsub | 1:ae0b4880e9db | 179 | |
nullsub | 1:ae0b4880e9db | 180 | |
nullsub | 1:ae0b4880e9db | 181 | void LCD_clear(int16_t GroundColor) { |
nullsub | 0:9b24f296bc0e | 182 | //Display schwarz malen f�r Schrift Vorbereitung |
nullsub | 0:9b24f296bc0e | 183 | unsigned char i, j; |
nullsub | 0:9b24f296bc0e | 184 | Write(COMMAND, 0x30); // Ext = 0 |
nullsub | 0:9b24f296bc0e | 185 | Write(COMMAND, 0x15); // Column address set |
nullsub | 0:9b24f296bc0e | 186 | Write(DATA, 0); // From column address 0 to 97 |
nullsub | 0:9b24f296bc0e | 187 | Write(DATA, 97 ); |
nullsub | 0:9b24f296bc0e | 188 | Write(COMMAND, 0x75); // Page address set |
nullsub | 0:9b24f296bc0e | 189 | Write(DATA, 0); // From page address 0 to 67 |
nullsub | 0:9b24f296bc0e | 190 | Write(DATA, 67); |
nullsub | 0:9b24f296bc0e | 191 | Write(COMMAND, 0x5c); // Entry Memory Write Mode |
nullsub | 0:9b24f296bc0e | 192 | |
nullsub | 0:9b24f296bc0e | 193 | |
nullsub | 0:9b24f296bc0e | 194 | for (j = 0; j < 68 ; j++) { |
nullsub | 0:9b24f296bc0e | 195 | for (i = 0 ; i < 98 ; i++) { |
nullsub | 0:9b24f296bc0e | 196 | Write(DATA, GroundColor); |
nullsub | 1:ae0b4880e9db | 197 | Write(DATA, GroundColor>>8); |
nullsub | 0:9b24f296bc0e | 198 | } |
nullsub | 0:9b24f296bc0e | 199 | } |
nullsub | 0:9b24f296bc0e | 200 | } |
nullsub | 0:9b24f296bc0e | 201 | |
nullsub | 1:ae0b4880e9db | 202 | void Write(unsigned char mode, int8_t data) { |
nullsub | 0:9b24f296bc0e | 203 | if (mode) { |
nullsub | 0:9b24f296bc0e | 204 | lcd_a0 = 1; // LCD_PORT_COM |= (1<<LCD_A0);//A0=1; |
nullsub | 0:9b24f296bc0e | 205 | } else { |
nullsub | 0:9b24f296bc0e | 206 | lcd_a0 = 0; //LCD_PORT_COM &= ~(1<<LCD_A0);//A0=0; |
nullsub | 0:9b24f296bc0e | 207 | } |
nullsub | 0:9b24f296bc0e | 208 | |
nullsub | 0:9b24f296bc0e | 209 | lcd_data_l = data << 23; //low nibble |
nullsub | 0:9b24f296bc0e | 210 | lcd_data_h = data >> 0x04; //high nibble |
nullsub | 0:9b24f296bc0e | 211 | |
nullsub | 0:9b24f296bc0e | 212 | lcd_cs = 0; // LCD_PORT_COM &= ~(1<<LCD_CS);//CS=0; |
nullsub | 0:9b24f296bc0e | 213 | lcd_wr = 0; //LCD_PORT_COM &= ~(1<<LCD_WR);//WR=0; |
nullsub | 0:9b24f296bc0e | 214 | wait_us(1); //FIXME: look it up in the datasheet!!! |
nullsub | 0:9b24f296bc0e | 215 | lcd_wr = 1; //LCD_PORT_COM |= (1<<LCD_WR);//WR=1; |
nullsub | 0:9b24f296bc0e | 216 | lcd_cs = 1; //LCD_PORT_COM |= (1<<LCD_CS);//CS=1; |
nullsub | 0:9b24f296bc0e | 217 | wait_us(1); |
nullsub | 0:9b24f296bc0e | 218 | } |
nullsub | 0:9b24f296bc0e | 219 | |
nullsub | 0:9b24f296bc0e | 220 | void resetdisp(void) { |
nullsub | 0:9b24f296bc0e | 221 | lcd_reset = 1; // LCD_PORT_COM |= (1<<LCD_RESET); |
nullsub | 0:9b24f296bc0e | 222 | wait_us(1); |
nullsub | 0:9b24f296bc0e | 223 | lcd_reset = 0; //LCD_PORT_COM &= ~(1<<LCD_RESET); |
nullsub | 0:9b24f296bc0e | 224 | wait_us(1); |
nullsub | 0:9b24f296bc0e | 225 | lcd_reset = 1; //LCD_PORT_COM |= (1<<LCD_RESET); |
nullsub | 0:9b24f296bc0e | 226 | wait_us(1); |
nullsub | 0:9b24f296bc0e | 227 | } |
nullsub | 0:9b24f296bc0e | 228 | |
nullsub | 0:9b24f296bc0e | 229 | |
nullsub | 0:9b24f296bc0e | 230 | |
nullsub | 0:9b24f296bc0e | 231 | #endif |