Go Down

Topic: FIXED: SSD1963 controller with 7" TFT (horizontally mirrored image) (Read 11 times) previous topic - next topic

cowasaki


Hi Guys,

what's the status of this issue ?

I've just made it work - Arduino Due + 7" TFT + UTFT library [ Henning Karlsen ] + same tweaks [ inspired by this topic ]




That's just about it to be honest.  Henning's library with a few tweaks..........

I'm using the 32 pin + 2 pins for LEDA/K board because the ebay supplier sent me the wrong board.  I've had a full refund and ordered a 40 pin version but it had not arrived yet.  Using Henning's library with the tweaks PLUS CTE's SD stuff I have managed to get the TFT & the TFT's SD card reader to work but still haven't got the touch to work at all.

mzahor

I've created "driver" files:

/800_3/initlcd.h

Quote

   case SSD1963_800_3:

      LCD_Write_COM(0xE2);      //PLL multiplier, set PLL clock to 120M
      LCD_Write_DATA(0x23);       //N=0x36 for 6.5M, 0x23 for 10M crystal
      LCD_Write_DATA(0x02);
      LCD_Write_DATA(0x04);
      LCD_Write_COM(0xE0);      // PLL enable
      LCD_Write_DATA(0x01);
      delay(10);
      LCD_Write_COM(0xE0);
      LCD_Write_DATA(0x03);
      delay(10);
      LCD_Write_COM(0x01);      // software reset
      delay(100);
      LCD_Write_COM(0xE6);      //PLL setting for PCLK, depends on resolution
      LCD_Write_DATA(0x04);
      LCD_Write_DATA(0x93);
      LCD_Write_DATA(0xE0);


      LCD_Write_COM(0xB0);      //LCD SPECIFICATION
   LCD_Write_DATA(0x0000);
   LCD_Write_DATA(0x0000);
   LCD_Write_DATA((799>>8)&0X00FF);  //Set HDP
   LCD_Write_DATA(799&0X00FF);
   LCD_Write_DATA((479>>8)&0X00FF);  //Set VDP
   LCD_Write_DATA(479&0X00FF);
   LCD_Write_DATA(0x0000);

      LCD_Write_COM(0xB4);      //HSYNC
   LCD_Write_DATA((1000>>8)&0X00FF);  //Set HT
   LCD_Write_DATA(1000&0X00FF);
   LCD_Write_DATA((51>>8)&0X00FF);  //Set HPS
   LCD_Write_DATA(51&0X00FF);
   LCD_Write_DATA(8);            //Set HPW
   LCD_Write_DATA((3>>8)&0X00FF);  //Set HPS
   LCD_Write_DATA(3&0X00FF);
   LCD_Write_DATA(0x0000);

      LCD_Write_COM(0xB6);      //VSYNC
   LCD_Write_DATA((530>>8)&0X00FF);   //Set VT
   LCD_Write_DATA(530&0X00FF);
   LCD_Write_DATA((24>>8)&0X00FF);  //Set VPS
   LCD_Write_DATA(24&0X00FF);
   LCD_Write_DATA(3);            //Set VPW
   LCD_Write_DATA((23>>8)&0X00FF);  //Set FPS
   LCD_Write_DATA(23&0X00FF);


      LCD_Write_COM(0xBA);
      LCD_Write_DATA(0x06);      //GPIO[3:0] out 1

      LCD_Write_COM(0xB8);
      LCD_Write_DATA(0x07);       //GPIO3=input, GPIO[2:0]=output
      LCD_Write_DATA(0x01);      //GPIO0 normal

      LCD_Write_COM(0x36);      //rotation
      LCD_Write_DATA(0x00);

   LCD_Write_COM(0x3A);      //pixel data interface
      LCD_Write_DATA(0x50);

      LCD_Write_COM(0xF0);      //pixel data interface
      LCD_Write_DATA(0x03);


      delay(1);

      setXY(0, 0, 799, 479);

      LCD_Write_COM(0x26);      //pixel data interface
      LCD_Write_DATA(0x08);

      LCD_Write_COM(0x29);      //display on

      LCD_Write_COM(0xBE);      //set PWM for B/L
      LCD_Write_DATA(0x06);
      LCD_Write_DATA(0x55);
      LCD_Write_DATA(0x01);
      LCD_Write_DATA(0xf0);
      LCD_Write_DATA(0x00);
      LCD_Write_DATA(0x00);

      LCD_Write_COM(0xd0);
      LCD_Write_DATA(0x0d);

      LCD_Write_COM(0x2C);
      break;


800_3/setxy.h
Quote

case SSD1963_800_3:
      swap(word, x1, y1);
      swap(word, x2, y2);
      LCD_Write_COM(0x2a);
       LCD_Write_DATA(x1>>8);
       LCD_Write_DATA(x1);
       LCD_Write_DATA(x2>>8);
       LCD_Write_DATA(x2);
      LCD_Write_COM(0x2b);
       LCD_Write_DATA(y1>>8);
       LCD_Write_DATA(y1);
       LCD_Write_DATA(y2>>8);
       LCD_Write_DATA(y2);
      LCD_Write_COM(0x2c);



      break;




Added this method to UTFT class

Quote

void UTFT::Swtich_LCD_TB_Bit(int TB_Bit)
{
   cbi(P_CS, B_CS);
   switch(display_model)
   {

      case SSD1963_800_3:
      if (TB_Bit==1)
      {
         LCD_Write_COM(0x36);
         LCD_Write_DATA(0x02);
      }
      else
      {
         LCD_Write_COM(0x36);
         LCD_Write_DATA(0x00);
      }
      break;

   }
   sbi (P_CS, B_CS);

}



and call it after TFT init

Quote

.....
#endif
#ifndef DISABLE_ILI9320
   #include "tft_drivers/ili9320/initlcd.h"
#endif
   }

   sbi (P_CS, B_CS);

   setColor(255, 255, 255);
   setBackColor(0, 0, 0);
   cfont.font=0;




Swtich_LCD_TB_Bit(1);

}



mzahor

touchscreen does work for me

I'm using UTouch - there is one thing - Arduino version has commented   pinMode(IRQ,  OUTPUT / INPUT);
Then, in function "availableData", it will not read interrupt.

So we have to eather uncommnet these lines or set   pinMode(2,  INPUT); before running loop.


cowasaki

#18
Mar 31, 2013, 09:52 am Last Edit: Mar 31, 2013, 09:53 am by cowasaki Reason: 1

touchscreen does work for me

I'm using UTouch - there is one thing - Arduino version has commented   pinMode(IRQ,  OUTPUT / INPUT);
Then, in function "availableData", it will not read interrupt.

So we have to eather uncommnet these lines or set   pinMode(2,  INPUT); before running loop.




I'm running the CTE modified library for touch and all the pinMode() commands only have INPUT or OUTPUT not OUTPUT / INPUT.

It does detect a TOUCH event but always returns  the same location.


Code: [Select]

#include "UTouch.h"
#include "UTouchCD.h"

UTouch::UTouch(byte tclk, byte tcs, byte din, byte dout, byte irq)
{
   T_CLK        = tclk;
   T_CS         = tcs;
   T_DIN        = din;
   T_DOUT       = dout;
   T_IRQ        = irq;
}

void UTouch::InitTouch(byte orientation)
{
orient = orientation;
_default_orientation = CAL_S>>31;
touch_x_left = (CAL_X>>14) & 0x3FFF;
touch_x_right = CAL_X & 0x3FFF;
touch_y_top = (CAL_Y>>14) & 0x3FFF;
touch_y_bottom = CAL_Y & 0x3FFF;
disp_x_size = (CAL_S>>12) & 0x0FFF;
disp_y_size = CAL_S & 0x0FFF;
prec = 10;

pinMode(T_CLK,  OUTPUT);
   pinMode(T_CS,   OUTPUT);
   pinMode(T_DIN,  OUTPUT);
   pinMode(T_DOUT, INPUT);
   pinMode(T_IRQ,  OUTPUT);

digitalWrite(T_CS,  HIGH);
digitalWrite(T_CLK, HIGH);
digitalWrite(T_DIN, HIGH);
digitalWrite(T_CLK, HIGH);
}

void UTouch::touch_WriteData(byte data)
{
byte temp;
byte nop;

temp=data;
digitalWrite(T_CLK,LOW);

for(byte count=0; count<8; count++)
{
if(temp & 0x80)
digitalWrite(T_DIN, HIGH);
else
digitalWrite(T_DIN, LOW);
temp = temp << 1;
digitalWrite(T_CLK, LOW);                
nop++;
digitalWrite(T_CLK, HIGH);
nop++;
}
}

word UTouch::touch_ReadData()
{
byte nop;
word data = 0;
for(byte count=0; count<12; count++)
{
data <<= 1;
digitalWrite(T_CLK, HIGH);              
nop++;
digitalWrite(T_CLK, LOW);
nop++;
if (digitalRead(T_DOUT))
data++;
}
return(data);
}

void UTouch::read()
{
unsigned long tx=0, temp_x=0;
unsigned long ty=0, temp_y=0;
int datacount=0;

digitalWrite(T_CS,LOW);                    

for (int i=0; i<prec; i++)
{
touch_WriteData(0x90);        
digitalWrite(T_CLK,HIGH);
digitalWrite(T_CLK,LOW);
temp_x=touch_ReadData();

touch_WriteData(0xD0);      
digitalWrite(T_CLK,HIGH);
digitalWrite(T_CLK,LOW);
temp_y=touch_ReadData();

if (!((temp_x>max(touch_x_left, touch_x_right)) or (temp_x==0) or (temp_y>max(touch_y_top, touch_y_bottom)) or (temp_y==0)))
{
ty+=temp_x;
tx+=temp_y;
datacount++;
}
}

digitalWrite(T_CS,HIGH);
if (datacount>0)
{
if (orient == _default_orientation)
{
TP_X=tx/datacount;
TP_Y=ty/datacount;
}
else
{
TP_X=ty/datacount;
TP_Y=tx/datacount;
}
}
else
{
TP_X=-1;
TP_Y=-1;
}
}

bool UTouch::dataAvailable()
{
bool avail;
pinMode(T_IRQ,  INPUT);
avail = !digitalRead(T_IRQ);
pinMode(T_IRQ,  OUTPUT);
return avail;
}

int UTouch::getX()
{
long c;

if (orient == _default_orientation)
{
c = long(long(TP_X - touch_x_left) * (disp_x_size)) / long(touch_x_right - touch_x_left);
if (c<0)
c = 0;
if (c>disp_x_size)
c = disp_x_size;
}
else
{
if (_default_orientation == PORTRAIT)
c = long(long(TP_X - touch_y_top) * (-disp_y_size)) / long(touch_y_bottom - touch_y_top) + long(disp_y_size);
else
c = long(long(TP_X - touch_y_top) * (disp_y_size)) / long(touch_y_bottom - touch_y_top);
if (c<0)
c = 0;
if (c>disp_y_size)
c = disp_y_size;
}
return c;
}

int UTouch::getY()
{
int c;

if (orient == _default_orientation)
{
c = long(long(TP_Y - touch_y_top) * (disp_y_size)) / long(touch_y_bottom - touch_y_top);
if (c<0)
c = 0;
if (c>disp_y_size)
c = disp_y_size;
}
else
{
if (_default_orientation == PORTRAIT)
c = long(long(TP_Y - touch_x_left) * (disp_x_size)) / long(touch_x_right - touch_x_left);
else
c = long(long(TP_Y - touch_x_left) * (-disp_x_size)) / long(touch_x_right - touch_x_left) + long(disp_x_size);
if (c<0)
c = 0;
if (c>disp_x_size)
c = disp_x_size;
}
return c;
}

void UTouch::setPrecision(byte precision)
{
switch (precision)
{
case PREC_LOW:
prec=1;
break;
case PREC_MEDIUM:
prec=10;
break;
case PREC_HI:
prec=25;
break;
case PREC_EXTREME:
prec=100;
break;
default:
prec=10;
break;
}
}

mzahor

by OUTPUT / INPUT I meant that some are INPUT some OUTPUT - as it is in your code

My UTouch library [ I have commented pinMode(T_IRQ,  OUTPUT); ] because I'm using interrupt to handle touch and need this pin as INPUT.

The most important file is  : UTouchCD.h

these numbers comes from Calibration Sketch - is it possible that you have wrong calibration ?

Quote

#define CAL_X 0x00378DF2UL
#define CAL_Y 0x00158F91UL
#define CAL_S 0x001DF31FUL





UTouch.cpp

Quote

/*
  UTouch.cpp - Arduino/chipKit library support for Color TFT LCD Touch screens
  Copyright (C)2010-2012 Henning Karlsen. All right reserved

  Basic functionality of this library are based on the demo-code provided by
  ITead studio. You can find the latest version of the library at
  http://www.henningkarlsen.com/electronics

  If you make any modifications or improvements to the code, I would appreciate
  that you share the code with me so that I might include it in the next release.
  I can be contacted through http://www.henningkarlsen.com/electronics/contact.php

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#include "UTouch.h"
#include "UTouchCD.h"

UTouch::UTouch(byte tclk, byte tcs, byte din, byte dout, byte irq)
{
    T_CLK        = tclk;
    T_CS         = tcs;
    T_DIN        = din;
    T_DOUT       = dout;
    T_IRQ        = irq;
}

void UTouch::InitTouch(byte orientation)
{
   orient               = orientation;
   _default_orientation   = CAL_S>>31;
   touch_x_left         = (CAL_X>>14) & 0x3FFF;
   touch_x_right         = CAL_X & 0x3FFF;
   touch_y_top            = (CAL_Y>>14) & 0x3FFF;
   touch_y_bottom         = CAL_Y & 0x3FFF;
   disp_x_size            = (CAL_S>>12) & 0x0FFF;
   disp_y_size            = CAL_S & 0x0FFF;
   prec               = 10;

   pinMode(T_CLK,  OUTPUT);
    pinMode(T_CS,   OUTPUT);
    pinMode(T_DIN,  OUTPUT);
    pinMode(T_DOUT, INPUT);
//    pinMode(T_IRQ,  OUTPUT);

   digitalWrite(T_CS,  HIGH);
   digitalWrite(T_CLK, HIGH);
   digitalWrite(T_DIN, HIGH);
   digitalWrite(T_CLK, HIGH);
}

void UTouch::touch_WriteData(byte data)
{
   byte temp;
   byte nop;

   temp=data;
   digitalWrite(T_CLK,LOW);

   for(byte count=0; count<8; count++)
   {
      if(temp & 0x80)
         digitalWrite(T_DIN, HIGH);
      else
         digitalWrite(T_DIN, LOW);
      temp = temp << 1;
      digitalWrite(T_CLK, LOW);
      nop++;
      digitalWrite(T_CLK, HIGH);
      nop++;
   }
}

word UTouch::touch_ReadData()
{
   byte nop;
   word data = 0;
   for(byte count=0; count<12; count++)
   {
      data <<= 1;
      digitalWrite(T_CLK, HIGH);
      nop++;
      digitalWrite(T_CLK, LOW);
      nop++;
      if (digitalRead(T_DOUT))
         data++;
   }
   return(data);
}

void UTouch::read()
{
   unsigned long tx=0, temp_x=0;
   unsigned long ty=0, temp_y=0;
   int datacount=0;



   digitalWrite(T_CS,LOW);



   for (int i=0; i<prec; i++)
   {
      touch_WriteData(0x90);
      digitalWrite(T_CLK,HIGH);
      digitalWrite(T_CLK,LOW);
      temp_y=touch_ReadData();

      touch_WriteData(0xD0);
      digitalWrite(T_CLK,HIGH);
      digitalWrite(T_CLK,LOW);
      temp_x=touch_ReadData();


      if (!((temp_x>max(touch_x_left, touch_x_right)) or (temp_x==0) or (temp_y>max(touch_y_top, touch_y_bottom)) or (temp_y==0)))
      {
         tx+=temp_x;
         ty+=temp_y;
         datacount++;
      }
}

   digitalWrite(T_CS,HIGH);
   if (datacount>0)
   {

      if (orient == _default_orientation)
      {
         TP_X=tx/datacount;
         TP_Y=ty/datacount;
      }
      else
      {
         TP_X=ty/datacount;
         TP_Y=tx/datacount;
      }

   }
   else
   {
      TP_X=-1;
      TP_Y=-1;
   }





}

void UTouch::readx()
{
   unsigned long tx=0, temp_x=0;
   unsigned long ty=0, temp_y=0;
   int datacount=0;

   digitalWrite(T_CS,LOW);

   for (int i=0; i<prec; i++)
   {
      touch_WriteData(0x90);
      digitalWrite(T_CLK,HIGH);
      digitalWrite(T_CLK,LOW);
      temp_x=touch_ReadData();

      touch_WriteData(0xD0);
      digitalWrite(T_CLK,HIGH);
      digitalWrite(T_CLK,LOW);
      temp_y=touch_ReadData();



         ty+=temp_x;
         tx+=temp_y;
         datacount++;

}

   digitalWrite(T_CS,HIGH);
   if (datacount>0)
   {

         TP_X=tx/datacount;
         TP_Y=ty/datacount;

   }
   else
   {
      TP_X=-1;
      TP_Y=-1;
   }




}



bool UTouch::dataAvailable()
{
   bool avail;
//   pinMode(T_IRQ,  INPUT);
   avail = !digitalRead(T_IRQ);
//   pinMode(T_IRQ,  OUTPUT);
   return avail;
}

int UTouch::getX()
{
   long c;

   if (orient == _default_orientation)
   {
      c = long(long(TP_X - touch_x_left) * (disp_x_size)) / long(touch_x_right - touch_x_left);
      if (c<0)
         c = 0;
      if (c>disp_x_size)
         c = disp_x_size;
   }
   else
   {
      if (_default_orientation == PORTRAIT)
         c = long(long(TP_X - touch_y_top) * (-disp_y_size)) / long(touch_y_bottom - touch_y_top) + long(disp_y_size);
      else
         c = long(long(TP_X - touch_y_top) * (disp_y_size)) / long(touch_y_bottom - touch_y_top);
      if (c<0)
         c = 0;
      if (c>disp_y_size)
         c = disp_y_size;
   }
   return c;
}

int UTouch::getY()
{
   int c;

   if (orient == _default_orientation)
   {
      c = long(long(TP_Y - touch_y_top) * (disp_y_size)) / long(touch_y_bottom - touch_y_top);
      if (c<0)
         c = 0;
      if (c>disp_y_size)
         c = disp_y_size;
   }
   else
   {
      if (_default_orientation == PORTRAIT)
         c = long(long(TP_Y - touch_x_left) * (disp_x_size)) / long(touch_x_right - touch_x_left);
      else
         c = long(long(TP_Y - touch_x_left) * (-disp_x_size)) / long(touch_x_right - touch_x_left) + long(disp_x_size);
      if (c<0)
         c = 0;
      if (c>disp_x_size)
         c = disp_x_size;
   }
   return c;
}

void UTouch::setPrecision(byte precision)
{
   switch (precision)
   {
      case PREC_LOW:
         prec=1;
         break;
      case PREC_MEDIUM:
         prec=10;
         break;
      case PREC_HI:
         prec=25;
         break;
      case PREC_EXTREME:
         prec=100;
         break;
      default:
         prec=10;
         break;
   }
}





UTouch.h

Quote

/*
  UTouch.h - Arduino/chipKit library support for Color TFT LCD Touch screens
  Copyright (C)2010-2012 Henning Karlsen. All right reserved

  Basic functionality of this library are based on the demo-code provided by
  ITead studio. You can find the latest version of the library at
  http://www.henningkarlsen.com/electronics

  If you make any modifications or improvements to the code, I would appreciate
  that you share the code with me so that I might include it in the next release.
  I can be contacted through http://www.henningkarlsen.com/electronics/contact.php

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#ifndef UTouch_h
#define UTouch_h

#if defined(ARDUINO) && ARDUINO >= 100
   #include "Arduino.h"
#else
   #include "WProgram.h"
#endif

#define PORTRAIT         0
#define LANDSCAPE         1

#define PREC_LOW         1
#define PREC_MEDIUM         2
#define PREC_HI            3
#define PREC_EXTREME      4

class UTouch
{
   public:
      word   TP_X ,TP_Y;
      long   disp_x_size, disp_y_size, default_orientation;
      long   touch_x_left, touch_x_right, touch_y_top, touch_y_bottom;
      long   _default_orientation;

            UTouch(byte tclk, byte tcs, byte tdin, byte dout, byte irq);

      void   InitTouch(byte orientation = LANDSCAPE);
      void   read();
      void   readx();

      bool   dataAvailable();
      int      getX();
      int      getY();
      void   setPrecision(byte precision);

    private:
      byte   T_CLK, T_CS, T_DIN, T_DOUT, T_IRQ;
      byte   orient;
      byte   prec;
      byte   display_model;

      void   touch_WriteData(byte data);
      word   touch_ReadData();
};

#endif


Go Up