久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2159|回復: 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, 下載次數: 33)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文久久 | 999在线精品 | 特级黄一级播放 | 操久久 | 一区在线视频 | 五月综合激情网 | 婷婷久久一区 | 黄色片在线免费看 | 精品久久久久久 | 91精品在线播放 | 一级一片在线观看 | 国产无人区一区二区三区 | 365夜爽爽欧美性午夜免费视频 | 高清久久久 | 中文日韩字幕 | 国产成人精品一区二区三区 | 一区二区三区播放 | 亚洲精品乱码久久久久久按摩观 | www亚洲成人 | 国产美女在线看 | 欧美精品国产精品 | 国产福利资源在线 | 精品一区视频 | 中文字幕乱码一区二区三区 | 日本中文字幕在线视频 | 97人人爱 | 天天综合永久 | 精品成人一区二区 | 成人在线观看亚洲 | 成人精品免费视频 | 自拍偷拍亚洲视频 | 久久久国产精品 | 国产高清在线观看 | 北条麻妃一区二区三区在线观看 | 999精品视频 | 伊人婷婷 | 日韩视频一区 | 永久精品 | 91在线视频播放 | 精品视频久久久 | 午夜成人免费视频 |