INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Programmierung Touch-Display
25.11.2019, 18:11 (Dieser Beitrag wurde zuletzt bearbeitet: 25.11.2019 20:26 von Bitklopfer.)
Beitrag #1
Programmierung Touch-Display
Hallo,
ich beschäftige mich noch nicht lange mit der Programmierung und versuche gerade in die Programmierung von TFT-Displays reinzuarbeiten und einen Beispielcode aus dem WEB zu verstehen. Ich habe ein 3.5" TFT-Display das auch mit einem anderen Code soweit funktioniert.
Hier mal der vollständige Code:
Code:
/********************************************************************************​***
*This program is a demo of how to use the touch function in a switch
*This demo was made for LCD modules with 8bit or 16bit data port.
*This program requires the the LCDKIWI library.

* File                : switch_test.ino
* Hardware Environment: Arduino UNO&Mega2560
* Build Environment   : Arduino

*Set the pins to the correct ones for your development shield or breakout board.
*This demo use the BREAKOUT BOARD only and use these 8bit data lines to the LCD,
*pin usage as follow:
*                  LCD_CS  LCD_CD  LCD_WR  LCD_RD  LCD_RST  SD_SS  SD_DI  SD_DO  SD_SCK
*     Arduino Uno    A3      A2      A1      A0      A4      10     11     12      13                            
*Arduino Mega2560    A3      A2      A1      A0      A4      10     11     12      13                          

*                  LCD_D0  LCD_D1  LCD_D2  LCD_D3  LCD_D4  LCD_D5  LCD_D6  LCD_D7  
*     Arduino Uno    8       9       2       3       4       5       6       7
*Arduino Mega2560    8       9       2       3       4       5       6       7

*Remember to set the pins to suit your display module!
*
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, QD electronic SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
********************************************************************************​**/

#include <TouchScreen.h> //touch library
#include <LCDWIKI_GUI.h> //Core graphics library
#include <LCDWIKI_KBV.h> //Hardware-specific library
#include "switch_font.c"

//if the IC model is known or the modules is unreadable,you can use this constructed function
LCDWIKI_KBV my_lcd(ILI9486,A3,A2,A1,A0,A4); //model,cs,cd,wr,rd,reset
//if the IC model is not known and the modules is readable,you can use this constructed function
//LCDWIKI_KBV my_lcd(320,480,A3,A2,A1,A0,A4);//width,height,cs,cd,wr,rd,reset

#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 YP A3  // must be an analog pin, use "An" notation!
#define XM A2  // must be an analog pin, use "An" notation!
#define YM 9   // can be a digital pin
#define XP 8   // can be a digital pin

#define TS_MINX 906
#define TS_MAXX 116

#define TS_MINY 92
#define TS_MAXY 952
// We have a status line for like, is FONA working
#define STATUS_X 10
#define STATUS_Y 65


boolean switch_flag_1 = true,switch_flag_2 = true,switch_flag_3 = true,switch_flag_4 = true,switch_flag_5 = true,switch_flag_6 = true;  
int16_t menu_flag = 1,old_menu_flag;    

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

//display string
void show_string(uint8_t *str,int16_t x,int16_t y,uint8_t csize,uint16_t fc, uint16_t bc,boolean mode)
{
    my_lcd.Set_Text_Mode(mode);
    my_lcd.Set_Text_Size(csize);
    my_lcd.Set_Text_colour(fc);
    my_lcd.Set_Text_Back_colour(bc);
    my_lcd.Print_String(str,x,y);
}

//diaplay a picture
void show_picture(const uint8_t *color_buf,int16_t buf_size,int16_t x1,int16_t y1,int16_t x2,int16_t y2)
{
    my_lcd.Set_Addr_Window(x1, y1, x2, y2);
    my_lcd.Push_Any_Color(color_buf, buf_size, 1, 1);
}

//Check whether to press or not
boolean is_pressed(int16_t x1,int16_t y1,int16_t x2,int16_t y2,int16_t px,int16_t py)
{
    if((px > x1 && px < x2) && (py > y1 && py < y2))
    {
        return true;  
    }
    else
    {
        return false;  
    }
}

//show the system menu
void show_system_menu(void)
{    
    show_string("time setting",10,150,2,BLACK, BLACK,1);
    show_string("date setting",10,170,2,BLACK, BLACK,1);
    show_string("alarm setting",10,190,2,BLACK, BLACK,1);
    show_string("talk setting",10,210,2,BLACK, BLACK,1);
    show_string("sound setting",10,230,2,BLACK, BLACK,1);
    switch(menu_flag)
    {
      case 1:
      {
          my_lcd.Set_Draw_color(BLUE);
          my_lcd.Fill_Rectangle(0, 147, my_lcd.Get_Display_Width()-1, 166);
          show_string("time setting",10,150,2,WHITE, BLACK,1);
          break;
      }
      case 2:
      {
          my_lcd.Set_Draw_color(BLUE);
          my_lcd.Fill_Rectangle(0, 167, my_lcd.Get_Display_Width()-1, 186);
          show_string("date setting",10,170,2,WHITE, BLACK,1);
          break;
      }
      case 3:
      {
          my_lcd.Set_Draw_color(BLUE);
          my_lcd.Fill_Rectangle(0, 187, my_lcd.Get_Display_Width()-1, 206);
          show_string("alarm setting",10,190,2,WHITE, BLACK,1);
          break;
      }
      case 4:
      {
          my_lcd.Set_Draw_color(BLUE);
          my_lcd.Fill_Rectangle(0, 207, my_lcd.Get_Display_Width()-1, 226);
          show_string("talk setting",10,210,2,WHITE, BLACK,1);
          break;
      }
      case 5:
      {
          my_lcd.Set_Draw_color(BLUE);
          my_lcd.Fill_Rectangle(0, 227, my_lcd.Get_Display_Width()-1, 246);
          show_string("sound setting",10,230,2,WHITE, BLACK,1);
          break;
      }
      default:
        break;
    }
}
                    
void setup(void)
{    
Serial.begin(9600);
my_lcd.Init_LCD();
Serial.println(my_lcd.Read_ID(), HEX);
my_lcd.Fill_Screen(WHITE);

//show the switch picture
my_lcd.Set_Draw_color(192, 192, 192);
my_lcd.Draw_Fast_HLine(0, 3, my_lcd.Get_Display_Width());
show_picture(switch_on_2,sizeof(switch_on_2)/2,5,5,34,34);
show_string("switch is on ",60,11,2,GREEN, BLACK,1);

my_lcd.Draw_Fast_HLine(0, 37, my_lcd.Get_Display_Width());

show_string("wifi setting",5,40,2,BLACK, BLACK,1);
show_picture(switch_on_3,sizeof(switch_on_3)/2,195,40,234,54);

  my_lcd.Draw_Fast_HLine(0, 57, my_lcd.Get_Display_Width());

show_string("bt setting",5,60,2,BLACK, BLACK,1);
show_picture(switch_on_3,sizeof(switch_on_3)/2,195,60,234,74);

my_lcd.Draw_Fast_HLine(0, 77, my_lcd.Get_Display_Width());

show_string("auto time",5,80,2,BLACK, BLACK,1);
show_picture(switch_on_1,sizeof(switch_on_1)/2,204,80,218,94);

my_lcd.Draw_Fast_HLine(0, 97, my_lcd.Get_Display_Width());

show_string("enable lock",5,100,2,BLACK, BLACK,1);
show_picture(switch_on_1,sizeof(switch_on_1)/2,204,100,218,114);

my_lcd.Draw_Fast_HLine(0, 116, my_lcd.Get_Display_Width());

show_string("system setting   >",5,119,2,BLUE, BLACK,1);
my_lcd.Draw_Fast_HLine(0, 138, my_lcd.Get_Display_Width());
}

#define MINPRESSURE 10
#define MAXPRESSURE 1000
void loop(void)
{
  digitalWrite(13, HIGH);
  TSPoint p = ts.getPoint();
  digitalWrite(13, LOW);

  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);
  if (p.z > MINPRESSURE && p.z < MAXPRESSURE)
  {
    //p.x = my_lcd.Get_Display_Width()-map(p.x, TS_MINX, TS_MAXX, my_lcd.Get_Display_Width(), 0);
    //p.y = my_lcd.Get_Display_Height()-map(p.y, TS_MINY, TS_MAXY, my_lcd.Get_Display_Height(), 0);
    p.x = map(p.x, TS_MINX, TS_MAXX, my_lcd.Get_Display_Width(),0);
    p.y = map(p.y, TS_MINY, TS_MAXY, my_lcd.Get_Display_Height(),0);
  
    if(is_pressed(5,5,34,34,p.x,p.y))
    {
        if(switch_flag_1)
        {   //display off
            show_picture(switch_off_2,sizeof(switch_off_2)/2,5,5,34,34);
            my_lcd.Set_Draw_color(WHITE);
            my_lcd.Fill_Rectangle(60, 11,  216, 27);
            show_string("switch is off ",60,11,2,RED, BLACK,1);
            switch_flag_1 = false;
         }
         else
         {  //display on
           show_picture(switch_on_2,sizeof(switch_on_2)/2,5,5,34,34);
           my_lcd.Set_Draw_color(WHITE);
           my_lcd.Fill_Rectangle(60, 11,  216, 27);
           show_string("switch is on ",60,11,2,GREEN, BLACK,1);
           switch_flag_1 = true;
         }
         delay(100);
     }
     if(is_pressed(195,40,234,54,p.x,p.y))
     {
        if(switch_flag_2)
        {
            show_picture(switch_off_3,sizeof(switch_off_3)/2,195,40,234,54);
            switch_flag_2 = false;
        }
        else
        {
           show_picture(switch_on_3,sizeof(switch_on_3)/2,195,40,234,54);
           switch_flag_2 = true;
        }
        delay(100);
      }
      if(is_pressed(195,60,234,74,p.x,p.y))
      {
         if(switch_flag_3)
        {
            show_picture(switch_off_3,sizeof(switch_off_3)/2,195,60,234,74);
            switch_flag_3 = false;
        }
        else
        {
           show_picture(switch_on_3,sizeof(switch_on_3)/2,195,60,234,74);
           switch_flag_3 = true;
        }
        delay(100);
       }
       if(is_pressed(205,81,217,93,p.x,p.y))
       {
         if(switch_flag_4)
         {
           show_picture(switch_off_1,sizeof(switch_off_1)/2,204,80,218,94);
            switch_flag_4 = false;
         }
         else
         {
           show_picture(switch_on_1,sizeof(switch_on_1)/2,204,80,218,94);
            switch_flag_4 = true;
         }
        delay(100);
       }
       if(is_pressed(205,101,217,113,p.x,p.y))
       {
         if(switch_flag_5)
         {
          show_picture(switch_off_1,sizeof(switch_off_1)/2,204,100,218,114);
          switch_flag_5 = false;
         }
         else
         {
           show_picture(switch_on_1,sizeof(switch_on_1)/2,204,100,218,114);
           switch_flag_5 = true;
          }
         delay(100);
       }
       if(is_pressed(5,119,my_lcd.Get_Display_Width()-1,137,p.x,p.y))
       {    
            my_lcd.Set_Draw_color(MAGENTA);
            my_lcd.Fill_Rectangle(0, 117, my_lcd.Get_Display_Width()-1, 137);
            delay(100);
            my_lcd.Set_Draw_color(WHITE);
            my_lcd.Fill_Rectangle(0, 117, my_lcd.Get_Display_Width()-1, 137);
            if(switch_flag_6)
            {
                show_string("system setting   <",5,119,2,BLUE, BLACK,1);
                show_system_menu();
                switch_flag_6 = false;
            }
            else
            {
                 show_string("system setting   >",5,119,2,BLUE, BLACK,1);
                 my_lcd.Set_Draw_color(WHITE);
                 my_lcd.Fill_Rectangle(0, 147, my_lcd.Get_Display_Width()-1, 250);
                 switch_flag_6 = true;
            }
       }
       if(is_pressed(0,147,my_lcd.Get_Display_Width()-1,247,p.x,p.y)&&(!switch_flag_6))
       {
          old_menu_flag = menu_flag;    
          if(is_pressed(0,147,my_lcd.Get_Display_Width()-1,166,p.x,p.y))
          {
              my_lcd.Set_Draw_color(BLUE);
              my_lcd.Fill_Rectangle(0, 147, my_lcd.Get_Display_Width()-1, 166);
              show_string("time setting",10,150,2,WHITE, BLACK,1);
              menu_flag = 1;
           }
           if(is_pressed(0,167,my_lcd.Get_Display_Width()-1,186,p.x,p.y))
           {
              my_lcd.Set_Draw_color(BLUE);
              my_lcd.Fill_Rectangle(0, 167, my_lcd.Get_Display_Width()-1, 186);
              show_string("date setting",10,170,2,WHITE, BLACK,1);
              menu_flag = 2;
           }
           if(is_pressed(0,187,my_lcd.Get_Display_Width()-1,206,p.x,p.y))
           {
              my_lcd.Set_Draw_color(BLUE);
              my_lcd.Fill_Rectangle(0, 187, my_lcd.Get_Display_Width()-1, 206);
              show_string("alarm setting",10,190,2,WHITE, BLACK,1);
              menu_flag = 3;
           }
           if(is_pressed(0,207,my_lcd.Get_Display_Width()-1,226,p.x,p.y))
           {
               my_lcd.Set_Draw_color(BLUE);
               my_lcd.Fill_Rectangle(0, 207, my_lcd.Get_Display_Width()-1, 226);
              show_string("talk setting",10,210,2,WHITE, BLACK,1);
              menu_flag = 4;
           }
           if(is_pressed(0,227,my_lcd.Get_Display_Width()-1,246,p.x,p.y))
           {
              my_lcd.Set_Draw_color(BLUE);
              my_lcd.Fill_Rectangle(0, 227, my_lcd.Get_Display_Width()-1, 246);
              show_string("sound setting",10,230,2,WHITE, BLACK,1);
              menu_flag = 5;
           }  
           if(old_menu_flag != menu_flag)
           {
              switch(old_menu_flag)
              {
                case 1:
                {
                    my_lcd.Set_Draw_color(WHITE);
                    my_lcd.Fill_Rectangle(0, 147, my_lcd.Get_Display_Width()-1, 166);
                    show_string("time setting",10,150,2,BLACK, BLACK,1);
                    break;
                }
                case 2:
                {
                    my_lcd.Set_Draw_color(WHITE);
                    my_lcd.Fill_Rectangle(0, 167, my_lcd.Get_Display_Width()-1, 186);
                    show_string("date setting",10,170,2,BLACK, BLACK,1);
                    break;
                }
                case 3:
                {
                    my_lcd.Set_Draw_color(WHITE);
                    my_lcd.Fill_Rectangle(0, 187, my_lcd.Get_Display_Width()-1, 206);
                    show_string("alarm setting",10,190,2,BLACK, BLACK,1);
                    break;
                }
                case 4:
                {
                    my_lcd.Set_Draw_color(WHITE);
                    my_lcd.Fill_Rectangle(0, 207, my_lcd.Get_Display_Width()-1, 226);
                    show_string("talk setting",10,210,2,BLACK, BLACK,1);
                    break;
                }
                case 5:
                {
                    my_lcd.Set_Draw_color(WHITE);
                    my_lcd.Fill_Rectangle(0, 227, my_lcd.Get_Display_Width()-1, 246);
                    show_string("sound setting",10,230,2,BLACK, BLACK,1);
                    break;
                }
                default:
                  break;                  
             }      
         }
         delay(100);
     }
  }
}

Von diesem Code verstehe ich folgenden Bereich nicht:

Code:
//Check whether to press or not
boolean is_pressed(int16_t x1,int16_t y1,int16_t x2,int16_t y2,int16_t px,int16_t py)
{
    if((px > x1 && px < x2) && (py > y1 && py < y2))
    {
        return true;  
    }
    else
    {
        return false;  
    }
}
Die Funktion ist anscheinend dazu da, die Berührung zu erfassen.
Ich finde allerdings die Variablen x1, y1, x2, y2, px, py an keiner anderen Stelle im Code, lediglich p.x und p.y.
Hier bin ich mit meinem Latein an Ende.
Gibt es gutes Nachschlagewerk um die Programmierung zu erlernen?
Danke und Gruss
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.11.2019, 20:17
Beitrag #2
RE: Fragen eines Neulings
Die Variablen sind nur innerhalb der Funktion gültig. Sie werden ihr beim Aufruf übergeben.
Als Buch kann ich Der C++-Programmierer empfehlen.
Evtl. tut es auch erst mal die deutsche Arduino-Referenz hier im Forum.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.11.2019, 21:13
Beitrag #3
RE: Fragen eines Neulings
(25.11.2019 20:17)Tommy56 schrieb:  Die Variablen sind nur innerhalb der Funktion gültig. Sie werden ihr beim Aufruf übergeben.
Als Buch kann ich Der C++-Programmierer empfehlen.
Evtl. tut es auch erst mal die deutsche Arduino-Referenz hier im Forum.

Gruß Tommy
Danke,
d.h. letztendlich sind das nur so eine Art Platzhalter?
Die Referenz habe ich schon des Öfteren mir zu Gemüte gezogen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.11.2019, 21:17 (Dieser Beitrag wurde zuletzt bearbeitet: 25.11.2019 21:39 von Tommy56.)
Beitrag #4
RE: Fragen eines Neulings
(25.11.2019 21:13)WF55 schrieb:  d.h. letztendlich sind das nur so eine Art Platzhalter?
Ja, Du legst ihre Namen in der Deklaration des Funktionskopfes fest.
Beim Aufruf übergibst Du dann an der Position die Werte, mit denen die Funktion etwas machen soll.

Hier sind das ein Rechteck (der Button) (x1,y1 und x2,y2) und die aktuell angetouchten Koordinaten p.x und p.y

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Programmierung Attiny 84 MaxSi 14 469 23.06.2020 19:39
Letzter Beitrag: Tommy56
  8x8x8 LED Würfel Programmierung AK79 11 742 17.06.2020 22:52
Letzter Beitrag: AK79
  ESP32 Web Radio VS1053 - touch-"buttons" funktionieren nur so halb crazysky 4 288 14.06.2020 22:43
Letzter Beitrag: crazysky
  OLED Display Phänomen Sulawesi 36 1.175 02.06.2020 13:06
Letzter Beitrag: Sulawesi
  7 Segment Display mit Rotary Encoder SA154 2 272 26.05.2020 13:40
Letzter Beitrag: MicroBahner
  4 Zeilen im Display Modul 0.69" IIC I2C, aber wie? Christian_Moba-Arduino 7 421 17.05.2020 13:12
Letzter Beitrag: Christian_Moba-Arduino
  Problem mit Nokia 5110 Display MKnet83 17 1.034 12.04.2020 13:31
Letzter Beitrag: Tommy56
  Frage zu Uhrzeit auf Display (schneller laufen lassen) ThorstenP 3 429 07.04.2020 14:52
Letzter Beitrag: hotsystems
  Mit Arduino Uno Sirene Programmierung mh128828 20 1.403 27.03.2020 22:30
Letzter Beitrag: mh128828
  I²C Display flackert JoTa2k 14 914 24.03.2020 16:58
Letzter Beitrag: JoTa2k

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste