找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1440|回复: 0
收起左侧

HC32F460单片机XPT2046触摸程序

[复制链接]
ID:687759 发表于 2022-7-16 21:04 | 显示全部楼层 |阅读模式
中考结束,成绩不错重点高中,更新帖子。这次带来的是触摸的使用我用的是RTrobot 家的2.4寸带触摸屏幕(某一个宝找不到pdd有),MCU是HC32F460kcta。飞点也解决的比较好具体的大家看代码。

单片机xpt2046源程序如下
  1. #include "xpt2046.h"

  2. void XPT2046_init(void)
  3. {
  4.     stc_port_init_t stcPortInit;
  5.     /* configuration structure initialization */
  6.     MEM_ZERO_STRUCT(stcPortInit);

  7.     stcPortInit.enPinMode = Pin_Mode_Out;
  8.     stcPortInit.enExInt = Enable;
  9.     stcPortInit.enPullUp = Enable;

  10.     PORT_Init(XPT2046_PIN_PORT ,XPT2046_CS_PIN , &stcPortInit);
  11.     stcPortInit.enPinMode = Pin_Mode_In;
  12.     PORT_Init(XPT2046_PIN_PORT ,XPT2046_PEN_PIN , &stcPortInit);
  13.     PORT_Unlock();
  14.     M4_PORT->PSPCR  = 0x0Bu;
  15.     PORT_Lock();

  16.     XPT2046_CS_Set();
  17. }

  18. void send_8way(uint8_t data)
  19. {

  20.     while (Reset == SPI_GetFlag(SPI_UNIT, SpiFlagSpiIdle))
  21.     {}        
  22.     SPI_SendData8(SPI_UNIT,data);   
  23.     while (Reset == SPI_GetFlag(SPI_UNIT,SpiFlagReceiveBufferFull))
  24.     {}   
  25.     SPI_ReceiveData8(SPI_UNIT);   
  26. }

  27. uint8_t receiv_8way(void)
  28. {
  29.     while (Reset == SPI_GetFlag(SPI_UNIT, SpiFlagSpiIdle))
  30.     {}        
  31.     SPI_SendData8(SPI_UNIT,0x00);
  32.     while (Reset == SPI_GetFlag(SPI_UNIT,SpiFlagReceiveBufferFull))
  33.     {}
  34.     return SPI_ReceiveData8(SPI_UNIT);            
  35. }


  36. int cmp(const void *a, const void *b)
  37. {
  38.     return *(uint16_t *)a - *(uint16_t *)b; //从小到大排序(b-a则是从大到小)。需要与被测类型一致,否则排序乱七八糟
  39. }

  40. static const uint8_t count = REPEATED_SAMPLING_TIMES; //采集次数
  41. u16 x_data[count], y_data[count];
  42. void XPT2046_Rd_Addata(uint16_t *rxdata,uint16_t *rydata)
  43. {
  44.     if(PORT_GetBit(XPT2046_PIN_PORT,XPT2046_PEN_PIN)==Reset)//触摸按下了
  45.     {   
  46.     Ddl_Delay1ms(30);
  47.     if(PORT_GetBit(XPT2046_PIN_PORT,XPT2046_PEN_PIN)==Reset)
  48.     {
  49.     XPT2046_CS_Clr();
  50.     SPI_SetClockDiv(SPI_UNIT,SpiClkDiv32);
  51.     Ddl_Delay1us(10);
  52.     for (uint8_t i = 0; i < count; i++)
  53.     {
  54.         send_8way(0xd0); //发送命令
  55.         Ddl_Delay1us(8);
  56.         xdata = receiv_8way();
  57.         xdata <<= 8;
  58.         xdata |= receiv_8way();
  59.         xdata >>= 3;
  60.         x_data[i] = xdata & 0xFFF;

  61.         send_8way(0x90);
  62.         Ddl_Delay1us(8);
  63.         ydata = receiv_8way();
  64.         ydata <<= 8;        
  65.         ydata |= receiv_8way();
  66.         ydata >>= 3;
  67.         y_data[i] = ydata & 0xFFF;
  68.         Ddl_Delay1us(200);
  69.     }
  70.     qsort(x_data, count, sizeof(x_data[0]), cmp); //stdlib.h里的排序函数
  71.     qsort(y_data, count, sizeof(y_data[0]), cmp);
  72.     *rydata = x_data[count >> 1]; //取中间值,因为是横屏所以XY是反的
  73.     *rxdata = y_data[count >> 1];
  74.     XPT2046_CS_Set();
  75.     }   
  76.     }
  77. }
  78. void Show_circle(u16 x,u16 y,u16 c)
  79. {
  80.     Draw_Circle(x,y,10,c);
  81.     LCD_DrawLine(x-10,y,x+10,y,c);
  82.     LCD_DrawLine(x,y-10,x,y+10,c);   
  83. }
  84. void Touch_Adjust(float32_t *xdata,float32_t *ydata)
  85. {
  86.     uint16_t x1_data,y1_data,x2_data,y2_data;
  87.     LCD_ShowString(0,200,"Please click on the red dot wait 5s",BLACK,WHITE,16,0);
  88.     Show_circle(10,10,RED);
  89.     Ddl_Delay1ms(3000);
  90.     XPT2046_Rd_Addata(&x1_data,&y1_data);   
  91.     Ddl_Delay1ms(2000);
  92.     LCD_ShowString(0,200,"Please click on the green dot wait 5s",BLACK,WHITE,16,0);
  93.     Show_circle(310,230,GREEN);
  94.     Ddl_Delay1ms(3000);
  95.     XPT2046_Rd_Addata(&x2_data,&y2_data);   
  96.     Ddl_Delay1ms(2000);
  97.     *xdata = (float32_t)(x2_data-x1_data)/(300);
  98.     *ydata = (float32_t)(y1_data-y2_data)/(220);

  99.    
  100.     LCD_Fill(0,0,320,240,WHITE);
  101.     LCD_ShowString(0,200,"You are good",BLACK,WHITE,16,0);
  102.    
  103. }

  104. void XPT2046_getPoint(u16 *x, u16 *y)
  105. {
  106.     uint16_t xdata=0,ydata=0;
  107.     XPT2046_Rd_Addata(&xdata,&ydata);
  108.     *x = (u16)xdata/11.1633329-15;//由于扫描方式的不同这里的参数需要根据实际修改.  
  109.     *y = (u16)ydata/-15.4863634+255;

  110. }

复制代码

main
  1. #include "hc32_ddl.h"
  2. #include "Kthermocouple.h"
  3. #include "userADC.h"
  4. #include "userUSART.h"
  5. #include "userSPI.h"
  6. #include "userPWM.h"
  7. #include "ev_hc32f460_lqfp100_v2.h"
  8. #include "rtthread.h"
  9. #include "lcd.h"
  10. #include "xpt2046.h"

  11. static void touch_thread_init(void);
  12. static struct rt_thread touch_thread;
  13. ALIGN(RT_ALIGN_SIZE)
  14. static rt_uint8_t rt_touch_thread_stack[1024];
  15. static void touch_thread_entry(void * para);
  16. static rt_uint8_t touch_thread_priority = 6;


  17. /**
  18. *******************************************************************************
  19. ** \brief  Main function of template project
  20. **
  21. ** \param  None
  22. **
  23. ** \retval int32_t return value, if needed
  24. **
  25. ******************************************************************************/
  26. int32_t main(void)
  27. {
  28.         SPI1_Init();
  29.         XPT2046_init();
  30.         LCD_Init();               
  31.         LCD_Fill(0,0,320,240,WHITE);
  32.         Ddl_Delay1ms(1000);
  33.         touch_thread_init();
  34. }

  35. static void touch_thread_init(void)
  36. {
  37.         rt_thread_init(&touch_thread,
  38.                                         "touch_thread",
  39.                                         touch_thread_entry,
  40.                                         RT_NULL,
  41.                                         &rt_touch_thread_stack,
  42.                                         sizeof(rt_touch_thread_stack),
  43.                                         touch_thread_priority,
  44.                                         20);//时间 20ms
  45.         rt_thread_startup(&touch_thread);
  46. }

  47. static void touch_thread_entry(void * para)
  48. {
  49.         u16 tx=0,ty=0;
  50.     DDL_Printf("touch_thread_runing. \r\n");
  51.     while(1)
  52.     {
  53.                 if(PORT_GetBit(XPT2046_PIN_PORT,XPT2046_PEN_PIN)==Reset)
  54.                 {
  55.                 XPT2046_getPoint(&tx,&ty);
  56.                 LCD_Fill(tx-2,ty-2,tx+2,ty+2,RED);
  57.                 }
  58.        
  59.     }
  60. }


复制代码


Keil代码下载:
HC32F460TOUCH工程.7z (2.8 MB, 下载次数: 32)

评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表