#include #include #include #include #define LCD_RD GPIO_PORT(A, 0) #define LCD_WR GPIO_PORT(A, 1) #define LCD_RS GPIO_PORT(A, 4) #define LCD_CS GPIO_PORT(B, 0) #define LCD_RST GPIO_PORT(C, 1) #define LCD_D0 GPIO_PORT(A, 9) #define LCD_D1 GPIO_PORT(C, 7) #define LCD_D2 GPIO_PORT(A, 10) #define LCD_D3 GPIO_PORT(B, 3) #define LCD_D4 GPIO_PORT(B, 5) #define LCD_D5 GPIO_PORT(B, 4) #define LCD_D6 GPIO_PORT(B, 10) #define LCD_D7 GPIO_PORT(A, 8) void dsp_dmode(int mode) { static int old = 0; if (mode != old) { gpio_mode(LCD_D0, mode); gpio_mode(LCD_D1, mode); gpio_mode(LCD_D2, mode); gpio_mode(LCD_D3, mode); gpio_mode(LCD_D4, mode); gpio_mode(LCD_D5, mode); gpio_mode(LCD_D6, mode); gpio_mode(LCD_D7, mode); old = mode; } } // bbbbbggg gggrrrrr uint16_t dsp_color(uint8_t r, uint8_t g, uint8_t b) { r &= 0x1F; g &= 0x3F; b &= 0x1F; uint16_t c = (b << 11) | (g << 5) | r; return c; } void dsp_write_data(uint8_t data) { gpio_dout(LCD_D0, data & 0x01); gpio_dout(LCD_D1, data & 0x02); gpio_dout(LCD_D2, data & 0x04); gpio_dout(LCD_D3, data & 0x08); gpio_dout(LCD_D4, data & 0x10); gpio_dout(LCD_D5, data & 0x20); gpio_dout(LCD_D6, data & 0x40); gpio_dout(LCD_D7, data & 0x80); gpio_dout(LCD_WR, 0); gpio_dout(LCD_WR, 1); } uint8_t dsp_read_data(void) { uint8_t ret = 0; gpio_dout(LCD_RD, 0); ret |= gpio_din(LCD_D0); ret |= gpio_din(LCD_D1) << 1; ret |= gpio_din(LCD_D2) << 2; ret |= gpio_din(LCD_D3) << 3; ret |= gpio_din(LCD_D4) << 4; ret |= gpio_din(LCD_D5) << 5; ret |= gpio_din(LCD_D6) << 6; ret |= gpio_din(LCD_D7) << 7; gpio_dout(LCD_RD, 1); return ret; } void dsp_write_cmd(uint8_t data) { gpio_dout(LCD_RS, 0); dsp_write_data(data); gpio_dout(LCD_RS, 1); } void dsp_set_addr_base(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { dsp_write_cmd(0x2A); dsp_write_data(x1 >> 8); dsp_write_data(x1 & 0xFF); dsp_write_data(x2 >> 8); dsp_write_data(x2 & 0xFF); dsp_write_cmd(0x2B); dsp_write_data(y1 >> 8); dsp_write_data(y1 & 0xFF); dsp_write_data(y2 >> 8); dsp_write_data(y2 & 0xFF); } void dsp_set_addr(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { dsp_set_addr_base(x1, y1, x2, y2); dsp_write_cmd(0x2C); // begin writing } void dsp_set_addr_read(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { dsp_set_addr_base(x1, y1, x2, y2); dsp_write_cmd(0x2E); // begin reading } void dsp_init(void) { gpio_mode(LCD_CS, OUTPUT); gpio_mode(LCD_RS, OUTPUT); gpio_mode(LCD_RD, OUTPUT); gpio_mode(LCD_WR, OUTPUT); gpio_mode(LCD_RST, OUTPUT); dsp_dmode(OUTPUT); gpio_speed(LCD_CS, LOW); gpio_speed(LCD_RS, LOW); gpio_speed(LCD_RD, LOW); gpio_speed(LCD_WR, LOW); gpio_speed(LCD_RST, LOW); gpio_speed(LCD_D0, LOW); gpio_speed(LCD_D1, LOW); gpio_speed(LCD_D2, LOW); gpio_speed(LCD_D3, LOW); gpio_speed(LCD_D4, LOW); gpio_speed(LCD_D5, LOW); gpio_speed(LCD_D6, LOW); gpio_speed(LCD_D7, LOW); gpio_dout(LCD_CS, 0); gpio_dout(LCD_RS, 1); gpio_dout(LCD_RD, 1); gpio_dout(LCD_WR, 1); gpio_dout(LCD_RST, 1); gpio_dout(LCD_D0, 0); gpio_dout(LCD_D1, 0); gpio_dout(LCD_D2, 0); gpio_dout(LCD_D3, 0); gpio_dout(LCD_D4, 0); gpio_dout(LCD_D5, 0); gpio_dout(LCD_D6, 0); gpio_dout(LCD_D7, 0); delay(50); gpio_dout(LCD_RST, 0); delay(15); gpio_dout(LCD_RST, 1); delay(15); dsp_write_cmd(0x01); // soft reset delay(50); dsp_write_cmd(0xD0); // power setting dsp_write_data(0x07); dsp_write_data(0x42); dsp_write_data(0x18); dsp_write_cmd(0xD1); // vcom control dsp_write_data(0x00); dsp_write_data(0x07); dsp_write_data(0x10); dsp_write_cmd(0xD2); // power for normal mode dsp_write_data(0x01); dsp_write_data(0x02); dsp_write_cmd(0xD3); dsp_write_data(0x01); dsp_write_data(0x02); dsp_write_cmd(0xD4); dsp_write_data(0x01); dsp_write_data(0x02); dsp_write_cmd(0xC0); // panel driving setting dsp_write_data(0x10); dsp_write_data(0x3B); dsp_write_data(0x00); dsp_write_data(0x02); dsp_write_data(0x11); dsp_write_cmd(0xC5); // frame rate/inversion ctl dsp_write_data(0x03); dsp_write_cmd(0x36); // rot. and stuff dsp_write_data(0xA3); dsp_write_cmd(0x3A); // set pixel format dsp_write_data(0x55); dsp_write_cmd(0x11); delay(150); dsp_write_cmd(0x29); // set display on delay(500); /*dsp_write_cmd(0x33); // set scroll area dsp_write_data(0x00); dsp_write_data(0x00); dsp_write_data(LCD_HEIGHT >> 8); dsp_write_data((LCD_HEIGHT & 0xFF) - 1); dsp_write_data(0x00); dsp_write_data(0x00); dsp_write_cmd(0x37); dsp_write_data(0x00); dsp_write_data(0x00);*/ }