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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2141|回復: 2
打印 上一主題 下一主題
收起左側

STM32F103c使用xpt2046觸摸屏 Arduino下載的庫不能自定義MOSI、MISO、SCLK的引腳

[復制鏈接]
跳轉到指定樓層
樓主
ID:579197 發表于 2020-1-9 18:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
按照網上的帖子將兩塊STM32F103C刷成了arduino的bootland,終于可以直接USB口上傳IDE編程了,可是沒有支持STM32的xpt2046觸摸屏的庫,主要是因為XPT2046是SPI接口的,Arduino下載的庫只能自定義CS和IRQ引腳,不能自定義MOSI、MISO、SCLK的引腳,請問各位大神有沒有解決辦法呢?謝謝各位了。這是庫文件。

單片機源程序如下:

  1. #include "XPT2046_Touchscreen.h"

  2. #define Z_THRESHOLD     400
  3. #define Z_THRESHOLD_INT        75
  4. #define MSEC_THRESHOLD  3
  5. #define SPI_SETTING     SPISettings(2000000, MSBFIRST, SPI_MODE0)

  6. static XPT2046_Touchscreen         *isrPinptr;
  7. void isrPin(void);

  8. bool XPT2046_Touchscreen::begin()
  9. {
  10.         SPI.begin();
  11.         pinMode(csPin, OUTPUT);
  12.         digitalWrite(csPin, HIGH);
  13.         if (255 != tirqPin) {
  14.                 pinMode( tirqPin, INPUT );
  15.                 attachInterrupt(digitalPinToInterrupt(tirqPin), isrPin, FALLING);
  16.                 isrPinptr = this;
  17.         }
  18.         return true;
  19. }

  20. #ifdef ESP32
  21. void IRAM_ATTR isrPin( void )
  22. #else
  23. void isrPin( void )
  24. #endif
  25. {
  26.         XPT2046_Touchscreen *o = isrPinptr;
  27.         o->isrWake = true;
  28. }

  29. TS_Point XPT2046_Touchscreen::getPoint()
  30. {
  31.         update();
  32.         return TS_Point(xraw, yraw, zraw);
  33. }

  34. bool XPT2046_Touchscreen::tirqTouched()
  35. {
  36.         return (isrWake);
  37. }

  38. bool XPT2046_Touchscreen::touched()
  39. {
  40.         update();
  41.         return (zraw >= Z_THRESHOLD);
  42. }

  43. void XPT2046_Touchscreen::readData(uint16_t *x, uint16_t *y, uint8_t *z)
  44. {
  45.         update();
  46.         *x = xraw;
  47.         *y = yraw;
  48.         *z = zraw;
  49. }

  50. bool XPT2046_Touchscreen::bufferEmpty()
  51. {
  52.         return ((millis() - msraw) < MSEC_THRESHOLD);
  53. }

  54. static int16_t besttwoavg( int16_t x , int16_t y , int16_t z ) {
  55.   int16_t da, db, dc;
  56.   int16_t reta = 0;
  57.   if ( x > y ) da = x - y; else da = y - x;
  58.   if ( x > z ) db = x - z; else db = z - x;
  59.   if ( z > y ) dc = z - y; else dc = y - z;

  60.   if ( da <= db && da <= dc ) reta = (x + y) >> 1;
  61.   else if ( db <= da && db <= dc ) reta = (x + z) >> 1;
  62.   else reta = (y + z) >> 1;   //    else if ( dc <= da && dc <= db ) reta = (x + y) >> 1;

  63.   return (reta);
  64. }

  65. // TODO: perhaps a future version should offer an option for more oversampling,
  66. //       with the RANSAC algorithm https://en.wikipedia.org/wiki/RANSAC

  67. void XPT2046_Touchscreen::update()
  68. {
  69.         int16_t data[6];

  70.         if (!isrWake) return;
  71.         uint32_t now = millis();
  72.         if (now - msraw < MSEC_THRESHOLD) return;
  73.        
  74.         SPI.beginTransaction(SPI_SETTING);
  75.         digitalWrite(csPin, LOW);
  76.         SPI.transfer(0xB1 /* Z1 */);
  77.         int16_t z1 = SPI.transfer16(0xC1 /* Z2 */) >> 3;
  78.         int z = z1 + 4095;
  79.         int16_t z2 = SPI.transfer16(0x91 /* X */) >> 3;
  80.         z -= z2;
  81.         if (z >= Z_THRESHOLD) {
  82.                 SPI.transfer16(0x91 /* X */);  // dummy X measure, 1st is always noisy
  83.                 data[0] = SPI.transfer16(0xD1 /* Y */) >> 3;
  84.                 data[1] = SPI.transfer16(0x91 /* X */) >> 3; // make 3 x-y measurements
  85.                 data[2] = SPI.transfer16(0xD1 /* Y */) >> 3;
  86.                 data[3] = SPI.transfer16(0x91 /* X */) >> 3;
  87.         }
  88.         else data[0] = data[1] = data[2] = data[3] = 0;        // Compiler warns these values may be used unset on early exit.
  89.         data[4] = SPI.transfer16(0xD0 /* Y */) >> 3;        // Last Y touch power down
  90.         data[5] = SPI.transfer16(0) >> 3;
  91.         digitalWrite(csPin, HIGH);
  92.         SPI.endTransaction();
  93.         //Serial.printf("z=%d  ::  z1=%d,  z2=%d  ", z, z1, z2);
  94.         if (z < 0) z = 0;
  95.         if (z < Z_THRESHOLD) { //        if ( !touched ) {
  96.                 // Serial.println();
  97.                 zraw = 0;
  98.                 if (z < Z_THRESHOLD_INT) { //        if ( !touched ) {
  99.                         if (255 != tirqPin) isrWake = false;
  100.                 }
  101.                 return;
  102.         }
  103.         zraw = z;
  104.        
  105.         // Average pair with least distance between each measured x then y
  106.         //Serial.printf("    z1=%d,z2=%d  ", z1, z2);
  107.         //Serial.printf("p=%d,  %d,%d  %d,%d  %d,%d", zraw,
  108.                 //data[0], data[1], data[2], data[3], data[4], data[5]);
  109.         int16_t x = besttwoavg( data[0], data[2], data[4] );
  110.         int16_t y = besttwoavg( data[1], data[3], data[5] );
  111.        
  112.         //Serial.printf("    %d,%d", x, y);
  113.         //Serial.println();
  114.         if (z >= Z_THRESHOLD) {
  115.                 msraw = now;        // good read completed, set wait
  116.                 switch (rotation) {
  117.                   case 0:
  118.                         xraw = 4095 - y;
  119.                         yraw = x;
  120.                         break;
  121.                   case 1:
  122.                         xraw = x;
  123.                         yraw = y;
  124.                         break;
  125.                   case 2:
  126.                         xraw = y;
  127.                         yraw = 4095 - x;
  128.                         break;
  129.                   default: // 3
  130.                         xraw = 4095 - x;
  131.                         yraw = 4095 - y;
  132.                 }
  133.         }
  134. }
復制代碼

所有資料51hei提供下載:
XPT2046_Touchscreen.zip (3.56 KB, 下載次數: 7)

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

使用道具 舉報

沙發
ID:579197 發表于 2020-1-11 23:37 | 只看該作者
這個是專門寫個STM32用arduino的驅動親測XPT2046可以正常驅動,MOSI、CLK、MISO用硬SPI就行了。
回復

使用道具 舉報

板凳
ID:579197 發表于 2020-1-11 23:38 | 只看該作者
Serasidis_XPT2046_touch.zip (7.2 KB, 下載次數: 12)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产区精品视频 | 久久网站黄 | 在线色网| 亚洲国产高清高潮精品美女 | 2020天天操 | 成人av免费在线观看 | 日韩色视频 | 日韩在线播放av | 视频一区在线 | 久久久久九九九女人毛片 | 久久久精品影院 | 日韩欧美在线播放 | 国产一区视频在线 | 久久久久国产一区二区三区四区 | 热re99久久精品国产99热 | 亚洲日韩中文字幕一区 | 大象一区 | 国产不卡视频 | 亚洲在线一区二区 | 97色免费视频 | 青青草av网站 | 欧美在线一区二区三区 | 亚洲综合大片69999 | 不卡av在线 | 国产高清视频一区二区 | 最新av在线网址 | 精品av | 亚洲 欧美 另类 日韩 | 成人综合一区二区 | 污书屋 | 免费黄色的网站 | 久久午夜精品 | 精品国产乱码久久久久久果冻传媒 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 国产四区 | 成人高潮片免费视频欧美 | 欧美精品一 | 日日夜夜免费精品视频 | 亚洲 欧美 综合 | 在线观看国产网站 | 激情六月丁香 |