SSD1963 Frage

TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 67
Posts: 767
Registered: 06 / 2013
Subject:

SSD1963 Frage

 · 
Posted: 25.04.2023 - 15:39  ·  #1
Hallo allerseits,
ich habe ein TFT SSD1963 mit 480 x 272 mein Anschluss ist auf der rechten Seite,
möchte aber das TFT einmal umdrehen so das ich den Anschluss auf der linken Seite habe.

Dann mit SetRotation einstellen, aber da geht nichts, bei meinen alten 7 Zoll ging das.
Kommt es hier auch auf das Display an ? Ich dachte die SSD1963 sind alle gleich ?

Code

SetRotation(SWITCH_NONE);                   //FLIP_X FLIP_Y FLIP_XY SWITCH_NONE
// SetRotation(FLIP_X);
// SetRotation(FLIP_Y);
// SetRotation(FLIP_XY); 



Gruß Frank
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: SSD1963 Frage

 · 
Posted: 28.04.2023 - 14:05  ·  #2
Hallo Frank,

ich kenne diese Funktion und den Treiber nicht.
Benutzt Du die Funktionen aus AVRco?

Wenn Du die GraphIOS von AVRco nutzt, musst Du den INIT an Deine Wünsche anpassen, im normalfall ist dies der Adressmode. Beim SSD1963 (lt. Datenblatt), Command 0x36 Bit 5, 6 und 7 (siehe Bild). Standard ist hier alles auf "0" Wenn Du es anpassen willst, musst Du Bit5=0, Bit6=1 und Bit7=1 setzen. Wenn Du GraphIOS() nutzt, achte darauf das Du nicht in Deinem Init die Anpassung machst und im Init "cmd=0" wieder auf "0" schreibst. Evtl. ist hier das Problem.


Bei mir sieht die Funktion so aus, ist aber ein anderer Controller und ich habe zusätzlich ein eigenes INIT für mein Display.

Code
userdevice GraphIOS(cmd : byte; data : byte); 
begin
// commands passed to user defined function "GraphIOS" 
// cmd 0 set row address data = row 
// cmd 1 write data byte data = content 
  if cmd = 0 then              // Spalte und Zeile 
    display_address(0, data); // set row addr = data 
    
  else 
  //WriteLCD( data, true ); // write data byte 
    DispBW2RGB(data); 
  endif; 
end GraphIOS; 


Aber mit dem kleinen Code-Schnippsel kann man leider nicht viel Anfangen, man sieht die Konstanten und die Funktionen für
"SetRotation(SWITCH_NONE);" nicht, auch das "userdevice GraphIOS" (falls Du es überhaubt nutzt) ist nicht erkennbar. Wir haben keine Ahnung was Du zu Deinem Display sendest und an welche Adresse.

Wenn der Controller das Auslesen unterstützt, lese einfach mal nach dem Init die CMD Adr. 0x36 aus und schaue Dir den Wert an.

Thorsten
Attachments
SSD1963 Frage
Filename: 28-04-2023_13-50-50.png
Filesize: 145.85 KB
Title:
Download counter: 119
TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 67
Posts: 767
Registered: 06 / 2013
Subject:

Re: SSD1963 Frage

 · 
Posted: 28.04.2023 - 18:26  ·  #3
Hallo Thorsten
ich zeige dir mal was bei mir im Code steht.


Gruß Frank

Code

procedure Init_Lcd;
begin
  lcdReset;
  LCD_CS:= false;
  WriteRegister($01);   // Software Reset
  WriteRegister($01);   // Software Reset
  WriteRegister($01);   // Software Reset
  udelay(100);
  WriteRegister($E0);
  WriteData($01);       // START PLL
  udelay(50);
  WriteRegister($E0);
  WriteData($03);       // LOCK PLL
  udelay(10);

  WriteRegister($B0);   // SET LCD MODE  SET TFT 18Bits MODE
  WriteData($20);       // SET TFT MODE -  DEC32  =$20


  WriteData($00);       // SET TFT MODE & hsync+Vsync+DEN MODE


  WriteData(Hi(_TFTWIDTH - 1));// SET horizontal size=420-1 HightByte
  WriteData(Lo(_TFTWIDTH - 1));// SET horizontal size=420-1 LowByte
  WriteData(Hi(_TFTHEIGHT - 1));// SET vertical size=272-1 HightByte
  WriteData(Lo(_TFTHEIGHT - 1));// SET vertical size=272-1 LowByte
  WriteData($00);       // SET even/odd line RGB seq.=RGB

  WriteRegister($F0);
  WriteData($00);       // SET pixel data I/F format = 8bit
  WriteRegister($3A);
  WriteData($60);       // SET R G B format = 6 6 6
  udelay(10);
  WriteRegister($E2);   //
  WriteData($1D);
  WriteData($02);
  WriteData($54);

  WriteRegister($E6);   // SET PCLK freq=4.94MHz  ; pixel clock frequency
  WriteData($01);
  WriteData($33);
  WriteData($33);

  WriteRegister($B4);   // SET HBP,
  WriteData($02);       // SET HSYNC Total=600
  WriteData($0D);
  WriteData($00);       // SET HBP 68
  WriteData($2B);
  WriteData($28);       // SET VBP 16=15+1
  WriteData($00);       // SET Hsync pulse start position
  WriteData($00);
  WriteData($00);       // SET Hsync pulse subpixel start position

  WriteRegister($B6);   // SET VBP,
  WriteData($01);       // SET Vsync total=360
  WriteData($20);
  WriteData($00);       // SET VBP=19
  WriteData($10);
  WriteData($00);       // SET Vsync pulse 8=7+1
  WriteData($00);       // SET Vsync pulse start position
  WriteData($00);

  WriteRegister($2A);   // SET column address
  WriteData($00);       // SET start column address=0
  WriteData($00);
  WriteData(Hi(_TFTWIDTH - 1));     // SET end column address=419
  WriteData(Lo(_TFTWIDTH - 1));

  WriteRegister($2B);   // SET page address
  WriteData($00);       // SET start page address=0
  WriteData($00);
  WriteData(Hi(_TFTHEIGHT - 1));    // SET end page address=271
  WriteData(Lo(_TFTHEIGHT - 1));

  WriteRegister($29);   // SET display on
  WriteRegister($2C);
  LCD_CS:= true;
  SetBackLight(0);
  WriteRegister($D0);               // controls de backlight
  WriteData($0D);
end;






Code

userdevice GraphIOS(xs, ys, xe, ye: word; pattern, colorFg, colorBg: byte; draw: gDrawType): byte;
begin
  // foreground color
  if colorFg > byte(max(tColors)) then
    ColorWfg:= $0000;   // clblack
    colorFg:= 1;
    ColorPfG:= colorFg;
  elsif colorFg <> ColorPfG then
    ColorPfG:= colorFg;
    ColorWfg:= ColorArr[(tColors(colorFg))];
  endif;

  // background color
  if colorBg > byte(max(tColors)) then
    ColorWbg:= $0000;   // clblack
    colorBg:= 1;
    ColorPbg:= colorBg;
  elsif colorBg <> ColorPbg then
    ColorPbg:= colorBg;
    ColorWbg:= ColorArr[(tColors(colorBg))];
  endif;

  case draw of
    dtClear   :
                FillScreen(ColorWfg);
              |
    dtFillRect:
                FillRect(xs, ys, xe, ye, ColorWfg);
              |

    dtLineX   :
                LCD_CS:= false;
                SetWindow(xs, ys, xe, ys);
                pxCount:= (xe - xs);
                asm: LDS       _ACCBHI, %.pxCount +1
                asm: LDS       _ACCBLO, %.pxCount
                if pattern = $FF then
                  asm: _LoopFillX:
                  WriteColor(ColorWfg);
                  asm: SBIW      _ACCBLO, 1
                  asm: BRNE      _LoopFillX
                else
                   // pattern !!!
                  asm: LDD    _ACCELO, Y+3
                  asm: _LoopFillXP:
                  asm: ROL    _ACCELO
                  asm: BRCS   _LoopFillXPf
                  WriteColor(ColorWbg);
                  asm: CBR    _ACCELO, 1
                  asm: RJMP   _LoopFillXPe
                  asm: _LoopFillXPf:
                  WriteColor(ColorWfg);
                  asm: SBR    _ACCELO, 1
                  asm: _LoopFillXPe:
                  asm: SBIW      _ACCBLO, 1
                  asm: BRNE      _LoopFillXP
                endif;
                LCD_CS:= true;
              |
    dtLineY   :
                LCD_CS:= false;
                SetWindow(xs, ys, xs, ye);
                pxCount:= (ye - ys);
                asm: LDS       _ACCBHI, %.pxCount +1
                asm: LDS       _ACCBLO, %.pxCount
                if pattern = $FF then
                  asm: _LoopFillY:
                  WriteColor(ColorWfg);
                  asm: SBIW      _ACCBLO, 1
                  asm: BRNE      _LoopFillY
                else
                   // pattern !!!
                  asm: LDD    _ACCELO, Y+3
                  asm: _LoopFillYP:
                  asm: ROL    _ACCELO
                  asm: BRCS   _LoopFillYPf
                  WriteColor(ColorWbg);
                  asm: CBR    _ACCELO, 1
                  asm: RJMP   _LoopFillYPe
                  asm: _LoopFillYPf:
                  WriteColor(ColorWfg);
                  asm: SBR    _ACCELO, 1
                  asm: _LoopFillYPe:
                  asm: SBIW      _ACCBLO, 1
                  asm: BRNE      _LoopFillYP
                endif;
                LCD_CS:= true;
              |

    dtPixel   :
                LCD_CS:= false;
                SetWindow(xs, ys, xs, ys);
                WriteColor(ColorWfg);
                LCD_CS:= true;
              |
  endcase;
  return(0);
end;



Code


procedure InitAll;
begin
  LCD_DDRDATA:= $FF; // data out
  LCD_DDRCTRL:= LCD_DDRCTRL or (LCD_WRmask or LCD_RDmask or LCD_RSTmask or LCD_RSmask or LCD_CSmask);  // set to output
  LCD_DDRCTRL:= LCD_DDRCTRL and (not LCD_IRQmask);  // Touch IRQ set as input pin
  Init_Lcd;
end;
TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 67
Posts: 767
Registered: 06 / 2013
Subject:

Re: SSD1963 Frage

 · 
Posted: 28.04.2023 - 19:27  ·  #4
Hallo Thorsten, hier haben wir es doch.
$80 or $40 = 1100 0000

geht aber nicht, warum weiß ich nicht :-)


Gruß Frank

Code

procedure SetRotation(m: TOrientation);  // 0..3,
begin
  LCD_CS:= false;
  WriteRegister($36);
  case m of
    SWITCH_NONE:
                 WriteData(0);
                 _width:= _TFTWIDTH;
                 _height:= _TFTHEIGHT;
               |
    FLIP_X     :
                 WriteData(SSD1963_ADDR_MODE_PAGE_ADDR_ORDER or
                           SSD1963_ADDR_MODE_PAG_COL_ADDR_ORDER);
                 _width:= _TFTHEIGHT;
                 _height:= _TFTWIDTH;
               |
    FLIP_Y     :
                 WriteData(SSD1963_ADDR_MODE_PAGE_ADDR_ORDER or
                           SSD1963_ADDR_MODE_COL_ADDR_ORDER or
                           SSD1963_ADDR_MODE_PAG_COL_ADDR_ORDER);
                 _width:= _TFTWIDTH;
                 _height:= _TFTHEIGHT;
               |
    FLIP_XY    :
                 WriteData(SSD1963_ADDR_MODE_PAGE_ADDR_ORDER or
                           SSD1963_ADDR_MODE_COL_ADDR_ORDER);
                 _width:= _TFTHEIGHT;
                 _height:= _TFTWIDTH;
               |
  endcase;
  LCD_CS:= true;
end;

//SSD1963_ADDR_MODE_PAGE_ADDR_ORDER  = $80
//SSD1963_ADDR_MODE_COL_ADDR_ORDER    = $40
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: SSD1963 Frage

 · 
Posted: 29.04.2023 - 17:24  ·  #5
Hallo Frank,

wo und wie rufst Du die Funktion SetRotation auf? Ich habe es in Deinem Init oder GraphIOS jetzt nicht gesehen?

Kannst Du es am Ende Deines Inits noch auslesen? Bei einigen Treiberbausteinen muss man vor dem CMD oder Data umstellen.
Oder Schreibe mal auf Knopfdruck nach dem ganzen INIT die Werte um.

Thorsten
TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 67
Posts: 767
Registered: 06 / 2013
Subject:

Re: SSD1963 Frage

 · 
Posted: 29.04.2023 - 19:21  ·  #6
Hallo Thorsten, im Grunde ist es das Demo SSD1963 LCDGraphic = 480, 272, 8;


Gruß Frank

Code

{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
  pwm:= 255;
  Init_Port;
  EnableInts($87);

  bb:= 0;
  InitAll;

  mdelay(500);

  SetRotation(SWITCH_NONE);       //FLIP_X FLIP_Y FLIP_XY   SWITCH_NONE
//  SetRotation(FLIP_X);
//  SetRotation(FLIP_Y);
//  SetRotation(FLIP_XY);
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: SSD1963 Frage

 · 
Posted: 02.05.2023 - 12:57  ·  #7
Hallo Frank,

sendest Du nach dem SetRotation() überhaupt Daten an deinen Screen? Soweit ich weiss ändert er erst etwas an dem Screen wenn er neue Daten erhält.

Und konntest Du die Adresse mal auslesen?

Thorsten
TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 67
Posts: 767
Registered: 06 / 2013
Subject:

Re: SSD1963 Frage

 · 
Posted: 02.05.2023 - 17:02  ·  #8
Hallo Thorsten, nach dem SetRotation() wird eine Procedure Hauptmenue aufgebaut.
Die Adresse stimmt auch. WriteRegister($36); Bit7=1 Bit6=1



Gruß Frank
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 16 · Cache Hits: 15   142   157 · Page-Gen-Time: 0.034901s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI