Programme utilisé lors du premier laboratoire 247-436

Dependencies:   mbed

Files at this revision

API Documentation at this revision

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