Go Down

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


Mar 03, 2013, 10:28 pm Last Edit: Mar 05, 2013, 10:29 pm by cowasaki Reason: 1
I'm having a strange issue....

  • I'm running a DUE & IDE 1.52

  • 7" 32 pin TFT touch screen display

  • CTE shield

  • Standard UTFT library (latest version)

What happens?

The main issues is that the entire display is horizontally reversed. (OR I have the screen upside down and it is vertically reversed)

(the 2nd issue is that all the demos in the demo loop from start through to the sin wave fail display strange blocks of colour but this is a lesser issue by far.)

It appears to be something to do with the initialisation of the display and this was confirmed by UTFT's writer who I emailed.

I've downloaded the datasheet for the SSD1963 http://www.techtoys.com.hk/Components/SSD1963QL9/SSD1963_1.1.pdf

I'm not yet sure what it is but I'm thinking that it might have something to do with the frame buffer settings re "set_address_mode command 0x36"

This is the relevant section:

In the library this is the relevant section of code:

The standard setting is 0x03 or 0x22 ??

Now looking at the data sheet I should be setting (as far as I can see)

bit 5=0 (horizontal)
bit 6=0
bit 7=1

This is based on being the horizontal opposite of 0x03 BUT it doesn't work and remains the same.  I was convinced that making the changes wasn't working and it was reading from somewhere else but I "//"d the 'screen on' command and the screen stayed off so it is the right file and SHOULD be working.....

I've tried commenting the two lines out completely but it isn't doing anything whatsoever!!!

Code: [Select]
   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_COM(0xE0); // PLL enable
LCD_Write_COM(0x01); // software reset
       LCD_Write_COM(0xE6); //PLL setting for PCLK, depends on resolution

           LCD_Write_DATA((799>>8)&0X00FF);  //Set HDP
                   LCD_Write_DATA((479>>8)&0X00FF);  //Set VDP

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

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

   LCD_Write_DATA(0x0F); //GPIO[3:0] out 1

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

LCD_Write_COM(0x36); //rotation ****set_address_mode command****
   LCD_Write_DATA(0x03);   //tried 0,1,2,3 but none have ANY effect ???

// LCD_Write_COM(0x20); //invert
//    LCD_Write_DATA(0xff);

       LCD_Write_COM(0x3A); //pixel data interface

LCD_Write_COM(0xF0); //pixel data interface

setXY(0, 0, 799, 479);

LCD_Write_COM(0x26); //pixel data interface

LCD_Write_COM(0x29); //display on

LCD_Write_COM(0xBE); //set PWM for B/L




Found another section:

This would suggest that you can simply change the direction BUT it says GET not SET.....

Tried adding the lines:

Code: [Select]

LCD_Write_COM(0x0B); //horizontal direction

BUT nothing I try changing it to works......  still playing though.


All these LCD drivers have a bit to control gate-scan direction and a bit to control source-scan direction,
check the datasheet for where these are in the registers.  Don't change the RAM addressing unless you
want to switch landscape <-> portrait - if I remember correctly.

Again if I remember rightly the usual set up is that the RAM addressing bit simply transposes X and Y, which
means a reflection about a diagonal.  There are 8 combinations of these 3 bits giving access to every
rotation and refection sense.  Rotating by 90 degrees involves changing the RAM addressing and one
of the other reflection bits.
[ I won't respond to messages, use the forum please ]


The most promising option seemed to be:

0x36 Set_address_mode


NOTHING happens no matter what I change the value to, in fact if I comment out the line it makes no difference.


The UTFT library file UTFT.cpp appears to have a bug in that there are two initialisation sections for the SSD1963_800 the first one is unused.  I've deleted it and it makes no apparent difference.


The most promising option seemed to be:

0x36 Set_address_mode


NOTHING happens no matter what I change the value to, in fact if I comment out the line it makes no difference.

Address mode only changes the behaviour on sending multiple pixels - IIRC the UTFT library sets up bounding
rectangle before drawing lines / blocks and then sends the right number of pixels - the bounding rect ensures
all the pixels end up in the right place whatever scan-direction is used.

The gate-scan and source-scan bits are what you need to find.
[ I won't respond to messages, use the forum please ]

Go Up