uint32_t lcd_setbias(uint32_t o) { uint32_t param, w, h; #define MEM_Y (7) //MY row address order #define MEM_X (6) //MX column address order #define MEM_V (5) //MV row / column exchange #define MEM_L (4) //ML vertical refresh order #define MEM_H (2) //MH horizontal refresh order #define MEM_BGR (3) //RGB-BGR Order switch(o) { default: case 0: //case 36: //case 360: w = LCD_WIDTH; h = LCD_HEIGHT; param = (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_Y); break; case 9: case 90: w = LCD_HEIGHT; h = LCD_WIDTH; param = (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_V); break; case 18: case 180: w = LCD_WIDTH; h = LCD_HEIGHT; param = (1<<MEM_BGR) | (1<<MEM_L); break; case 27: case 270: case 14: //270&0xFF w = LCD_HEIGHT; h = LCD_WIDTH; param = (1<<MEM_BGR) | (1<<MEM_Y) | (1<<MEM_V); break; } lcd_enable(); lcd_wrcmd8(LCD_CMD_MEMACCESS_CTRL); lcd_wrdata8(param); lcd_setarea(0, 0, w-1, h-1); lcd_disable(); return (w<<16) | (h<<0); }
void lcd_reset(void) { uint32_t c, i, j; uint8_t initdata[] = { //0x40| 1, LCD_CMD_RESET, //0xC0|60, //0xC0|60, 0x40| 1, LCD_CMD_DISPLAY_OFF, 0xC0|20, 0x40| 1, LCD_CMD_POWER_CTRLB, 0x80| 3, 0x00, 0x83, 0x30, //0x83 0x81 0xAA 0x40| 1, LCD_CMD_POWERON_SEQ_CTRL, 0x80| 4, 0x64, 0x03, 0x12, 0x81, //0x64 0x67 0x40| 1, LCD_CMD_DRV_TIMING_CTRLA, 0x80| 3, 0x85, 0x01, 0x79, //0x79 0x78 0x40| 1, LCD_CMD_POWER_CTRLA, 0x80| 5, 0x39, 0X2C, 0x00, 0x34, 0x02, 0x40| 1, LCD_CMD_PUMP_RATIO_CTRL, 0x80| 1, 0x20, 0x40| 1, LCD_CMD_DRV_TIMING_CTRLB, 0x80| 2, 0x00, 0x00, 0x40| 1, LCD_CMD_POWER_CTRL1, 0x80| 1, 0x26, //0x26 0x25 0x40| 1, LCD_CMD_POWER_CTRL2, 0x80| 1, 0x11, 0x40| 1, LCD_CMD_VCOM_CTRL1, 0x80| 2, 0x35, 0x3E, 0x40| 1, LCD_CMD_VCOM_CTRL2, 0x80| 1, 0xBE, //0xBE 0x94 0x40| 1, LCD_CMD_FRAME_CTRL, 0x80| 2, 0x00, 0x1B, //0x1B 0x70 0x40| 1, LCD_CMD_ENABLE_3G, 0x80| 1, 0x08, //0x08 0x00 0x40| 1, LCD_CMD_GAMMA, 0x80| 1, 0x01, //G2.2 0x40| 1, LCD_CMD_POS_GAMMA, 0x80|15, 0x1F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0x87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00, //0x80|15, 0x0F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0x87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00, 0x40| 1, LCD_CMD_NEG_GAMMA, 0x80|15, 0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x1F, //0x80|15, 0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x0F, 0x40| 1, LCD_CMD_DISPLAY_CTRL, 0x80| 4, 0x0A, 0x82, 0x27, 0x00, 0x40| 1, LCD_CMD_ENTRY_MODE, 0x80| 1, 0x07, 0x40| 1, LCD_CMD_PIXEL_FORMAT, 0x80| 1, 0x55, //16bit 0x40| 1, LCD_CMD_MEMACCESS_CTRL, 0x80| 1, (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_Y), 0x40| 1, LCD_CMD_COLUMN, 0x80| 2, 0x00, 0x00, 0x80| 2, ((LCD_HEIGHT-1)>>8)&0xFF, (LCD_HEIGHT-1)&0xFF, 0x40| 1, LCD_CMD_PAGE, 0x80| 2, 0x00, 0x00, 0x80| 2, ((LCD_WIDTH-1)>>8)&0xFF, (LCD_WIDTH-1)&0xFF, 0x40| 1, LCD_CMD_SLEEPOUT, 0xC0|60, 0xC0|60, 0x40| 1, LCD_CMD_DISPLAY_ON, 0xC0|20, }; //init pins INIT_PINS(); //hardware reset GPIO_CLRPIN(LCD_PORT, RST_PIN); delay_ms(20); GPIO_SETPIN(LCD_PORT, RST_PIN); delay_ms(120); lcd_enable(); //send init commands and data for(i=0; i<sizeof(initdata);) { c = initdata[i++]; switch(c&0xC0) { case 0x40: //command for(j=c&0x3F; j!=0; j--) { c = initdata[i++]; lcd_wrcmd8(c); } break; case 0x80: //data for(j=c&0x3F; j!=0; j--) { c = initdata[i++]; lcd_wrdata8(c); } break; case 0xC0: //delay delay_ms(c&0x3F); break; } } //clear display buffer lcd_drawstart(); for(i=(LCD_WIDTH*LCD_HEIGHT); i!=0; i--) { lcd_draw(0); } lcd_drawstop(); lcd_disable(); return; }
void lcd_init() { const uint8_t MEM_BGR = 3; const uint8_t MEM_X = 6; const uint8_t MEM_Y = 7; uint8_t init_sequence[] = { VCMD_COMMAND | 1, LCD_CMD_RESET, VCMD_SLEEP |20, VCMD_COMMAND | 1, LCD_CMD_DISPLAY_OFF, VCMD_SLEEP |20, VCMD_COMMAND | 1, LCD_CMD_POWER_CTRLB, VCMD_DATA | 3, 0x00, 0x83, 0x30, //0x83 0x81 0xAA VCMD_COMMAND | 1, LCD_CMD_POWERON_SEQ_CTRL, VCMD_DATA | 4, 0x64, 0x03, 0x12, 0x81, //0x64 0x67 VCMD_COMMAND | 1, LCD_CMD_DRV_TIMING_CTRLA, VCMD_DATA | 3, 0x85, 0x01, 0x79, //0x79 0x78 VCMD_COMMAND | 1, LCD_CMD_POWER_CTRLA, VCMD_DATA | 5, 0x39, 0X2C, 0x00, 0x34, 0x02, VCMD_COMMAND | 1, LCD_CMD_PUMP_RATIO_CTRL, VCMD_DATA | 1, 0x20, VCMD_COMMAND | 1, LCD_CMD_DRV_TIMING_CTRLB, VCMD_DATA | 2, 0x00, 0x00, VCMD_COMMAND | 1, LCD_CMD_POWER_CTRL1, VCMD_DATA | 1, 0x26, //0x26 0x25 VCMD_COMMAND | 1, LCD_CMD_POWER_CTRL2, VCMD_DATA | 1, 0x11, VCMD_COMMAND | 1, LCD_CMD_VCOM_CTRL1, VCMD_DATA | 2, 0x35, 0x3E, VCMD_COMMAND | 1, LCD_CMD_VCOM_CTRL2, VCMD_DATA | 1, 0xBE, //0xBE 0x94 VCMD_COMMAND | 1, LCD_CMD_FRAME_CTRL, VCMD_DATA | 2, 0x00, 0x1B, //0x1B 0x70 VCMD_COMMAND | 1, LCD_CMD_ENABLE_3G, VCMD_DATA | 1, 0x08, //0x08 0x00 VCMD_COMMAND | 1, LCD_CMD_GAMMA, VCMD_DATA | 1, 0x01, //G2.2 VCMD_COMMAND | 1, LCD_CMD_POS_GAMMA, VCMD_DATA |15, 0x1F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0x87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00, VCMD_COMMAND | 1, LCD_CMD_NEG_GAMMA, VCMD_DATA |15, 0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x1F, VCMD_COMMAND | 1, LCD_CMD_DISPLAY_CTRL, VCMD_DATA | 4, 0x0A, 0x82, 0x27, 0x00, VCMD_COMMAND | 1, LCD_CMD_ENTRY_MODE, VCMD_DATA | 1, 0x07, VCMD_COMMAND | 1, LCD_CMD_PIXEL_FORMAT, VCMD_DATA | 1, 0x55, //16bit VCMD_COMMAND | 1, LCD_CMD_MEMACCESS_CTRL, VCMD_DATA | 1, (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_Y), VCMD_COMMAND | 1, LCD_CMD_COLUMN, VCMD_DATA | 2, 0x00, 0x00, VCMD_DATA | 2, ((LCD_HEIGHT-1)>>8)&0xFF, (LCD_HEIGHT-1)&0xFF, VCMD_COMMAND | 1, LCD_CMD_PAGE, VCMD_DATA | 2, 0x00, 0x00, VCMD_DATA | 2, ((LCD_WIDTH-1)>>8)&0xFF, (LCD_WIDTH-1)&0xFF, VCMD_COMMAND | 1, LCD_CMD_SLEEPOUT, VCMD_SLEEP |60, VCMD_SLEEP |60, VCMD_COMMAND | 1, LCD_CMD_DISPLAY_ON, VCMD_SLEEP |20, }; DISABLE_IRQ(); // initialize pins IOCON_PIO2_0 &= ~IOCON_PIO2_0_FUNC_MASK; IOCON_PIO2_1 &= ~IOCON_PIO2_1_FUNC_MASK; IOCON_PIO2_2 &= ~IOCON_PIO2_2_FUNC_MASK; IOCON_PIO2_3 &= ~IOCON_PIO2_3_FUNC_MASK; IOCON_PIO2_4 &= ~IOCON_PIO2_4_FUNC_MASK; IOCON_PIO2_5 &= ~IOCON_PIO2_5_FUNC_MASK; IOCON_PIO2_6 &= ~IOCON_PIO2_6_FUNC_MASK; IOCON_PIO2_7 &= ~IOCON_PIO2_7_FUNC_MASK; IOCON_PIO2_8 &= ~IOCON_PIO2_8_FUNC_MASK; IOCON_PIO2_9 &= ~IOCON_PIO2_9_FUNC_MASK; IOCON_PIO2_10 &= ~IOCON_PIO2_10_FUNC_MASK; IOCON_PIO2_11 &= ~IOCON_PIO2_11_FUNC_MASK; IOCON_PIO3_5 &= ~IOCON_PIO3_5_FUNC_MASK; // set all 12 pins to output mode GPIO_GPIO2DIR |= 0xFFF; // set all pins high LCD_GPIO |= 0xFFF; // set pin 5 of gpio 3 to output mode GPIO_GPIO3DIR |= LCD_RD_MASK; GPIO_GPIO3DATA |= LCD_RD_MASK; ENABLE_IRQ(); // trigger hard-reset LCD_MASKED_GPIO(LCD_RST_MASK, 0); delay_ms(20); LCD_MASKED_GPIO(LCD_RST_MASK, LCD_RST_MASK); delay_ms(120); lcd_enable(); delay_ms(1); for (unsigned int i = 0; i < sizeof(init_sequence);) { uint8_t instruction = init_sequence[i++]; switch (instruction & 0xC0) { case VCMD_COMMAND: { //~ printf("cmd 0x%02x", instruction & 0x3f); for (int j = (instruction & 0x3f); j > 0; j--) { uint8_t data = init_sequence[i++]; //~ printf(" 0x%02x", data); lcd_wrcmd8(data); } //~ printf("\n"); break; } case VCMD_DATA: { //~ printf("data 0x%02x\n", instruction & 0x3f); for (int j = (instruction & 0x3f); j > 0; j--) { uint8_t data = init_sequence[i++]; //~ printf(" 0x%02x", data); lcd_wrdata8(data); } //~ printf("\n"); break; } case VCMD_SLEEP: { //~ printf("sleep %d\n", instruction & 0x3f); delay_ms(instruction & 0x3f); break; } default: // cannot happen :) continue; }; } lcd_drawstart(); for (int i = (LCD_WIDTH*LCD_HEIGHT/8); i > 0; i--) { lcd_draw(0); lcd_draw(0); lcd_draw(0); lcd_draw(0); lcd_draw(0); lcd_draw(0); lcd_draw(0); lcd_draw(0); } lcd_drawstop(); lcd_disable(); }