Yves Roy
/
247-436-M1-S1-LAB-1
Programme utilisé lors du premier laboratoire 247-436
Revision 0:37eb67c8ebd0, committed 2018-01-26
- Comitter:
- YROY2004
- Date:
- Fri Jan 26 13:56:42 2018 +0000
- Commit message:
- Version originale
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r 37eb67c8ebd0 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Jan 26 13:56:42 2018 +0000 @@ -0,0 +1,493 @@ +#include "mbed.h" +//options de compilation +//#define TEST + + +#define TFT_SPDF5408 + +//intégration +// représentation +// G: gauche, D: droit, H: haut, B: bas +// E: écran, T: touch +// Ecran: +// (XE_G,YE_H) ___ (XE_D,YE_H) +// | | +// | | +// (XE_G,YE_B) |___| (XE_G,YE_B) +// +// représentation du touch +// (XT_G,YT_H) ___ (XT_D,YT_H) +// | | +// | | +// (XT_G,YT_B) |___| (XT_G,YT_B) + +// équations pour conversion +// XT: x touch lu, YT: y touch lu, XE: x ecran, YE: y ecran +// XE = (XE_D - XE_G)/(XT_D - XT_G)*(XT - XT_G) + XE_G +// YE = (YE_H - YE_B)/(YT_H - YT_B)*(YT - YT_G) + YE_G + +// l'application présente 3 boutons et une surface de dessin +// bouton noir: effacer +// bouton rouge: dessiner en rouge +// bouton blanc: dessiner en blanc + +//touchscreen +#define IDLE 1 +#define ACTIVE 0 +#define COMMAND 0 +#define DATA 1 + +#ifdef TFT_SPDF5408 +#define YP A3 +#define XM A2 +#define YM D9 +#define XP D8 +#endif + +#ifdef MON_TFT +#define YP A1 // must be an analog pin, use "An" notation! +#define YM D7 // can be a digital pin +#define XP D6 // can be a digital pin +#define XM A2 // must be an analog pin, use "An" notation! +#endif + +#define TOUCH_SEUIL_HAUT 3000 +#define TOUCH_SEUIL_BAS 16 + + +//tftspfd5408 +#define TFTWIDTH 240 +#define TFTHEIGHT 320 + +#define LCD_CS A3 +#define LCD_CD A2 +#define LCD_WR A1 +#define LCD_RD A0 +#define LCD_RESET A4 + +#define TFT_NORTH SPFD5408_MADCTL_MY | SPFD5408_MADCTL_BGR + +#if 0 +#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} +#endif + +#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_SLEEPOUT 0x11 + +#if 0 +#define SPFD5408_SLEEPIN 0x10 +#define SPFD5408_NORMALDISP 0x13 +#define SPFD5408_INVERTOFF 0x20 +#define SPFD5408_INVERTON 0x21 +#define SPFD5408_GAMMASET 0x26 +#define SPFD5408_DISPLAYOFF 0x28 +#endif + +#define SPFD5408_DISPLAYON 0x29 +#define SPFD5408_COLADDRSET 0x2A +#define SPFD5408_PAGEADDRSET 0x2B +#define SPFD5408_MEMORYWRITE 0x2C +#define SPFD5408_PIXELFORMAT 0x3A +#define SPFD5408_FRAMECONTROL 0xB1 +#if 0 +#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_MADCTL 0x36 +#define SPFD5408_MADCTL_MX 0x40 +#define SPFD5408_MADCTL_MV 0x20 +#define SPFD5408_MADCTL_ML 0x10 +#define SPFD5408_MADCTL_RGB 0x00 +#endif +#define SPFD5408_MEMCONTROL 0x36 +#define SPFD5408_MADCTL_MY 0x80 +#define SPFD5408_MADCTL_BGR 0x08 +#if 0 +#define SPFD5408_MADCTL_MH 0x04 +#endif + +#define IDLE 1 +#define ACTIVE 0 +#define COMMAND 0 +#define DATA 1 + +#define TEMPS 40 + + +//integration + +#define XE_G 0 +#define XE_D 240 +#define YE_H 0 +#define YE_B 320 +#define XT_G 3700 +#define XT_D 600 +#define YT_H 600 +#define YT_B 3700 + +//definitions de variables +//touchscreen +uint16_t x; +uint16_t y; +uint16_t z; + +//tftspfd5408 +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; + +//integration +Serial pc(SERIAL_TX, SERIAL_RX, 9600); +DigitalOut myled(LED1); +uint16_t couleurVariable; +uint16_t tableDeCouleur[]= + { + WHITE, YELLOW, GREEN, BLUE, CYAN, MAGENTA, RED + }; + + +//declarations de fonctions +//touchscreen +void restoreXY(void); +uint16_t readTouchX(void); +uint16_t readTouchY(void); +uint16_t detectTouch(void); + +//tftspfd5408 +void WriteCommand(uint8_t c); +void WriteData(uint8_t d); +void begin(void); +void setAddrWindow(int x1, int y1, int x2, int y2); +void fillRect(uint16_t x1, uint16_t y1, uint16_t w, uint16_t h, uint16_t fillcolor); + +//definitions de fonctions +//touchscreen +void restoreXY(void) +{ +DigitalOut pinXP(XP); +DigitalOut pinXM(XM); +DigitalOut pinYP(YP); +DigitalOut pinYM(YM); + + pinXP = 1; + pinXM = 1; + pinYP = 1; + pinYM = 1; + wait_ms(1); +} + +uint16_t readTouchX(void) +{ +uint16_t value; +DigitalOut pinXP(XP); +DigitalOut pinXM(XM); +AnalogIn pinYP(YP); +DigitalIn pinYM(YM); + + pinXP = 0; + pinXM = 1; + pinYM.mode(OpenDrain); + value = pinYP.read_u16() >> 4; + restoreXY(); + return value; +} + +uint16_t readTouchY(void) +{ +uint16_t value; +DigitalIn pinXP(XP); +AnalogIn pinXM(XM); +DigitalOut pinYP(YP); +DigitalOut pinYM(YM); + + pinYP = 1; + pinYM = 0; + pinXP.mode(OpenDrain); + value = pinXM.read_u16() >> 4; + restoreXY(); + return value; +} + +uint16_t detectTouch(void) +{ +uint16_t firstValue; +uint16_t secondValue; +DigitalOut pinXP(XP); +DigitalOut pinXM(XM); +AnalogIn pinYP(YP); +DigitalIn pinYM(YM); + + pinYM.mode(OpenDrain); + pinXP = 1; + pinXM = 0; + firstValue = pinYP.read_u16() >> 4; + + pinXP = 0; + pinXM = 1; + secondValue = pinYP.read_u16() >> 4; + + restoreXY(); + + if (secondValue > firstValue) + { + return firstValue; + } + return secondValue; +} + +//tftspfd5408 +void WriteCommand(uint8_t c) +{ +BusInOut portTFT(D8, D9, D2, D3, D4, D5, D6, D7); + portTFT.output(); + pinCD = COMMAND; + pinWR = ACTIVE; + portTFT = c; + pinWR = IDLE; +} + +void WriteData(uint8_t d) +{ +BusInOut portTFT(D8, D9, D2, D3, D4, D5, D6, D7); + portTFT.output(); + pinCD = DATA; + pinWR = ACTIVE; + portTFT = d; + pinWR = IDLE; +} + +void begin(void) +{ + pinCS = IDLE; + pinCD = DATA; + pinWR = IDLE; + pinRD = IDLE; + + pinReset = ACTIVE; + wait_ms(100); + pinReset = IDLE; + wait_ms(100); + pinCS = ACTIVE; + + WriteCommand(SPFD5408_SOFTRESET); + WriteData(0); + wait_ms(50); + + WriteCommand(SPFD5408_MEMCONTROL); + WriteData(TFT_NORTH); //(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); + pinCS = IDLE; +} + +void fillRect(uint16_t x1, uint16_t y1, uint16_t w, uint16_t h, uint16_t fillcolor) +{ + BusInOut portTFT(D8, D9, D2, D3, D4, D5, D6, D7); + uint8_t hi, lo; + uint16_t x2, y2; + uint16_t i, j; + + portTFT.output(); + + 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égration + +int32_t conversion(int32_t x, int32_t x0, int32_t y0, int32_t x1, int32_t y1) +{ + int32_t retour; + int32_t limiteInferieure; + int32_t limiteSuperieure; + if (y0 < y1) + { + limiteInferieure = y0; + limiteSuperieure = y1; + } + else + { + limiteInferieure = y1; + limiteSuperieure = y0; + } + retour = (x - x0) * (y1 -y0) / (x1 -x0) + y0; + + if (retour < limiteInferieure) + { + return limiteInferieure; + } + if (retour > limiteSuperieure) + { + return limiteSuperieure; + } + return retour; +}; + +uint16_t determineLaCouleur(void) +{ + return tableDeCouleur[3]; +} + +int main() +{ +uint16_t couleur; +//initialisation du touchscreen + restoreXY(); + +//initialisation du tftspfd5408 + begin(); + +//intégration + couleur = RED; + couleurVariable = BLUE; + fillRect(0, 0, 240, 280, BLACK); //surface de dessin +//bouton noir + fillRect(0, 280, 80, 2, WHITE); // ligne horizontale haut + fillRect(0, 282, 2, 38, WHITE); // ligne verticale gauche + fillRect(79, 282, 1, 38, WHITE); // ligne verticale droite + fillRect(2, 318, 77, 2, WHITE); //ligne horizontale bas + fillRect(2, 282, 77, 36, BLACK); // centre noir +//bouton rouge + fillRect(80, 280, 80, 40, WHITE); // moins d'instructions mais plus long + fillRect(81, 282, 78, 36, RED); // bouton rouge +//bouton cyan + fillRect(160, 280, 80, 40, WHITE); // moins d'instructions mais plus long + fillRect(161, 282, 77, 36, BLUE); //bouton bleu +//indicateur + fillRect(81, 282, 10, 10, GREEN); //couleur rouge par défaut + + while(1) { + +//tâches du touchscreen + myled = !myled; + + x = readTouchX(); + y = readTouchY(); + z = detectTouch(); +//tâches du tftspfd5408 + + +//tâches d'intégration + couleurVariable = determineLaCouleur(); + fillRect(228, 282, 10, 10, couleurVariable); //indicateur de couleur + + if ((z > TOUCH_SEUIL_BAS)&&(z < TOUCH_SEUIL_HAUT)) + { +#ifdef TEST + pc.printf("x lu %u\t ", x); + pc.printf("y lu %u\t ", y); + pc.printf("z lu %u\t ", z); +#endif + float u = conversion((float)x, XT_G, XE_G, XT_D, XE_D); + float v = conversion((float)y, YT_B, YE_B, YT_H, YE_H); + +#ifdef TEST + pc.printf("x ecran %f\t ", u); + pc.printf("y ecran %f\r\n", v); +#endif + if (v < 280) + { + fillRect(u, v, 1, 1, couleur); + } + else + { + if (u < 80) + { + fillRect(0, 0, 240, 280, BLACK); + } + else + { + if (u < 160) + { + //indicateur RED + fillRect(81, 282, 10, 10, GREEN); //couleur rouge par défaut + fillRect(161,282, 10, 10, couleurVariable); + + couleur = RED; + pc.printf("couleur: rouge\n\r"); + } + else + { + //indicateur AUTRE + fillRect(161, 282, 77, 36, couleurVariable); + fillRect(161, 282, 10, 10, GREEN); //bouton bleu pale + fillRect(81, 282, 10, 10, RED); + couleur = couleurVariable; + pc.printf("couleur variable\n\r"); + } + } + } + } + } +}
diff -r 000000000000 -r 37eb67c8ebd0 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Fri Jan 26 13:56:42 2018 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/a330f0fddbec \ No newline at end of file