Arduino Mega 220x176, 2,4 дюйма с тачскрином ili9325

ast_op1
Offline
Зарегистрирован: 06.01.2019

В общем я балбес (мучался не с той библиотекой). По разбирался с даташитом и понял что чего то не хватает (в этой библиотеке нет RD - пина, сигнала чтения, странно, почему). Скачал другую библиотеку и все заработало, контроллер действительно родной, как и указывали продаваны.

ast_op1
Offline
Зарегистрирован: 06.01.2019

Не могу ни как разобраться, как убрать зеркальное отображение. Надо инвертировать систему координат в библиотеке. Где смотреть.

в UTFT\tft_drivers\ili9325d\default в строчках Partial Display Control на какие значения поменять? Где смотреть?

slider
Offline
Зарегистрирован: 17.06.2014

в здешний поиск - отзеркалить изображение , там найдете что поменять в файле initlcd.h .
если появятся еще вопросы . пишите.

или как вариант попробуйте использовать вызов не UTFT myGLCD(ILI9325D_16,... , а ILI9325D_16ALT 

ast_op1
Offline
Зарегистрирован: 06.01.2019

slider пишет:

в здешний поиск - отзеркалить изображение , там найдете что поменять в файле initlcd.h .
если появятся еще вопросы . пишите.

или как вариант попробуйте использовать вызов не UTFT myGLCD(ILI9325D_16,... , а ILI9325D_16ALT 

ILI9325D_16ALT не прошло. Я понял что нужно в initlcd.h поменять какие то значения для определенного кода функций. Где смотреть, за что функция отвечает и на какие значения откликается (initlcd.h не нашел Display Function Control, значит не подписано просто). На форумах читал, сложно ориентироваться, не понимая. Если есть документ, где почитать, укажите. Объяснять не стоит. При том, не ясно подставляют многие в двоичном исчислении у меня в шестнадцатиричном, что так и так работать будет? Что бы ясность была скидываю свой initlcd.h для своего контроллера https://yadi.sk/i/D0GzVsb0PHmVhw

ast_op1
Offline
Зарегистрирован: 06.01.2019

Не могу разобраться, все уже перепробовал.

Entry Mode (R03h) откликается только I/D1 и I/D0 на 00 и 11

т.е. 

LCD_Write_COM_DATA(0x03, 0x1030) 0001 0000 0011 0000 текст изначально справа-налево, буквы не правильно

LCD_Write_COM_DATA(0x03, 0x1000) 0001 0000 0000 0000 текст изначально справа-налево, буквы правильно

Остальные варианты по даташиту ни какой реакции.

Есть описание на ORG, при OGR=0 как я понял начинает регистрировать 

GRAM Horizontal/Vertical Address Set (R20h, R21h) но из даташита в таблице не могу понять, что по регистрам можно менять (например D0 указано два значение AD0 и AD8, что это значит?) т.е 1 или 0 не нужно указывать, тогда что? и по этим комбинациям что получу. Указаны строчки от 0 до 320.

 

ast_op1
Offline
Зарегистрирован: 06.01.2019

Пытался менять Horizontal and Vertical RAM Address Position (R50h, R51h, R52h, R53h) (указанные значения по умолчанию верны, как и по даташиту:

main_W_com_data (0x0050, 0x0000); // Горизонтальный начальный адрес GRAM
main_W_com_data (0x0051, 0x00EF); // Горизонтальный конечный адрес GRAM
main_W_com_data (0x0052, 0x0000); // Вертикальный начальный адрес GRAM
main_W_com_data (0x0053, 0x013F); // Вертикальный начальный адрес GRAM

менял местами

main_W_com_data (0x0050, 0x00EF); // Горизонтальный начальный адрес GRAM
main_W_com_data (0x0051, 0x0000); // Горизонтальный конечный адрес GRAM
main_W_com_data (0x0052, 0x013F); // Вертикальный начальный адрес GRAM
main_W_com_data (0x0053, 0x0000); // Вертикальный начальный адрес GRAM

без результатно

Что не так? Что тоупустил, еще что то есть. Отделной функции зеркала не нашел (на этом контроллере точно нет) 

 
ast_op1
Offline
Зарегистрирован: 06.01.2019

Разобрался

строчку LCD_Write_COM_DATA(0x03, 0x1030) трогать не надо, а вот 

LCD_Write_COM_DATA(0x01, 0x0100); // set Driver Output Control необходимо изменить направление сдвига выходов.

LCD_Write_COM_DATA(0x01, 0x0000), SS=0

slider
Offline
Зарегистрирован: 17.06.2014

ну вот и хорошо. 
теперь если понадобятся 8 свободных пинов , помимо A6 A7 , RST , CS , то можете перевести его на 8 бит. посмотрев в даташите где и очередность IM0... чтоб найти их в шлейфе.
// чтоб аккуратно отклеить дисп от платы , прогреть плату снизу .

ast_op1
Offline
Зарегистрирован: 06.01.2019

Ага, спасибо. Да я пожалел дисплей, не очень хочется его трогать. Купил мегу, теперь на ней пробую. Все заработало, не могу разобраться с тачскрином. С калибровкой бред какой то. Не ясно теперь куда лезть, в библиотеку тача, в скетче что то менять или в библиотеке дисплея. Проблема изначально сдвиг дисплея относительно тача на 90 градусов. После калибровки вообще не реагирует. 

меняю myTouch.InitTouch(0) изначально было () вроде как работает но со смещением, калибруешь и так же все, не работает. При том резко может уйти в какой то "бред" и полностью пропасть картинка.

В описании на библиотеку тача указано, что должны совпадать myGLCD.InitLCD() и myTouch.InitTouch() 

Кроме ориентации куда еще лезть?

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

slider
Offline
Зарегистрирован: 17.06.2014

1. URTouch http://www.rinkydinkelectronics.com/library.php?id=92

 URTouchCD.h должен быть девственный  (начальные калибровки которые там были при распаковке архива)

2. пробуете URTouch_QuickDraw.ino чтоб понять что тач на всех углах как-то работает.
-  UTFT    myGLCD(ITDB32S,38,39,40,41);  - вместо ITDB32S ставите свой  ILI9325D_16

3. калибровка :   URTouch_Calibration.ino  
- #define TOUCH_ORIENTATION LANDSCAPE   попробуйте заменить на #define TOUCH_ORIENTATION PORTRAIT
-  UTFT    myGLCD(ITDB32S,38,39,40,41);  - вместо ITDB32S ставите свой  ILI9325D_16

   проводите калибровку , данные подменяете в  URTouchCD.h . сохраняете его. 
  проверяете итог скетчем URTouch_QuickDraw.ino

 

 

ast_op1
Offline
Зарегистрирован: 06.01.2019

Все, победил его, ориентацию нужно было в скетче калибратора указать другую, все заработало.

Rustem Mukhamedyarov
Offline
Зарегистрирован: 10.02.2019
 
пин с RST перекинул на А4
плата нано рабочая ЧТО ДЕЛАЮ НЕ ТАК
другие примеры так же не работают
 
 
/*______Import Libraries_______*/
#include <SPFD5408_Adafruit_GFX.h>    // Core graphics library
#include <SPFD5408_Adafruit_TFTLCD.h> // Hardware-specific library
#include <SPFD5408_TouchScreen.h>
/*______End of Libraries_______*/
 
/*______Define LCD pins (I have asigned the default values)_______*/
#define YP A1  // must be an analog pin, use "An" notation!
#define XM A2  // must be an analog pin, use "An" notation!
#define YM 7   // can be a digital pin
#define XP 6   // can be a digital pin
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4
/*_______End of defanitions______*/
 
/*______Assign names to colors and pressure_______*/
#define WHITE   0x0000 //Black->White
#define YELLOW    0x001F //Blue->Yellow
#define CYAN     0xF800 //Red->Cyan
#define PINK   0x07E0 //Green-> Pink
#define RED    0x07FF //Cyan -> Red
#define GREEN 0xF81F //Pink -> Green 
#define BLUE  0xFFE0 //Yellow->Blue
#define BLACK   0xFFFF //White-> Black
#define MINPRESSURE 10
#define MAXPRESSURE 1000
/*_______Assigned______*/
 
/*____Calibrate TFT LCD_____*/
#define TS_MINX 125
#define TS_MINY 85
#define TS_MAXX 965
#define TS_MAXY 905
/*______End of Calibration______*/
 
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); //300 is the sensitivity
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); //Start communication with LCD
 
String symbol[4][4] = {
  { "7", "8", "9", "/" },
  { "4", "5", "6", "*" },
  { "1", "2", "3", "-" },
  { "C", "0", "=", "+" }
};
 int X,Y;
 long Num1,Num2,Number;
 char action;
 boolean result = false;
 
 
 
void setup() {
  Serial.begin(9600); //Use serial monitor for debugging
  tft.reset(); //Always reset at start
  tft.begin(0x9341); // My LCD uses LIL9341 Interface driver IC
  tft.setRotation(2); // I just roated so that the power jack faces up - optional
  tft.fillScreen(WHITE);
 
  IntroScreen();
  
  draw_BoxNButtons(); 
}
 
void loop() {
TSPoint p = waitTouch();
X = p.y; Y = p.x;
//  Serial.print(X); Serial.print(','); Serial.println(Y);// + " " + Y);
 
DetectButtons();
 
if (result==true)
CalculateResult();
 
DisplayResult();   
 
  delay(300);
}
 
TSPoint waitTouch() {
  TSPoint p;
  do {
    p = ts.getPoint(); 
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
  } while((p.z < MINPRESSURE )|| (p.z > MAXPRESSURE));
  p.x = map(p.x, TS_MINX, TS_MAXX, 0, 320);
  p.y = map(p.y, TS_MINY, TS_MAXY, 0, 240);;
  return p;
}
 
void DetectButtons()
{
  
  if (X<50 && X>0) //Detecting Buttons on Column 1
  {
    if (Y>0 && Y<85) //If cancel Button is pressed
    {Serial.println ("Button Cancel"); Number=Num1=Num2=0; result=false;}
    
     if (Y>85 && Y<140) //If Button 1 is pressed
    {Serial.println ("Button 1"); 
    if (Number==0)
    Number=1;
    else
    Number = (Number*10) + 1; //Pressed twice
    }
    
     if (Y>140 && Y<192) //If Button 4 is pressed
    {Serial.println ("Button 4"); 
    if (Number==0)
    Number=4;
    else
    Number = (Number*10) + 4; //Pressed twice
    }
    
     if (Y>192 && Y<245) //If Button 7 is pressed
    {Serial.println ("Button 7");
    if (Number==0)
    Number=7;
    else
    Number = (Number*10) + 7; //Pressed twice
    } 
  }
 
    if (X<105 && X>50) //Detecting Buttons on Column 2
  {
    if (Y>0 && Y<85)
    {Serial.println ("Button 0"); //Button 0 is Pressed
    if (Number==0)
    Number=0;
    else
    Number = (Number*10) + 0; //Pressed twice
    }
    
     if (Y>85 && Y<140)
    {Serial.println ("Button 2"); 
     if (Number==0)
    Number=2;
    else
    Number = (Number*10) + 2; //Pressed twice
    }
    
     if (Y>140 && Y<192)
    {Serial.println ("Button 5"); 
     if (Number==0)
    Number=5;
    else
    Number = (Number*10) + 5; //Pressed twic
    }
    
     if (Y>192 && Y<245)
    {Serial.println ("Button 8"); 
     if (Number==0)
    Number=8;
    else
    Number = (Number*10) + 8; //Pressed twic
    }   
  }
 
    if (X<165 && X>105) //Detecting Buttons on Column 3
  {
    if (Y>0 && Y<85)
    {Serial.println ("Button Equal"); 
    Num2=Number;
    result = true;
    }
    
     if (Y>85 && Y<140)
    {Serial.println ("Button 3"); 
     if (Number==0)
    Number=3;
    else
    Number = (Number*10) + 3; //Pressed twice
    }
    
     if (Y>140 && Y<192)
    {Serial.println ("Button 6"); 
    if (Number==0)
    Number=6;
    else
    Number = (Number*10) + 6; //Pressed twice
    }
    
     if (Y>192 && Y<245)
    {Serial.println ("Button 9");
    if (Number==0)
    Number=9;
    else
    Number = (Number*10) + 9; //Pressed twice
    }   
  }
 
      if (X<213 && X>165) //Detecting Buttons on Column 3
  {
    Num1 = Number;    
    Number =0;
    tft.setCursor(200, 20);
    tft.setTextColor(RED);
    if (Y>0 && Y<85)
    {Serial.println ("Addition"); action = 1; tft.println('+');}
     if (Y>85 && Y<140)
    {Serial.println ("Subtraction"); action = 2; tft.println('-');}
     if (Y>140 && Y<192)
    {Serial.println ("Multiplication"); action = 3; tft.println('*');}
     if (Y>192 && Y<245)
    {Serial.println ("Devesion"); action = 4; tft.println('/');}  
 
    delay(300);
  }  
}
 
void CalculateResult()
{
  if (action==1)
    Number = Num1+Num2;
 
  if (action==2)
    Number = Num1-Num2;
 
  if (action==3)
    Number = Num1*Num2;
 
  if (action==4)
    Number = Num1/Num2; 
}
 
void DisplayResult()
{
    tft.fillRect(0, 0, 240, 80, CYAN);  //clear result box
    tft.setCursor(10, 20);
    tft.setTextSize(4);
    tft.setTextColor(BLACK);
    tft.println(Number); //update new value
}
 
void IntroScreen()
{
  tft.setCursor (55, 120);
  tft.setTextSize (3);
  tft.setTextColor(RED);
  tft.println("ARDUINO");
  tft.setCursor (30, 160);
  tft.println("CALCULATOR");
  tft.setCursor (30, 220);
  tft.setTextSize (2);
  tft.setTextColor(BLUE);
  tft.println("-Circut Digest");
  delay(1800);
}
 
void draw_BoxNButtons()
{
  //Draw the Result Box
  tft.fillRect(0, 0, 240, 80, CYAN);
 
 //Draw First Column
  tft.fillRect  (0,260,60,60,RED);
  tft.fillRect  (0,200,60,60,BLACK);
  tft.fillRect  (0,140,60,60,BLACK);
  tft.fillRect  (0,80,60,60,BLACK);
 
 //Draw Third Column  
  tft.fillRect  (120,260,60,60,GREEN);
  tft.fillRect  (120,200,60,60,BLACK);
  tft.fillRect  (120,140,60,60,BLACK);
  tft.fillRect  (120,80,60,60,BLACK);
 
  //Draw Secound & Fourth Column  
  for (int b=260; b>=80; b-=60)
 { tft.fillRect  (180,b,60,60,BLUE); 
   tft.fillRect  (60,b,60,60,BLACK);}
 
  //Draw Horizontal Lines
  for (int h=80; h<=320; h+=60)
  tft.drawFastHLine(0, h, 240, WHITE);
 
  //Draw Vertical Lines
  for (int v=0; v<=240; v+=60)
  tft.drawFastVLine(v, 80, 240, WHITE);
 
  //Display keypad lables 
  for (int j=0;j<4;j++) {
    for (int i=0;i<4;i++) {
      tft.setCursor(22 + (60*i), 100 + (60*j));
      tft.setTextSize(3);
      tft.setTextColor(WHITE);
      tft.println(symbol[j][i]);
    }
  }
}