在神州IV开发板上为STemWin 5.22加入触屏驱动

前面在神州IV开发板上成功移植 STemWin 5.22,这次为这个3.0的TFT 屏加入触屏驱动,操作步骤如下:

1,打开前文的基于STM3210C-EVAL的STemWinDemo工程,在和stm3210c_eva_lcd.c 相同的目录下加入ARMJISHU_TouchScreen_ADS7843.c和ARMJISHU_TouchScreen_ADS7843.h文件,并更名为TouchScreen_ADS7843.c 和 TouchScreen_ADS7843.h,然后将其加到工程中,结果如下。

2,打开TouchScreen_ADS7843.c 文件,定位到15行附近,加入下面代码

#include "GUI_Type.h"
#include "GUI.h"

#include "stm32f10x_tim.h"

然后定位到332行附近,加入下面代码

/*=====================================================================*/
void ADS7843_TouchScreen(void)
{
  u16 xdata, ydata;
  u32 xScreen, yScreen;
  static u16 sDataX,sDataY;
  GUI_PID_STATE TS_State;   
// printf("\n\r ARMJISHU_TouchScreen_ADS7843 \n\r");
  ADS7843_Rd_Addata(&xdata, &ydata);
  xScreen = _AD2X(ydata);
  yScreen = _AD2Y(xdata);

   //xScreen = 320 - ((ydata*320)>>12);
   //yScreen = (xdata*240)>>12;
  //printf("\n\r (0x%x, 0x%x), (%d, %d)", xdata, ydata, xScreen, yScreen);
  if((xScreen>1)&&(yScreen>1)&&(xScreen<320-1)&&(yScreen<240-1))
  {
      //printf("\n\r%d,%d", xScreen, yScreen);
      if((GPIO_ADS7843_INT_VALID) && distence(sDataX,xScreen) && distence(sDataY,yScreen))
      {
       
          //LCD_BIG_POINT(xScreen, yScreen);

          TS_State.x = xScreen; TS_State.y = yScreen;

          TS_State.Pressed = 1;//(ts->TouchDetected == 0x80);

          TS_State.Layer = 0; 

          GUI_TOUCH_StoreStateEx(&TS_State);           
      }
      sDataX = xScreen;
      sDataY = yScreen;
  } 

}

然后定位到93行附近,注释掉下面代码

//在屏上画点或线

/*

static void LCD_BIG_POINT(u16 xScreen, u16 yScreen)

 {  

 ili9320_SetPoint(xScreen, yScreen, Magenta);  

 ili9320_SetPoint(xScreen-1, yScreen, Magenta);  

ili9320_SetPoint(xScreen+1, yScreen, Magenta);  

 ili9320_SetPoint(xScreen, yScreen-1, Magenta);  

ili9320_SetPoint(xScreen, yScreen+1, Magenta);  

ili9320_SetPoint(xScreen-1, yScreen-1, Magenta);  

ili9320_SetPoint(xScreen-1, yScreen+1, Magenta);  

 ili9320_SetPoint(xScreen+1, yScreen-1, Magenta);  

ili9320_SetPoint(xScreen+1, yScreen+1, Magenta); 

 }*/

3,打开TouchScreen_ADS7843.h 文件,定位到69行附近,加入下面代码

void SPI1_SendWord(u16 word);u16 SPI1_RecvWord(void);

void ADS7843_TouchScreen(void);

4,打开stm3210c_eva_ioe.c 文件,定位到109行附近,加入下面代码

/** @defgroup STM3210C_EVAL_IOE_Private_FunctionPrototypes 

* @{  */

 #ifndef USE_SHENZHOU_IV_EVAL

static uint16_t IOE_TS_Read_X(void);

static uint16_t IOE_TS_Read_Y(void);

static uint16_t IOE_TS_Read_Z(void);

#endif

然后定位到183行附近,加入下面代码

  IOE_IOEdgeConfig(IOE_2_ADDR, (uint32_t)(MEMS_INT1_PIN | MEMS_INT2_PIN), (uint32_t)(EDGE_FALLING | EDGE_RISING)); 

 /* Touch Screen controller configuration */

#ifndef USE_SHENZHOU_IV_EVAL  

 IOE_TS_Config();

#endif  

/* ------------------------------------------------------------------------ */

然后定位到275行附近,加入下面代码

#ifndef USE_SHENZHOU_IV_EVAL  

 /* Manage the Touch Screen Interrupts */   

 if (IOE_ITSRC_Source & IOE_ITSRC_TSC) 

{      

/* Enable the Global interrupt */     

IOE_GITCmd(IOE_1_ADDR, ENABLE);                   

 /* Enable the Global GPIO Interrupt */   

 IOE_GITConfig(IOE_1_ADDR, (uint8_t)(IOE_GIT_TOUCH | IOE_GIT_FTH | IOE_GIT_FOV), ENABLE);          

/* Read the GPIO_IT_STA to clear all pending bits if any */   

 I2C_ReadDeviceRegister(IOE_1_ADDR, IOE_REG_GPIO_INT_STA);  

 }

#endif  

 /* Configure the Interrupt line as EXTI source */ 

 IOE_EXTI_Config();       

/* If all OK return IOE_OK */ 

 return IOE_OK;

}

然后定位到434行附近,加入下面代码

/**  * @brief  Returns Status and positions of the Touch screen. 

* @param  None 

* @retval Pointer to TS_STATE structure holding Touch Screen information. 

 */

#ifndef USE_SHENZHOU_IV_EVAL TS_STATE* IOE_TS_GetState(void)

uint32_t xDiff, yDiff , x , y, count; 

static uint32_t _x = 0, _y = 0; 

 /* Check if the Touch detect event happenned */ 

TS_State.TouchDetected = (I2C_ReadDeviceRegister(IOE_1_ADDR, IOE_REG_TSC_CTRL) & 0x80); 

 /* Wait till end of ADC conversion */ 

for (count = TS_CONVERSION_DELAY; count > 0; count--);  if(TS_State.TouchDetected)  

 {   

     x = IOE_TS_Read_X();   

    y = IOE_TS_Read_Y();   

    xDiff = x > _x? (x - _x): (_x - x);   

    yDiff = y > _y? (y - _y): (_y - y);          

    if (xDiff + yDiff > 5)  

   {     

      _x = x;     

     _y = y;          

    } 

 }   

  /* Update the X position */ 

 TS_State.X = _x;     

/* Update the Y position */   

TS_State.Y = _y; 

/* Update the Z Pression index */   

TS_State.Z = IOE_TS_Read_Z();     

 /* Clear the interrupt pending bit and enable the FIFO again */ 

 I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_FIFO_STA, 0x01); 

I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_FIFO_STA, 0x00); 

/* Return pointer to the updated structure */ 

return &TS_State;

}

#endif 

然后定位到853行附近,加入下面代码

/**  * @brief  Configures the touch Screen Controller (Single point detection) 

* @param  None 

* @retval IOE_OK if all initializations are OK. Other value if error. 

*/#ifndef USE_SHENZHOU_IV_EVAL

uint8_t IOE_TS_Config(void){  uint8_t tmp = 0;     

/* Enable TSC Fct: already done in IOE_Config */ 

tmp = I2C_ReadDeviceRegister(IOE_1_ADDR, IOE_REG_SYS_CTRL2); 

tmp &= ~(uint32_t)(IOE_TS_FCT | IOE_ADC_FCT); 

 I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_SYS_CTRL2, tmp);    

 /* Enable the TSC gloabl interrupts */ 

tmp = I2C_ReadDeviceRegister(IOE_1_ADDR, IOE_REG_INT_EN); 

tmp |= (uint32_t)(IOE_GIT_TOUCH | IOE_GIT_FTH | IOE_GIT_FOV); 

I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_INT_EN, tmp);    

 /* Select Sample Time, bit number and ADC Reference */ 

 I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_ADC_CTRL1, 0x49);   

/* Wait for ~20 ms */ 

 _delay_(2);     

 /* Select the ADC clock speed: 3.25 MHz */ 

I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_ADC_CTRL2, 0x01);   

 /* Select TSC pins in non default mode */   

tmp = I2C_ReadDeviceRegister(IOE_1_ADDR, IOE_REG_GPIO_AF); 

tmp &= ~(uint8_t)TOUCH_IO_ALL;  I

2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_GPIO_AF, tmp);    

 /* Select 2 nF filter capacitor */ 

 I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_TSC_CFG, 0x9A);      

 /* Select single point reading  */ 

I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_FIFO_TH, 0x01);   

/* Write 0x01 to clear the FIFO memory content. */ 

I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_FIFO_STA, 0x01);   

/* Write 0x00 to put the FIFO back into operation mode  */ 

I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_FIFO_STA, 0x00);   

/* set the data format for Z value: 7 fractional part and 1 whole part */ 

 I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_TSC_FRACT_XYZ, 0x01);   

/* set the driving capability of the device for TSC pins: 50mA */ 

I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_TSC_I_DRIVE, 0x01);   

/* Use no tracking index, touchscreen controller operation mode (XYZ) and      enable the TSC */ 

I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_TSC_CTRL, 0x01);   

/*  Clear all the status pending bits */ 

I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_INT_STA, 0xFF);    

/* Initialize the TS structure to their default values */  

TS_State.TouchDetected = TS_State.X = TS_State.Y = TS_State.Z = 0;   

 /* All configuration done */  return IOE_OK; 

 }

#endif

然后定位到1362行附近,加入下面代码

/**  * @brief  Return Touch Screen X position value 

* @param  None 

* @retval X position. 

*/

#ifndef USE_SHENZHOU_IV_EVAL

static uint16_t IOE_TS_Read_X(void)

 int32_t x, xr;  x = I2C_ReadDataBuffer(IOE_1_ADDR, IOE_REG_TSC_DATA_Y);   

/* first correction */ 

xr =  (x * 320) >> 12; 

/* second correction */ 

 xr = ((xr * 32)/29) - 17;   

 if(xr <= 0)    xr = 0;   

return (uint16_t)(xr);

}

/**  * @brief  Return Touch Screen Y position value 

 * @param  None  * @retval Y position. 

*/

static uint16_t IOE_TS_Read_Y(void)

int32_t y, yr;  y= I2C_ReadDataBuffer(IOE_1_ADDR, IOE_REG_TSC_DATA_X);   

yr= (y * 240) >> 12; 

yr = ((yr * 240) / 217) - 12;   

if(yr <= 0)    yr = 0;   

return (uint16_t)(yr);

}

/**  * @brief  Return Touch Screen Z position value 

* @param  None 

* @retval Z position. 

*/

static uint16_t IOE_TS_Read_Z(void)

uint32_t z; 

z = I2C_ReadDataBuffer(IOE_1_ADDR, IOE_REG_TSC_DATA_Z);     

if(z <= 0)    z = 0;   

return (uint16_t)(z);

}

#endif

5,打开stm32xxx_it.c 文件,定位到44行附近,加入下面代码

/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

extern void ADS7843_TouchScreen(void);
/******************************************************************************/
/*             Cortex-M Processor Exceptions Handlers                         */
/******************************************************************************/


然后定位到139行附近,加入下面代码

/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

extern void ADS7843_TouchScreen(void);
/******************************************************************************/
/*             Cortex-M Processor Exceptions Handlers                         */
/******************************************************************************/


6,打开main.c 文件,定位到96行附近,加入下面代码

  /* Init the STemWin GUI Library */
  GUI_Init();
#ifdef USE_SHENZHOU_IV_EVAL /* 触摸屏初始化 */ ADS7843_Init();#endif
  /* Run the background task */
  while (1)
  {
    if ( ticks++ > 10 )
    {
      ticks = 0;

      /* toggle LED1..4 each 100ms */
      STM_EVAL_LEDToggle(LED1);
      STM_EVAL_LEDToggle(LED2);
      STM_EVAL_LEDToggle(LED3);
      STM_EVAL_LEDToggle(LED4);
    }
#ifndef USE_SHENZHOU_IV_EVAL
    /* Capture input event and updade cursor */
    BSP_Pointer_Update();
#endif
    /* This task is handled periodically, each 10 mS */
    GUI_Delay(10);
  }


7,如果没有意外,编译通过,运行,写上一个“好”字,结果如下。


当然这是有问题的,因为这是光标划过之后留下的影子,正常工作时光标是要下跟着触屏笔一起移动,影子应被擦除掉才行,要是在触屏上写字这样是可以的。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aping_cs_dn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值