Yves Roy
/
Semaine3_Lab1_A_247_637
Cegep Limoilou: 247-636
Diff: main.cpp
- Revision:
- 0:e2e3599e7dba
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Sep 10 10:49:37 2021 +0000 @@ -0,0 +1,202 @@ +#include "mbed.h" + +#define TFTWIDTH 240 +#define TFTHEIGHT 320 + +#define TFT_NORTH {SPFD5408_MADCTL_MY | SPFD5408_MADCTL_BGR} +#define TFT_EAST {SPFD5408_MADCTL_MX | SPFD5408_MADCTL_MY | SPFD5408_MADCTL_MV | SPFD5408_MADCTL_BGR} +#define TFT_SOUTH {SPFD5408_MADCTL_MX | SPFD5408_MADCTL_BGR} +#define TFT_WEST {SPFD5408_MADCTL_MV | SPFD5408_MADCTL_BGR} + +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +#define SPFD5408_SOFTRESET 0x01 +#define SPFD5408_SLEEPIN 0x10 +#define SPFD5408_SLEEPOUT 0x11 +#define SPFD5408_NORMALDISP 0x13 +#define SPFD5408_INVERTOFF 0x20 +#define SPFD5408_INVERTON 0x21 +#define SPFD5408_GAMMASET 0x26 +#define SPFD5408_DISPLAYOFF 0x28 +#define SPFD5408_DISPLAYON 0x29 +#define SPFD5408_COLADDRSET 0x2A +#define SPFD5408_PAGEADDRSET 0x2B +#define SPFD5408_MEMORYWRITE 0x2C +#define SPFD5408_PIXELFORMAT 0x3A +#define SPFD5408_FRAMECONTROL 0xB1 +#define SPFD5408_DISPLAYFUNC 0xB6 +#define SPFD5408_ENTRYMODE 0xB7 +#define SPFD5408_POWERCONTROL1 0xC0 +#define SPFD5408_POWERCONTROL2 0xC1 +#define SPFD5408_VCOMCONTROL1 0xC5 +#define SPFD5408_VCOMCONTROL2 0xC7 +#define SPFD5408_MEMCONTROL 0x36 +#define SPFD5408_MADCTL 0x36 +#define SPFD5408_MADCTL_MY 0x80 +#define SPFD5408_MADCTL_MX 0x40 +#define SPFD5408_MADCTL_MV 0x20 +#define SPFD5408_MADCTL_ML 0x10 +#define SPFD5408_MADCTL_RGB 0x00 +#define SPFD5408_MADCTL_BGR 0x08 +#define SPFD5408_MADCTL_MH 0x04 + +#define IDLE 1 +#define ACTIVE 0 +#define COMMAND 0 +#define DATA 1 + +#define TEMPS 40 + +#define LCD_CS A3 +#define LCD_CD A2 +#define LCD_WR A1 +#define LCD_RD A0 +#define LCD_RESET A4 + +DigitalOut pinRD(LCD_RD); //PA_0; +DigitalOut pinWR(LCD_WR); //PA_1; +DigitalOut pinCD(LCD_CD); //PA_4; +DigitalOut pinCS(LCD_CS); //PB_0; +DigitalOut pinReset(LCD_RESET);//PC_1; + + +BusInOut portTFT(D8, D9, D2, D3, D4, D5, D6, D7); + +void WriteCommand(uint8_t c) +{ + pinCD = COMMAND; + pinWR = ACTIVE; + portTFT = c; + pinWR = IDLE; +} + +void WriteData(uint8_t d) +{ + pinCD = DATA; + wait_ms(1); + wait_ms(1); + pinWR = ACTIVE; + wait_ms(1); + portTFT = d; + wait_ms(1); + pinWR = IDLE; + wait_ms(1); +} + +Serial pc(SERIAL_TX, SERIAL_RX); + +DigitalOut myled(LED1); + + + +void begin(void) { + + pinCS = IDLE; + pinCD = DATA; + pinWR = IDLE; + pinRD = IDLE; + portTFT.output(); + + pinReset = ACTIVE; + wait_ms(100); + pinReset = IDLE; + wait_ms(100); + pinCS = ACTIVE; + + WriteCommand(SPFD5408_SOFTRESET); + WriteData(0); + wait_ms(50); + + WriteCommand(SPFD5408_MEMCONTROL); + WriteData(SPFD5408_MADCTL_MY | SPFD5408_MADCTL_BGR); + + WriteCommand(SPFD5408_PIXELFORMAT); + WriteData(0x55); + + WriteCommand(SPFD5408_FRAMECONTROL); + WriteData(0x00); + WriteData(0x1B); + + WriteCommand(SPFD5408_SLEEPOUT); + WriteData(0); + + WriteCommand(SPFD5408_DISPLAYON); + WriteData(0); +} + +void setAddrWindow(int x1, int y1, int x2, int y2) { + pinCS = ACTIVE; + wait_us(TEMPS); + WriteCommand(SPFD5408_COLADDRSET); + WriteData(x1 >> 8); + WriteData(x1); + WriteData(x2 >> 8); + WriteData(x2); + wait_us(TEMPS); + pinCS = IDLE; + + pinCS = ACTIVE; + wait_us(TEMPS); + WriteCommand(SPFD5408_PAGEADDRSET); + WriteData(y1 >> 8); + WriteData(y1); + WriteData(y2 >> 8); + WriteData(y2); + wait_us(TEMPS); + pinCS = IDLE; +} + + +void fillRect(uint16_t x1, uint16_t y1, uint16_t w, uint16_t h, uint16_t fillcolor) { + uint8_t hi, lo; + uint16_t x2, y2; + uint16_t i, j; + + x2 = x1 + w - 1; + y2 = y1 + h - 1; + setAddrWindow(x1, y1, x2, y2); + + hi = fillcolor >> 8; + lo = fillcolor; + + pinCS = ACTIVE; + + WriteCommand(SPFD5408_MEMORYWRITE); + pinCD = DATA; + for (i = h; i > 0; i--) + { + for (j = w; j > 0; j--) + + { + pinWR = ACTIVE; + portTFT = hi; + pinWR = IDLE; + pinWR = ACTIVE; + portTFT = lo; + pinWR = IDLE; + } + } + pinCS = IDLE; +} + + +int main() +{ + begin(); + fillRect(0, 0, 240, 320, BLACK); + fillRect(75, 100, 100, 150, RED); + fillRect(80, 105, 90, 140, YELLOW); + + while(1) + { + } +} + +