Можно ли использовать кнопку для TFT-LCD-экранов?

Я пытаюсь связать свой сенсорный TFT-ЖК-экран с несколькими кнопками. Могу я поинтересоваться, почему мой код не работает? Я пытаюсь связать экран и кнопку, поэтому я пытаюсь сделать так, чтобы изображение отображало цветок, если кнопка не нажата, и тигра, только если его нажать.

В данный момент этот код завершает отображение обоих изображений одновременно и кнопки независимо от того, нажата кнопка или нет.

Мои компоненты включают 2,8-дюймовый TFT-ЖК-экран и Arduino Mega

#include <SD.h>
#include <SPI.h>
#include <LCD_GUI.h> //Core graphics library
#include <LCD_KBV.h> //Hardware-specific library

LCD_KBV mylcd(ILI9341,A3,A2,A1,A0,A4); //model,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 PIXEL_NUMBER  (mylcd.Get_Display_Width()/4)
#define FILE_NUMBER 4
#define FILE_NAME_SIZE_MAX 20

const int buttonPin = 41;
int buttonState = 0;

uint32_t bmp_offset = 0;
uint16_t s_width = mylcd.Get_Display_Width();  
uint16_t s_heigh = mylcd.Get_Display_Height();
//int16_t PIXEL_NUMBER;

char file_name[FILE_NUMBER][FILE_NAME_SIZE_MAX];

uint16_t read_16(File fp)
{
    uint8_t low;
    uint16_t high;
    low = fp.read();
    high = fp.read();
    return (high<<8)|low;
}

uint32_t read_32(File fp)
{
    uint16_t low;
    uint32_t high;
    low = read_16(fp);
    high = read_16(fp);
    return (high<<8)|low;   
 }

bool analysis_bpm_header(File fp)
{
    if(read_16(fp) != 0x4D42)
    {
      return false;  
    }
    //get bpm size
    read_32(fp);
    //get creator information
    read_32(fp);
    //get offset information
    bmp_offset = read_32(fp);
    //get DIB infomation
    read_32(fp);
    //get width and heigh information
    uint32_t bpm_width = read_32(fp);
    uint32_t bpm_heigh = read_32(fp);
    if((bpm_width != s_width) || (bpm_heigh != s_heigh))
    {
      return false; 
    }
    if(read_16(fp) != 1)
    {
        return false;
    }
    read_16(fp);
    if(read_32(fp) != 0)
    {
      return false; 
     }
     return true;
}

void draw_bmp_picture(File fp)
{
  uint16_t i,j,k,l,m=0;
  uint8_t bpm_data[PIXEL_NUMBER*3] = {0};
  uint16_t bpm_color[PIXEL_NUMBER];
  fp.seek(bmp_offset);
  for(i = 0;i < s_heigh;i++)
  {
    for(j = 0;j<s_width/PIXEL_NUMBER;j++)
    {
      m = 0;
      fp.read(bpm_data,PIXEL_NUMBER*3);
      for(k = 0;k<PIXEL_NUMBER;k++)
      {
        bpm_color[k]= mylcd.Color_To_565(bpm_data[m+2], bpm_data[m+1], bpm_data[m+0]);
        m +=3;
      }
      for(l = 0;l<PIXEL_NUMBER;l++)
      {
        mylcd.Set_Draw_color(bpm_color[l]);
        mylcd.Draw_Pixel(j*PIXEL_NUMBER+l,i);
      }    
     }
   }    
}

void setup() 
{

    Serial.begin(9600);
    pinMode(buttonPin, INPUT);
   mylcd.Init_LCD();
   mylcd.Fill_Screen(BLUE);
   //s_width = mylcd.Get_Display_Width();  
   //s_heigh = mylcd.Get_Display_Height();
   //PIXEL_NUMBER = mylcd.Get_Display_Width()/4;
   if(PIXEL_NUMBER == 60)
   {
       strcpy(file_name[0],"flower.bmp");
       strcpy(file_name[1],"tiger.bmp");
       strcpy(file_name[2],"tree.bmp");
       strcpy(file_name[3],"RedRose.bmp");
   }
   else
   {
       strcpy(file_name[0],"01.bmp");
       strcpy(file_name[1],"02.bmp");
       strcpy(file_name[2],"03.bmp");
       strcpy(file_name[3],"04.bmp");
   }
  //Init SD_Card
   pinMode(10, OUTPUT);

    if (!SD.begin(10)) 
    {
      mylcd.Set_Text_Back_colour(BLUE);
      mylcd.Set_Text_colour(WHITE);    
      mylcd.Set_Text_Size(1);
      mylcd.Print_String("SD Card Init fail!",0,0);
    }
}

void loop() 
{

 buttonState = digitalRead(buttonPin);

    File bmp_file;
    if (buttonState == HIGH)
    {bmp_file = SD.open(file_name[0]);
      } else {bmp_file = SD.open(file_name[1]);
      }




       if(!bmp_file)
       {
          mylcd.Set_Text_Back_colour(BLUE);
         mylcd.Set_Text_colour(WHITE);    
         mylcd.Set_Text_Size(1);
         mylcd.Print_String("didnt find BMPimage!",0,10);
         while(1);
        }

          draw_bmp_picture(bmp_file);
         bmp_file.close(); 
         delay(2000);
     }

, 👍1

Обсуждение

неясно, в чем ваша проблема..... "большинство проектов даже не подумали бы использовать кнопку".... проекты не думают..... если у вас возникли проблемы с чтением состояния кнопки, просто скажите об этом.... нет реальной необходимости рассказывать историю, которая на самом деле не связана с рассматриваемой проблемой, @jsotola

@jsotola ок изменил его, извини, что это так тебя разозлило, @Clarissa.T

сначала зажгите светодиод с кнопкой в тестовом скече, @Juraj

@Juraj да, я пытался! так что моя кнопка здесь не проблема:(, @Clarissa.T


1 ответ


1

Прежде всего, я предлагаю вам сохранить свой исходный код в чистоте, это значительно облегчает отслеживание потока.

А я не знаю библиотеки, которую вы используете, я предполагаю, что вы проверили загрузку одного изображения работает так, как ожидалось в этом случае вам, вероятно, нужно для протирки экрана перед нанесением нового образа: я не могу сказать наверняка, потому что вы не упомянули, какие библиотеки вы используете (ссылка помог бы).

Если есть функция с именем clear, emptyBuffer или аналогичная, то вам следует вызвать ее перед рисованием изображения, в противном случае вам, вероятно, придется нарисовать заполненный прямоугольник в той же области, куда вы собираетесь поместить свое изображение.

,