Fórum témák

» Több friss téma
Fórum » XPT2046 driver PIC32-höz (mikroC)
 
Témaindító: forgofe, idő: Aug 15, 2014
Témakörök:
Lapozás: OK   1 / 1
(#) forgofe hozzászólása Aug 15, 2014 /
 
Sziasztok!
Szeretnék egy MP3 lejátszót készíteni PIC32-vel, és egy érintőkijelzőn megvalósítani a felhasználói interakciót. Az MP3 lejátszást egy VS1053B modullal csináltam meg, amely már működik. A kijelző egy 4,3"-os TFT amelyet SSD1963 vezérlő IC hajt meg, és ehhez jön hozzá egy XPT2046-os Touch vezérlő IC. Pontosan egy ilyen modulról lenne szó:
http://www.ebay.com/itm/4-3-TFT-LCD-Module-Display-Touch-Panel-Scre...0a2eeb
A problémám pedig az, hogy az XPT2046-os Touch Driver IC-t nem tudom működésre bírni már hosszú ideje, és ehhez szeretnék segítséget kérni. Sok helyen írják, hogy egyszerűen meglehet írni a datasheetből is, oké de nem értem teljesen hogy mit kell nézni benne :\ pl kiküldik SPI-n ugyebár a 0x90-et és aztán kiolvassák az Y koordinátát, erre már rájöttem sok példa kódból de nem értem ezt hol nézik ki a datasheetben.?
Itt lenne a datasheet linkje: ftp://imall.iteadstudio.com/LCD_Panel/IM120905004/DS_XPT2046.pdf

Ha valaki tudna segíteni nagyon hálás lennék érte

A kód pedig a következő amivel próbálkoztam:

  1. // TFT module connections
  2. char TFT_DataPort at LATE;
  3. char TFT_DataPort_Direction at TRISE;
  4. sbit TFT_RST at LATC1_bit;
  5. sbit TFT_BLED at LATD2_bit;
  6. sbit TFT_RS at LATB15_bit;
  7. sbit TFT_CS at LATF12_bit;
  8. sbit TFT_RD at LATD5_bit;
  9. sbit TFT_WR at LATD4_bit;
  10. sbit TFT_RST_Direction at TRISC1_bit;
  11. sbit TFT_BLED_Direction at TRISD2_bit;
  12. sbit TFT_RS_Direction at TRISB15_bit;
  13. sbit TFT_CS_Direction at TRISF12_bit;
  14. sbit TFT_RD_Direction at TRISD5_bit;
  15. sbit TFT_WR_Direction at TRISD4_bit;
  16.  
  17. sbit SoftSpi_SDI at LATD0_bit;
  18. sbit SoftSpi_SDO at LATC4_bit;
  19. sbit SoftSpi_CLK at LATD10_bit;
  20.  
  21. sbit SoftSpi_SDI_Direction at TRISD0_bit;
  22. sbit SoftSpi_SDO_Direction at TRISC4_bit;
  23. sbit SoftSpi_CLK_Direction at TRISD10_bit;
  24.  
  25.  
  26. sbit T_CS at LATA14_bit;
  27. sbit T_CS_Direction at TRISA14_bit;
  28. sbit T_Penirq at LATA1_bit;
  29. sbit T_Penirq_Direction at TRISA1_bit;
  30. unsigned int T_x,T_y;
  31. unsigned int TP_x = 0, TP_y = 0;
  32. unsigned int proba=321;
  33. char probat[7];
  34. char txtx[7];
  35. char txty[7];
  36.  
  37. unsigned char tacsie(void)
  38. {
  39.     if (PORTAbits.RA1==0)        // is SW1 pressed?
  40.     {                            //yes
  41.         delay_ms(10);            // wait 10mS for debounce.
  42.         if (LATAbits.LATA1==0)    // is SW1 still has pressed status after 10mS delay?
  43.         {                        // yes, we have key press
  44.             return 1;
  45.         }
  46.     }
  47.     return 0;// if key is not pressed, return 0
  48. }
  49.  
  50. void touch_Init()
  51. {
  52.     T_CS = 1;
  53.     SoftSPI_CLK = 1;
  54.     SoftSPI_SDI = 1;
  55.     SoftSPI_CLK = 1;
  56.     TFT_Write_Text("------------------------------", 5, 50);
  57.     TFT_Write_Text("Touch initialized...", 5, 60);
  58. }
  59.  
  60.  
  61. void WriteCharTo7843(unsigned char num)
  62. {
  63.  
  64. unsigned char count=0;
  65. SoftSpi_CLK = 0;
  66. for(count=0;count<8;count++)
  67. {
  68. if (num&0x80)
  69.    {SoftSpi_SDI = 1;}
  70. else
  71.    {SoftSpi_SDI = 0;}
  72. num = num<<1;
  73. SoftSpi_CLK = 0; asm nop; asm nop; asm nop;
  74. SoftSpi_CLK = 1; asm nop; asm nop; asm nop;
  75. }
  76. TFT_Write_Text("Write char", 5, 80);
  77. }
  78.  
  79. //**********************************************************
  80.  
  81. unsigned int ReadFromCharFrom7843()
  82. {
  83.  
  84. unsigned char count=0;
  85. unsigned int num=0;
  86. for(count=0;count<12;count++)
  87. {
  88. num = num<<1;
  89. SoftSpi_CLK = 1; asm nop; asm nop; asm nop;
  90. SoftSpi_CLK = 0; asm nop; asm nop; asm nop;
  91. if(SoftSpi_SDO == 1) num++;
  92. }
  93. TFT_Write_Text("Read char", 5, 100);
  94. return(num);
  95. }
  96.  
  97.  
  98. //**********************************************************
  99.  
  100. void touch_GetAdXY()
  101. {
  102. T_CS = 0;
  103. TFT_Write_Text("GET ADXY", 5, 120);
  104. WriteCharTo7843(0x90);
  105. SoftSpi_CLK = 1; asm nop; asm nop; asm nop; asm nop;
  106. SoftSpi_CLK = 0; asm nop; asm nop; asm nop; asm nop;
  107. T_y = ReadFromCharFrom7843();
  108. WriteCharTo7843(0xD0);
  109. SoftSpi_CLK = 1; asm nop; asm nop; asm nop; asm nop;
  110. SoftSpi_CLK = 0; asm nop; asm nop; asm nop; asm nop;
  111. T_x = ReadFromCharFrom7843();
  112.  
  113.  
  114. T_CS = 1;
  115.  
  116.       TP_x =  abs(abs(T_x>>4)-255);      //abs(T_x>>4); to reverse x position!
  117.       if (TP_x==255) TP_x=0;
  118.       TP_y = (((abs((T_y>>4)-255))*10)/7);
  119.  
  120.  
  121. }
  122. void Drow_Touch_Point(unsigned int x,unsigned int y)
  123. {     TFT_Set_Pen(CL_BLACK, 2);
  124.         TFT_Line(x-4,y,x+5,y);
  125.         TFT_Line(x,y-4,x,y+5);
  126.         TFT_Dot(x+1,y+1,CL_BLACK);
  127.         TFT_Dot(x-1,y+1,CL_BLACK);
  128.         TFT_Dot(x+1,y-1,CL_BLACK);
  129.         TFT_Dot(x-1,y-1,CL_BLACK);
  130.  
  131.         TFT_Set_Font(TFT_defaultFont, CL_RED , FO_HORIZONTAL);
  132.         TFT_Write_Text("D-Amp TFT Calibration", 70,5);
  133.         TFT_Circle(x,y,3);
  134. }
  135.  
  136.  
  137. void position_T()
  138. {
  139.  
  140. unsigned int lx = 0;
  141. unsigned int ly = 30;
  142. unsigned char ss[6];
  143.  
  144.  
  145.    TFT_Fill_Screen(CL_WHITE);
  146.   TFT_Set_Font(TFT_defaultFont, CL_RED , FO_HORIZONTAL);
  147.  
  148.  
  149.  
  150.             while(1){
  151.  
  152.                touch_GetAdXY();
  153.  
  154.  
  155.                IntToStr(TP_x,ss);
  156.                TFT_Write_Text("PosX1:",lx,ly);
  157.                TFT_Write_Text(ss,lx+60,ly);
  158.  
  159.                IntToStr(TP_y,ss);
  160.                TFT_Write_Text("PosY1:",lx,ly+20);
  161.                TFT_Write_Text(ss,lx+60,ly+20);
  162.  
  163.                  Drow_Touch_Point(TP_y-10,TP_x-10);
  164.  
  165.                /*if(tacsie() == 1){
  166.  
  167.  
  168.                TFT_Write_Text("Touched",5,160);
  169.                }
  170.                      */
  171.                delay_ms(50);
  172.  
  173.                }
  174.  
  175.  
  176.  
  177.  
  178. }
  179.  
  180.  
  181.  
  182. void PMPWaitBusy() {
  183.   while(PMMODEbits.BUSY);
  184. }
  185.  
  186. void Set_Index(unsigned short index) {
  187.   TFT_RS = 0;
  188.   PMDIN = index;
  189.   TFT_RS = 1;
  190. }
  191.  
  192. void Write_Command( unsigned short cmd ) {
  193.   PMDIN = cmd;
  194. }
  195.  
  196. void Write_Data(unsigned int _data) {
  197.   PMDIN = _data;
  198. }
  199. void Set_BackLight(unsigned short Bkl)
  200. {
  201.  TFT_CS = 0;
  202.  Set_Index(0xBE);                //set PWM for B/L
  203.  Write_Command(0x06);
  204.  Write_Command(Bkl);
  205.  Write_Command(0x01);
  206.  Write_Command(0xf0);
  207.  Write_Command(0x00);
  208.  Write_Command(0x00);
  209.  TFT_CS = 1;
  210. }
  211.  
  212. Init_Screen(){
  213. // PMP setup
  214.   PMMODE = 0;
  215.   PMAEN  = 0;
  216.   PMCON  = 0;  // WRSP: Write Strobe Polarity bit
  217.   PMMODEbits.MODE = 2;     // Master 2
  218.   PMMODEbits.WAITB = 0;
  219.   PMMODEbits.WAITM = 1;
  220.   PMMODEbits.WAITE = 0;
  221.   PMMODEbits.MODE16 = 1;   // 16 bit mode
  222.   PMCONbits.CSF = 0;
  223.   PMCONbits.PTRDEN = 1;
  224.   PMCONbits.PTWREN = 1;
  225.   PMCONbits.PMPEN = 1;
  226.   TFT_Set_Active(Set_Index,Write_Command,Write_Data);
  227.   Set_BackLight(0x80);
  228.   TFT_Init_SSD1963(480, 272);
  229.  
  230.   TFT_Fill_Screen(CL_WHITE);
  231. TFT_Set_Font(TFT_defaultFont, CL_BLACK , FO_HORIZONTAL);
  232. Soft_SPI_Init();
  233. TFT_Write_Text("System ready...", 5, 0);
  234. }
  235.  
  236. void main() {
  237. AD1PCFG = 0xFFFF;                   // Configure AN pins as digital I/O
  238. Init_Screen();
  239.  
  240. touch_Init();
  241.  
  242. while(1){
  243.  Drow_Touch_Point(Tp_x,Tp_y);
  244.   //position_T();
  245.  //touch_GetAdXY();
  246.  
  247.   /* IntToStr(proba,probat);
  248.    TFT_Write_Text(probat, 40, 20);
  249.    IntToStr(T_y,txty);
  250.    IntToStr(T_x,txtx);
  251.    TFT_Write_Text("X:", 5, 20);
  252.    TFT_Write_Text(txtx, 20, 20);
  253.    TFT_Write_Text("Y:", 5, 40);
  254.    TFT_Write_Text(txty, 20, 40);   */
  255.    Delay_Ms(10);
  256.   }
  257. }
(#) wartness hozzászólása Nov 5, 2014 /
 
Üdv!
Remélem segít egy kicsit.
(#) forgofe válasza wartness hozzászólására (») Nov 5, 2014 /
 
Üdv!
Igen néztem ezt a kódot, de sajnos nálam ez nem működött. Ezért egy másik megoldáshoz folyamodtam, de sikerült megoldani íme a kód:
  1. // Global variables
  2. unsigned int Xcoord, Ycoord;
  3. char PenDown;
  4. void *PressedObject;
  5. int PressedObjectType;
  6. unsigned int caption_length, caption_height;
  7. unsigned int display_width=480, display_height=272;
  8.  
  9. sbit SPI_TP_CS at LATA7_bit;
  10. sbit SPI_TP_CS_Direction at TRISA7_bit;
  11. sbit SPI_TP_IRQ at LATE9_bit;
  12. sbit SPI_TP_IRQ_Direction at TRISE9_bit;
  13.   unsigned int x, y;
  14.   unsigned int x_min=450, x_max=3500, y_min=280, y_max=3700;
  15.  
  16. void SPI_TP_Init() {
  17.   SPI_TP_CS_Direction = 0;
  18.   SPI_TP_IRQ_Direction = 1;
  19.   SPI_TP_CS = 1;
  20.  
  21.   Xcoord = 0;
  22.   Ycoord = 0;
  23. }
  24. char xkoord[7];
  25. char ykoord[7];
  26. extern unsigned int color;
  27. extern unsigned int enableDRAW;
  28. void SPI_TP_Check() {
  29. if(SPI_TP_IRQ == 1) {
  30.     if(SPI_TP_Get_Coordinates(&Xcoord, &Ycoord) == 0) {
  31.       Process_TP_Press(Xcoord, Ycoord);
  32.         delay_ms(100); // Anti rebond
  33.         if(enableDRAW==1) {
  34.       TFT_Dot(Xcoord, Ycoord, color);
  35.       TFT_Dot(Xcoord + 1, Ycoord, color);
  36.       TFT_Dot(Xcoord,Ycoord + 1, color);
  37.       TFT_Dot(Xcoord + 1, Ycoord + 1, color);
  38.       }
  39.     }
  40.   }
  41. }
  42.  
  43. unsigned int SPI_TP_Read_Once(char address) {
  44.   unsigned int val;
  45.  
  46.   SPI2_Write(address);
  47.  
  48.   val = SPI2_Read(0);
  49.   val <<= 8;
  50.   val += SPI2_Read(0);
  51.   val >>= 3;
  52.  
  53.   return val;
  54. }
  55.  
  56. unsigned int xregi=0;
  57.   char SPI_TP_Get_Coordinates(unsigned int *x_coordinate, unsigned int *y_coordinate) {
  58.  
  59.   float x_div=11.213235294, y_div=7.125;
  60.  
  61.   SPI_TP_CS = 0;
  62.   SPI2_Init_Advanced(_SPI_MASTER, _SPI_8_BIT,80, _SPI_SS_DISABLE, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_IDLE_2_ACTIVE);
  63.     y = SPI_TP_Read_Once(0xD0);
  64.     x = SPI_TP_Read_Once(0x90);
  65.  
  66.  
  67.   y=abs((y-3830))/y_div;
  68.   x=abs((x-3600))/x_div;
  69.  
  70.   SPI_TP_CS = 1;
  71.  
  72.   Xcoord=y;
  73.   Ycoord=x;
  74.   return 0;
  75.  
  76. }


Ez már visual TFT-s projektekkel is működik teljesen mértékben.
Következő: »»   1 / 1
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem