极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14334|回复: 10

求助修改Adafruit上的液晶屏驱动库 Adafruit_ILI9341 让其可以做三线SPI显示

[复制链接]
发表于 2015-12-25 15:35:56 | 显示全部楼层 |阅读模式
本帖最后由 自由的Weesky 于 2015-12-25 15:55 编辑

求助修改Adafruit上的液晶屏驱动库

Adafruit_ILI9341 让其可以做三线SPI显示,Adafruit上的库是4线SPI驱动。

愿意支付500元,需要3天搞定
800元明天晚上前搞定

对于熟手来说,不是问题,一晚上改改就好。

提供,库文件参考,说明,

液晶屏电路板,逻辑转换芯片 免费提供一套!

不用发回给我了。


程序写好了,直接发到网站开源。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2015-12-25 15:46:47 | 显示全部楼层
只要3个IO哦 SDA,SCL,CS
根据ILI9341手册,第一个CLK的SDA为低是写命令,第一个CLK的SDA为高是写数据!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-25 15:51:57 | 显示全部楼层
本帖最后由 弘毅 于 2017-10-23 12:40 编辑

这是库文件的.cpp文件。

  1. /***************************************************
  2.   This is our library for the Adafruit ILI9341 Breakout and Shield
  3.   ----> http://www.adafruit.com/products/1651

  4.   Check out the links above for our tutorials and wiring diagrams
  5.   These displays use SPI to communicate, 4 or 5 pins are required to
  6.   interface (RST is optional)
  7.   Adafruit invests time and resources providing this open source code,
  8.   please support Adafruit and open-source hardware by purchasing
  9.   products from Adafruit!

  10.   Written by Limor Fried/Ladyada for Adafruit Industries.
  11.   MIT license, all text above must be included in any redistribution
  12. ****************************************************/

  13. #include "Adafruit_ILI9341.h"
  14. #include <avr/pgmspace.h>
  15. #include <limits.h>
  16. #include "pins_arduino.h"
  17. #include "wiring_private.h"
  18. #include <SPI.h>

  19. // Constructor when using software SPI.  All output pins are configurable.
  20. Adafruit_ILI9341::Adafruit_ILI9341(int8_t cs, int8_t dc, int8_t mosi,
  21.                                    int8_t sclk, int8_t rst, int8_t miso) : Adafruit_GFX(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) {
  22.   _cs   = cs;
  23.   _dc   = dc;
  24.   _mosi  = mosi;
  25.   _miso = miso;
  26.   _sclk = sclk;
  27.   _rst  = rst;
  28.   hwSPI = false;
  29. }


  30. // Constructor when using hardware SPI.  Faster, but must use SPI pins
  31. // specific to each board type (e.g. 11,13 for Uno, 51,52 for Mega, etc.)
  32. Adafruit_ILI9341::Adafruit_ILI9341(int8_t cs, int8_t dc, int8_t rst) : Adafruit_GFX(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) {
  33.   _cs   = cs;
  34.   _dc   = dc;
  35.   _rst  = rst;
  36.   hwSPI = true;
  37.   _mosi  = _sclk = 0;
  38. }

  39. void Adafruit_ILI9341::spiwrite(uint8_t c) {

  40.   //Serial.print("0x"); Serial.print(c, HEX); Serial.print(", ");

  41.   if (hwSPI) {
  42. #if defined (__AVR__)
  43.       uint8_t backupSPCR = SPCR;
  44.     SPCR = mySPCR;
  45.     SPDR = c;
  46.     while(!(SPSR & _BV(SPIF)));
  47.     SPCR = backupSPCR;
  48. #elif defined(TEENSYDUINO)
  49.     SPI.transfer(c);
  50. #elif defined (__arm__)
  51.     SPI.setClockDivider(11); // 8-ish MHz (full! speed!)
  52.     SPI.setBitOrder(MSBFIRST);
  53.     SPI.setDataMode(SPI_MODE0);
  54.     SPI.transfer(c);
  55. #endif
  56.   } else {
  57.     // Fast SPI bitbang swiped from LPD8806 library
  58.     for(uint8_t bit = 0x80; bit; bit >>= 1) {
  59.       if(c & bit) {
  60.         //digitalWrite(_mosi, HIGH);
  61.         *mosiport |=  mosipinmask;
  62.       } else {
  63.         //digitalWrite(_mosi, LOW);
  64.         *mosiport &= ~mosipinmask;
  65.       }
  66.       //digitalWrite(_sclk, HIGH);
  67.       *clkport |=  clkpinmask;
  68.       //digitalWrite(_sclk, LOW);
  69.       *clkport &= ~clkpinmask;
  70.     }
  71.   }
  72. }


  73. void Adafruit_ILI9341::writecommand(uint8_t c) {
  74.   *dcport &=  ~dcpinmask;
  75.   //digitalWrite(_dc, LOW);
  76.   //*clkport &= ~clkpinmask; // clkport is a NULL pointer when hwSPI==true
  77.   //digitalWrite(_sclk, LOW);
  78.   *csport &= ~cspinmask;
  79.   //digitalWrite(_cs, LOW);

  80.   spiwrite(c);

  81.   *csport |= cspinmask;
  82.   //digitalWrite(_cs, HIGH);
  83. }


  84. void Adafruit_ILI9341::writedata(uint8_t c) {
  85.   *dcport |=  dcpinmask;
  86.   //digitalWrite(_dc, HIGH);
  87.   //*clkport &= ~clkpinmask; // clkport is a NULL pointer when hwSPI==true
  88.   //digitalWrite(_sclk, LOW);
  89.   *csport &= ~cspinmask;
  90.   //digitalWrite(_cs, LOW);
  91.   
  92.   spiwrite(c);

  93.   //digitalWrite(_cs, HIGH);
  94.   *csport |= cspinmask;
  95. }

  96. // If the SPI library has transaction support, these functions
  97. // establish settings and protect from interference from other
  98. // libraries.  Otherwise, they simply do nothing.
  99. #ifdef SPI_HAS_TRANSACTION
  100. static inline void spi_begin(void) __attribute__((always_inline));
  101. static inline void spi_begin(void) {
  102.   SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
  103. }
  104. static inline void spi_end(void) __attribute__((always_inline));
  105. static inline void spi_end(void) {
  106.   SPI.endTransaction();
  107. }
  108. #else
  109. #define spi_begin()
  110. #define spi_end()
  111. #endif

  112. // Rather than a bazillion writecommand() and writedata() calls, screen
  113. // initialization commands and arguments are organized in these tables
  114. // stored in PROGMEM.  The table may look bulky, but that's mostly the
  115. // formatting -- storage-wise this is hundreds of bytes more compact
  116. // than the equivalent code.  Companion function follows.
  117. #define DELAY 0x80


  118. // Companion code to the above tables.  Reads and issues
  119. // a series of LCD commands stored in PROGMEM byte array.
  120. void Adafruit_ILI9341::commandList(uint8_t *addr) {

  121.   uint8_t  numCommands, numArgs;
  122.   uint16_t ms;

  123.   numCommands = pgm_read_byte(addr++);   // Number of commands to follow
  124.   while(numCommands--) {                 // For each command...
  125.     writecommand(pgm_read_byte(addr++)); //   Read, issue command
  126.     numArgs  = pgm_read_byte(addr++);    //   Number of args to follow
  127.     ms       = numArgs & DELAY;          //   If hibit set, delay follows args
  128.     numArgs &= ~DELAY;                   //   Mask out delay bit
  129.     while(numArgs--) {                   //   For each argument...
  130.       writedata(pgm_read_byte(addr++));  //     Read, issue argument
  131.     }

  132.     if(ms) {
  133.       ms = pgm_read_byte(addr++); // Read post-command delay time (ms)
  134.       if(ms == 255) ms = 500;     // If 255, delay for 500 ms
  135.       delay(ms);
  136.     }
  137.   }
  138. }


  139. void Adafruit_ILI9341::begin(void) {
  140.   if (_rst > 0) {
  141.     pinMode(_rst, OUTPUT);
  142.     digitalWrite(_rst, LOW);
  143.   }

  144.   pinMode(_dc, OUTPUT);
  145.   pinMode(_cs, OUTPUT);
  146.   csport    = portOutputRegister(digitalPinToPort(_cs));
  147.   cspinmask = digitalPinToBitMask(_cs);
  148.   dcport    = portOutputRegister(digitalPinToPort(_dc));
  149.   dcpinmask = digitalPinToBitMask(_dc);

  150.   if(hwSPI) { // Using hardware SPI
  151. #if defined (__AVR__)
  152.     SPI.begin();
  153.     SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz (full! speed!)
  154.     SPI.setBitOrder(MSBFIRST);
  155.     SPI.setDataMode(SPI_MODE0);
  156.     mySPCR = SPCR;
  157. #elif defined(TEENSYDUINO)
  158.     SPI.begin();
  159.     SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz (full! speed!)
  160.     SPI.setBitOrder(MSBFIRST);
  161.     SPI.setDataMode(SPI_MODE0);
  162. #elif defined (__arm__)
  163.       SPI.begin();
  164.       SPI.setClockDivider(11); // 8-ish MHz (full! speed!)
  165.       SPI.setBitOrder(MSBFIRST);
  166.       SPI.setDataMode(SPI_MODE0);
  167. #endif
  168.   } else {
  169.     pinMode(_sclk, OUTPUT);
  170.     pinMode(_mosi, OUTPUT);
  171.     pinMode(_miso, INPUT);
  172.     clkport     = portOutputRegister(digitalPinToPort(_sclk));
  173.     clkpinmask  = digitalPinToBitMask(_sclk);
  174.     mosiport    = portOutputRegister(digitalPinToPort(_mosi));
  175.     mosipinmask = digitalPinToBitMask(_mosi);
  176.     *clkport   &= ~clkpinmask;
  177.     *mosiport  &= ~mosipinmask;
  178.   }

  179.   // toggle RST low to reset
  180.   if (_rst > 0) {
  181.     digitalWrite(_rst, HIGH);
  182.     delay(5);
  183.     digitalWrite(_rst, LOW);
  184.     delay(20);
  185.     digitalWrite(_rst, HIGH);
  186.     delay(150);
  187.   }

  188.   /*
  189.   uint8_t x = readcommand8(ILI9341_RDMODE);
  190.   Serial.print("\nDisplay Power Mode: 0x"); Serial.println(x, HEX);
  191.   x = readcommand8(ILI9341_RDMADCTL);
  192.   Serial.print("\nMADCTL Mode: 0x"); Serial.println(x, HEX);
  193.   x = readcommand8(ILI9341_RDPIXFMT);
  194.   Serial.print("\nPixel Format: 0x"); Serial.println(x, HEX);
  195.   x = readcommand8(ILI9341_RDIMGFMT);
  196.   Serial.print("\nImage Format: 0x"); Serial.println(x, HEX);
  197.   x = readcommand8(ILI9341_RDSELFDIAG);
  198.   Serial.print("\nSelf Diagnostic: 0x"); Serial.println(x, HEX);
  199. */
  200.   //if(cmdList) commandList(cmdList);
  201.   
  202.   if (hwSPI) spi_begin();
  203.   writecommand(0xEF);
  204.   writedata(0x03);
  205.   writedata(0x80);
  206.   writedata(0x02);

  207.   writecommand(0xCF);  
  208.   writedata(0x00);
  209.   writedata(0XC1);
  210.   writedata(0X30);

  211.   writecommand(0xED);  
  212.   writedata(0x64);
  213.   writedata(0x03);
  214.   writedata(0X12);
  215.   writedata(0X81);

  216.   writecommand(0xE8);  
  217.   writedata(0x85);
  218.   writedata(0x00);
  219.   writedata(0x78);

  220.   writecommand(0xCB);  
  221.   writedata(0x39);
  222.   writedata(0x2C);
  223.   writedata(0x00);
  224.   writedata(0x34);
  225.   writedata(0x02);

  226.   writecommand(0xF7);  
  227.   writedata(0x20);

  228.   writecommand(0xEA);  
  229.   writedata(0x00);
  230.   writedata(0x00);

  231.   writecommand(ILI9341_PWCTR1);    //Power control
  232.   writedata(0x23);   //VRH[5:0]

  233.   writecommand(ILI9341_PWCTR2);    //Power control
  234.   writedata(0x10);   //SAP[2:0];BT[3:0]

  235.   writecommand(ILI9341_VMCTR1);    //VCM control
  236.   writedata(0x3e); //对比度调节
  237.   writedata(0x28);
  238.   
  239.   writecommand(ILI9341_VMCTR2);    //VCM control2
  240.   writedata(0x86);  //--

  241.   writecommand(ILI9341_MADCTL);    // Memory Access Control
  242.   writedata(0x48);

  243.   writecommand(ILI9341_PIXFMT);   
  244.   writedata(0x55);
  245.   
  246.   writecommand(ILI9341_FRMCTR1);   
  247.   writedata(0x00);  
  248.   writedata(0x18);

  249.   writecommand(ILI9341_DFUNCTR);    // Display Function Control
  250.   writedata(0x08);
  251.   writedata(0x82);
  252.   writedata(0x27);  

  253.   writecommand(0xF2);    // 3Gamma Function Disable
  254.   writedata(0x00);

  255.   writecommand(ILI9341_GAMMASET);    //Gamma curve selected
  256.   writedata(0x01);

  257.   writecommand(ILI9341_GMCTRP1);    //Set Gamma
  258.   writedata(0x0F);
  259.   writedata(0x31);
  260.   writedata(0x2B);
  261.   writedata(0x0C);
  262.   writedata(0x0E);
  263.   writedata(0x08);
  264.   writedata(0x4E);
  265.   writedata(0xF1);
  266.   writedata(0x37);
  267.   writedata(0x07);
  268.   writedata(0x10);
  269.   writedata(0x03);
  270.   writedata(0x0E);
  271.   writedata(0x09);
  272.   writedata(0x00);
  273.   
  274.   writecommand(ILI9341_GMCTRN1);    //Set Gamma
  275.   writedata(0x00);
  276.   writedata(0x0E);
  277.   writedata(0x14);
  278.   writedata(0x03);
  279.   writedata(0x11);
  280.   writedata(0x07);
  281.   writedata(0x31);
  282.   writedata(0xC1);
  283.   writedata(0x48);
  284.   writedata(0x08);
  285.   writedata(0x0F);
  286.   writedata(0x0C);
  287.   writedata(0x31);
  288.   writedata(0x36);
  289.   writedata(0x0F);

  290.   writecommand(ILI9341_SLPOUT);    //Exit Sleep
  291.   if (hwSPI) spi_end();
  292.   delay(120);                
  293.   if (hwSPI) spi_begin();
  294.   writecommand(ILI9341_DISPON);    //Display on
  295.   if (hwSPI) spi_end();

  296. }


  297. void Adafruit_ILI9341::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1,
  298. uint16_t y1) {

  299.   writecommand(ILI9341_CASET); // Column addr set
  300.   writedata(x0 >> 8);
  301.   writedata(x0 & 0xFF);     // XSTART
  302.   writedata(x1 >> 8);
  303.   writedata(x1 & 0xFF);     // XEND

  304.   writecommand(ILI9341_PASET); // Row addr set
  305.   writedata(y0>>8);
  306.   writedata(y0);     // YSTART
  307.   writedata(y1>>8);
  308.   writedata(y1);     // YEND

  309.   writecommand(ILI9341_RAMWR); // write to RAM
  310. }


  311. void Adafruit_ILI9341::pushColor(uint16_t color) {
  312.   if (hwSPI) spi_begin();
  313.   //digitalWrite(_dc, HIGH);
  314.   *dcport |=  dcpinmask;
  315.   //digitalWrite(_cs, LOW);
  316.   *csport &= ~cspinmask;

  317.   spiwrite(color >> 8);
  318.   spiwrite(color);

  319.   *csport |= cspinmask;
  320.   //digitalWrite(_cs, HIGH);
  321.   if (hwSPI) spi_end();
  322. }

  323. void Adafruit_ILI9341::drawPixel(int16_t x, int16_t y, uint16_t color) {

  324.   if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;

  325.   if (hwSPI) spi_begin();
  326.   setAddrWindow(x,y,x+1,y+1);

  327.   //digitalWrite(_dc, HIGH);
  328.   *dcport |=  dcpinmask;
  329.   //digitalWrite(_cs, LOW);
  330.   *csport &= ~cspinmask;

  331.   spiwrite(color >> 8);
  332.   spiwrite(color);

  333.   *csport |= cspinmask;
  334.   //digitalWrite(_cs, HIGH);
  335.   if (hwSPI) spi_end();
  336. }


  337. void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, int16_t h,
  338. uint16_t color) {

  339.   // Rudimentary clipping
  340.   if((x >= _width) || (y >= _height)) return;

  341.   if((y+h-1) >= _height)
  342.     h = _height-y;

  343.   if (hwSPI) spi_begin();
  344.   setAddrWindow(x, y, x, y+h-1);

  345.   uint8_t hi = color >> 8, lo = color;

  346.   *dcport |=  dcpinmask;
  347.   //digitalWrite(_dc, HIGH);
  348.   *csport &= ~cspinmask;
  349.   //digitalWrite(_cs, LOW);

  350.   while (h--) {
  351.     spiwrite(hi);
  352.     spiwrite(lo);
  353.   }
  354.   *csport |= cspinmask;
  355.   //digitalWrite(_cs, HIGH);
  356.   if (hwSPI) spi_end();
  357. }


  358. void Adafruit_ILI9341::drawFastHLine(int16_t x, int16_t y, int16_t w,
  359.   uint16_t color) {

  360.   // Rudimentary clipping
  361.   if((x >= _width) || (y >= _height)) return;
  362.   if((x+w-1) >= _width)  w = _width-x;
  363.   if (hwSPI) spi_begin();
  364.   setAddrWindow(x, y, x+w-1, y);

  365.   uint8_t hi = color >> 8, lo = color;
  366.   *dcport |=  dcpinmask;
  367.   *csport &= ~cspinmask;
  368.   //digitalWrite(_dc, HIGH);
  369.   //digitalWrite(_cs, LOW);
  370.   while (w--) {
  371.     spiwrite(hi);
  372.     spiwrite(lo);
  373.   }
  374.   *csport |= cspinmask;
  375.   //digitalWrite(_cs, HIGH);
  376.   if (hwSPI) spi_end();
  377. }

  378. void Adafruit_ILI9341::fillScreen(uint16_t color) {
  379.   fillRect(0, 0,  _width, _height, color);
  380. }

  381. // fill a rectangle
  382. void Adafruit_ILI9341::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
  383.   uint16_t color) {

  384.   // rudimentary clipping (drawChar w/big text requires this)
  385.   if((x >= _width) || (y >= _height)) return;
  386.   if((x + w - 1) >= _width)  w = _width  - x;
  387.   if((y + h - 1) >= _height) h = _height - y;

  388.   if (hwSPI) spi_begin();
  389.   setAddrWindow(x, y, x+w-1, y+h-1);

  390.   uint8_t hi = color >> 8, lo = color;

  391.   *dcport |=  dcpinmask;
  392.   //digitalWrite(_dc, HIGH);
  393.   *csport &= ~cspinmask;
  394.   //digitalWrite(_cs, LOW);

  395.   for(y=h; y>0; y--) {
  396.     for(x=w; x>0; x--) {
  397.       spiwrite(hi);
  398.       spiwrite(lo);
  399.     }
  400.   }
  401.   //digitalWrite(_cs, HIGH);
  402.   *csport |= cspinmask;
  403.   if (hwSPI) spi_end();
  404. }


  405. // Pass 8-bit (each) R,G,B, get back 16-bit packed color
  406. uint16_t Adafruit_ILI9341::color565(uint8_t r, uint8_t g, uint8_t b) {
  407.   return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
  408. }


  409. #define MADCTL_MY  0x80
  410. #define MADCTL_MX  0x40
  411. #define MADCTL_MV  0x20
  412. #define MADCTL_ML  0x10
  413. #define MADCTL_RGB 0x00
  414. #define MADCTL_BGR 0x08
  415. #define MADCTL_MH  0x04

  416. void Adafruit_ILI9341::setRotation(uint8_t m) {

  417.   if (hwSPI) spi_begin();
  418.   writecommand(ILI9341_MADCTL);
  419.   rotation = m % 4; // can't be higher than 3
  420.   switch (rotation) {
  421.    case 0:
  422.      writedata(MADCTL_MX | MADCTL_BGR);
  423.      _width  = ILI9341_TFTWIDTH;
  424.      _height = ILI9341_TFTHEIGHT;
  425.      break;
  426.    case 1:
  427.      writedata(MADCTL_MV | MADCTL_BGR);
  428.      _width  = ILI9341_TFTHEIGHT;
  429.      _height = ILI9341_TFTWIDTH;
  430.      break;
  431.   case 2:
  432.     writedata(MADCTL_MY | MADCTL_BGR);
  433.      _width  = ILI9341_TFTWIDTH;
  434.      _height = ILI9341_TFTHEIGHT;
  435.     break;
  436.    case 3:
  437.      writedata(MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR);
  438.      _width  = ILI9341_TFTHEIGHT;
  439.      _height = ILI9341_TFTWIDTH;
  440.      break;
  441.   }
  442.   if (hwSPI) spi_end();
  443. }


  444. void Adafruit_ILI9341::invertDisplay(boolean i) {
  445.   if (hwSPI) spi_begin();
  446.   writecommand(i ? ILI9341_INVON : ILI9341_INVOFF);
  447.   if (hwSPI) spi_end();
  448. }


  449. ////////// stuff not actively being used, but kept for posterity


  450. uint8_t Adafruit_ILI9341::spiread(void) {
  451.   uint8_t r = 0;

  452.   if (hwSPI) {
  453. #if defined (__AVR__)
  454.     uint8_t backupSPCR = SPCR;
  455.     SPCR = mySPCR;
  456.     SPDR = 0x00;
  457.     while(!(SPSR & _BV(SPIF)));
  458.     r = SPDR;
  459.     SPCR = backupSPCR;
  460. #elif defined(TEENSYDUINO)
  461.     r = SPI.transfer(0x00);
  462. #elif defined (__arm__)
  463.     SPI.setClockDivider(11); // 8-ish MHz (full! speed!)
  464.     SPI.setBitOrder(MSBFIRST);
  465.     SPI.setDataMode(SPI_MODE0);
  466.     r = SPI.transfer(0x00);
  467. #endif
  468.   } else {

  469.     for (uint8_t i=0; i<8; i++) {
  470.       digitalWrite(_sclk, LOW);
  471.       digitalWrite(_sclk, HIGH);
  472.       r <<= 1;
  473.       if (digitalRead(_miso))
  474.         r |= 0x1;
  475.     }
  476.   }
  477.   //Serial.print("read: 0x"); Serial.print(r, HEX);
  478.   
  479.   return r;
  480. }

  481. uint8_t Adafruit_ILI9341::readdata(void) {
  482.    digitalWrite(_dc, HIGH);
  483.    digitalWrite(_cs, LOW);
  484.    uint8_t r = spiread();
  485.    digitalWrite(_cs, HIGH);
  486.    
  487.    return r;
  488. }


  489. uint8_t Adafruit_ILI9341::readcommand8(uint8_t c, uint8_t index) {
  490.    if (hwSPI) spi_begin();
  491.    digitalWrite(_dc, LOW); // command
  492.    digitalWrite(_cs, LOW);
  493.    spiwrite(0xD9);  // woo sekret command?
  494.    digitalWrite(_dc, HIGH); // data
  495.    spiwrite(0x10 + index);
  496.    digitalWrite(_cs, HIGH);

  497.    digitalWrite(_dc, LOW);
  498.    digitalWrite(_sclk, LOW);
  499.    digitalWrite(_cs, LOW);
  500.    spiwrite(c);

  501.    digitalWrite(_dc, HIGH);
  502.    uint8_t r = spiread();
  503.    digitalWrite(_cs, HIGH);
  504.    if (hwSPI) spi_end();
  505.    return r;
  506. }



  507. /*

  508. uint16_t Adafruit_ILI9341::readcommand16(uint8_t c) {
  509. digitalWrite(_dc, LOW);
  510. if (_cs)
  511. digitalWrite(_cs, LOW);

  512. spiwrite(c);
  513. pinMode(_sid, INPUT); // input!
  514. uint16_t r = spiread();
  515. r <<= 8;
  516. r |= spiread();
  517. if (_cs)
  518. digitalWrite(_cs, HIGH);

  519. pinMode(_sid, OUTPUT); // back to output
  520. return r;
  521. }

  522. uint32_t Adafruit_ILI9341::readcommand32(uint8_t c) {
  523. digitalWrite(_dc, LOW);
  524. if (_cs)
  525. digitalWrite(_cs, LOW);
  526. spiwrite(c);
  527. pinMode(_sid, INPUT); // input!

  528. dummyclock();
  529. dummyclock();

  530. uint32_t r = spiread();
  531. r <<= 8;
  532. r |= spiread();
  533. r <<= 8;
  534. r |= spiread();
  535. r <<= 8;
  536. r |= spiread();
  537. if (_cs)
  538. digitalWrite(_cs, HIGH);

  539. pinMode(_sid, OUTPUT); // back to output
  540. return r;
  541. }

  542. */
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-12-26 11:05:54 | 显示全部楼层

没有三线SPI的ILI9341屏幕,只按照STM32的驱动修改了一下CPP类和测试程序。你测试一下吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2015-12-26 11:31:14 | 显示全部楼层
注意,测试前 Arduino IDE环境需要先安装 Adafruit_GFX的类库。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-26 13:44:52 | 显示全部楼层
lbh_sd 发表于 2015-12-26 11:31
注意,测试前 Arduino IDE环境需要先安装 Adafruit_GFX的类库。

非常感谢您,我编译通过了。但是它并没有Work..一直白屏
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-26 14:27:05 | 显示全部楼层
另外,MOSI那个口是不是写错了,应该是11
回复 支持 反对

使用道具 举报

发表于 2015-12-26 16:27:12 | 显示全部楼层

又按时序图核对了一下程序,有点小问题已修改,因三线SPI不支持读命令,还是需要下载测试。
软件SPI可以使用任意PIN。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-26 19:01:50 | 显示全部楼层
屏幕已经有反映了,但是只有一点字,而且感觉液晶的颗粒感巨明显,像是隔行显示的。
正常情况下,这个应该是黑屏,彩色字。然后开始各种演示。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-26 19:19:51 | 显示全部楼层
自由的Weesky 发表于 2015-12-26 19:01
屏幕已经有反映了,但是只有一点字,而且感觉液晶的颗粒感巨明显,像是隔行显示的。
正常情况下,这个应该 ...

至少证明,我的接线没问题了。路子对
回复 支持 反对

使用道具 举报

发表于 2017-10-23 11:58:24 | 显示全部楼层
帮顶一下, 三线 SPI 的 ILI9341
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 11:09 , Processed in 0.054012 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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