<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=47&amp;t=17321&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-01-18T10:58:15+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=47&amp;t=17321&amp;mode</id>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-18T10:58:15+01:00</updated>
<published>2017-01-18T10:58:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=180124#p180124</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=180124#p180124"/>
<title type="html"><![CDATA[Re: Arduino TFT-LCD PP_TFTLCD obsluga]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=180124#p180124"><![CDATA[
Dobra wiadomość udało mi się znaleźć  poprawna bibliotekę dla mojego wyświetlacza ze sterownikiem ILI9331 lub ID 505 <br /><a href="https://forum.arduino.cc/index.php?action=dlattach;topic=366304.0;attach=165912&quot;&gt;&lt;img%20src=&quot;https://forum.arduino.cc/Themes/default/images/icons/clip.png&quot;%20class=&quot;centericon&quot;%20alt=&quot;*&quot;&gt;&amp;nbsp;Mcufriend_kbv_2.90.zip"  class="postlink">https://forum.arduino.cc/index.php?action=dlattach;topic=366304.0;attach=165912&quot;&gt;&lt;img%20src=&quot;https://forum.arduino.cc/Themes/default/images/icons/clip.png&quot;%20class=&quot;centericon&quot;%20alt=&quot;*&quot;&gt;&amp;nbsp;Mcufriend_kbv_2.90.zip</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 18 sty 2017, o 10:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-16T08:39:42+01:00</updated>
<published>2017-01-16T08:39:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179941#p179941</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179941#p179941"/>
<title type="html"><![CDATA[Re: Arduino TFT-LCD PP_TFTLCD obsluga]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179941#p179941"><![CDATA[
[syntax=c]#if ARDUINO &gt;= 100<br /> #include &quot;Arduino.h&quot;<br />#else<br /> #include &quot;WProgram.h&quot;<br />#endif<br /><br />// comment or uncomment the next line for special pinout!<br />//#define USE_ADAFRUIT_SHIELD_PINOUT<br /><br /><br />// register names from Peter Barrett's Microtouch code<br /><br />#define PP_TFTLCD_START_OSC0x00<br />#define PP_TFTLCD_DRIV_OUT_CTRL0x01<br />#define PP_TFTLCD_DRIV_WAV_CTRL0x02<br />#define PP_TFTLCD_ENTRY_MOD0x03<br />#define PP_TFTLCD_RESIZE_CTRL0x04<br />#define PP_TFTLCD_DISP_CTRL10x07<br />#define PP_TFTLCD_DISP_CTRL20x08<br />#define PP_TFTLCD_DISP_CTRL30x09<br />#define PP_TFTLCD_DISP_CTRL40x0A<br />#define PP_TFTLCD_RGB_DISP_IF_CTRL10x0C<br />#define PP_TFTLCD_FRM_MARKER_POS0x0D<br />#define PP_TFTLCD_RGB_DISP_IF_CTRL20x0F<br />#define PP_TFTLCD_POW_CTRL10x10<br />#define PP_TFTLCD_POW_CTRL20x11<br />#define PP_TFTLCD_POW_CTRL30x12<br />#define PP_TFTLCD_POW_CTRL40x13<br />#define PP_TFTLCD_GRAM_HOR_AD0x20<br />#define PP_TFTLCD_GRAM_VER_AD0x21<br />#define PP_TFTLCD_RW_GRAM0x22<br />#define PP_TFTLCD_POW_CTRL70x29<br />#define PP_TFTLCD_FRM_RATE_COL_CTRL0x2B<br />#define PP_TFTLCD_GAMMA_CTRL10x30<br />#define PP_TFTLCD_GAMMA_CTRL20x31<br />#define PP_TFTLCD_GAMMA_CTRL30x32<br />#define PP_TFTLCD_GAMMA_CTRL40x35 <br />#define PP_TFTLCD_GAMMA_CTRL50x36<br />#define PP_TFTLCD_GAMMA_CTRL60x37<br />#define PP_TFTLCD_GAMMA_CTRL70x38<br />#define PP_TFTLCD_GAMMA_CTRL80x39<br />#define PP_TFTLCD_GAMMA_CTRL90x3C<br />#define PP_TFTLCD_GAMMA_CTRL100x3D<br />#define PP_TFTLCD_HOR_START_AD0x50<br />#define PP_TFTLCD_HOR_END_AD0x51<br />#define PP_TFTLCD_VER_START_AD0x52<br />#define PP_TFTLCD_VER_END_AD0x53<br />#define PP_TFTLCD_GATE_SCAN_CTRL10x60<br />#define PP_TFTLCD_GATE_SCAN_CTRL20x61<br />#define PP_TFTLCD_GATE_SCAN_CTRL30x6A<br />#define PP_TFTLCD_PART_IMG1_DISP_POS0x80<br />#define PP_TFTLCD_PART_IMG1_START_AD0x81<br />#define PP_TFTLCD_PART_IMG1_END_AD0x82<br />#define PP_TFTLCD_PART_IMG2_DISP_POS0x83<br />#define PP_TFTLCD_PART_IMG2_START_AD0x84<br />#define PP_TFTLCD_PART_IMG2_END_AD0x85<br />#define PP_TFTLCD_PANEL_IF_CTRL10x90<br />#define PP_TFTLCD_PANEL_IF_CTRL20x92<br />#define PP_TFTLCD_PANEL_IF_CTRL30x93<br />#define PP_TFTLCD_PANEL_IF_CTRL40x95<br />#define PP_TFTLCD_PANEL_IF_CTRL50x97<br />#define PP_TFTLCD_PANEL_IF_CTRL60x98<br /><br />#define PP_TFTLCD_DELAYCMD                 0xFF<br /><br />#define swap(a, b) { int16_t t = a; a = b; b = t; }<br /><br />class PP_TFTLCD : public Print {<br /> public:<br />  PP_TFTLCD(uint8_t cs, uint8_t cd, uint8_t wr, uint8_t rd, uint8_t reset);<br /><br />  uint16_t Color565(uint8_t r, uint8_t g, uint8_t b);<br /><br />  // drawing primitives!<br />  void drawPixel(uint16_t x, uint16_t y, uint16_t color);<br />  void fillScreen(uint16_t color);<br />  void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);<br />  void drawFastLine(uint16_t x0, uint16_t y0, uint16_t l, uint16_t color, uint8_t flag);<br />  void drawVerticalLine(uint16_t x0, uint16_t y0, uint16_t length, uint16_t color);<br />  void drawHorizontalLine(uint16_t x0, uint16_t y0, uint16_t length, uint16_t color);<br />  void drawTriangle(uint16_t x0, uint16_t y0,<br />  uint16_t x1, uint16_t y1,<br />  uint16_t x2, uint16_t y2, uint16_t color);<br />  void fillTriangle(int32_t x0, int32_t y0,<br />  int32_t x1, int32_t y1,<br />    int32_t x2, int32_t y2, <br />    uint16_t color);<br />  void drawRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);<br />  void fillRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);<br />  void drawRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color);<br />  void fillRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color);<br />  void drawCircle(uint16_t x0, uint16_t y0, uint16_t r,uint16_t color);<br />  void fillCircle(uint16_t x0, uint16_t y0, uint16_t r,uint16_t color);<br /><br />  void setCursor(uint16_t x, uint16_t y);<br />  void setTextColor(uint16_t c, uint16_t b);<br />  void setTextSize(uint8_t s);<br />//  virtual void write(uint8_t);<br />  virtual size_t write(uint8_t);<br /><br />  void drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);<br />  void drawString(uint16_t x, uint16_t y, char *c, uint16_t color, uint8_t s = 1);<br /><br />  // commands<br />  void initDisplay(void);<br />  void goHome(void);<br />  void goTo(int x, int y);<br /><br />  void reset(void);<br />  void setRotation(uint8_t x);<br />  uint8_t getRotation();<br /><br />  /* low level */<br /><br />  void writeData(uint16_t d);<br />  void writeCommand(uint16_t c);<br />  uint16_t readData(void);<br />  uint16_t readRegister(uint16_t addr);<br />  void writeRegister(uint16_t addr, uint16_t data);<br /><br /><br />  uint16_t width();<br />  uint16_t height();<br /><br />  static const uint16_t TFTWIDTH = 240;<br />  static const uint16_t TFTHEIGHT = 320;<br /><br />  void writeData_unsafe(uint16_t d);<br /><br />  void setWriteDir(void);<br />  void setReadDir(void);<br /><br /><br />  void write8(uint8_t d);<br /><br /> private:<br />  void drawCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t corner, uint16_t color);<br />  void fillCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t corner, uint16_t delta, uint16_t color);<br /><br />  uint8_t read8(void);<br /><br />  uint8_t _cs, _cd, _reset, _wr, _rd;<br /><br />  uint8_t csport, cdport, wrport, rdport;<br />  uint8_t cspin, cdpin, wrpin, rdpin;<br /><br />  uint16_t _width, _height;<br />  uint8_t textsize;<br />  uint16_t cursor_x, cursor_y;<br />  uint16_t textcolor;  <br />  uint16_t textbgcolor;<br />  uint8_t rotation;<br />};[/syntax]<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD/PP_TFTLCD.h:101:27: error: 'cursor_y' has not been declared<br /><br />   void drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);<br /><br />                           ^<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD/PP_TFTLCD.h:101:37: error: 'c' has not been declared<br /><br />   void drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);<br /><br />                                     ^<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD/PP_TFTLCD.h:101:40: error: 'textcolor' has not been declared<br /><br />   void drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);<br /><br />                                        ^<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD/PP_TFTLCD.h:101:51: error: 'textbgcolor' has not been declared<br /><br />   void drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);<br /><br />                                                   ^<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD/PP_TFTLCD.h:101:64: error: 'textsize' has not been declared<br /><br />   void drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);<br /><br />                                                                ^<br /><br />exit status 1<br />Błąd kompilacji dla płytki Arduino/Genuino Uno.<br /><br />Chyba zmieniłem ale dalej wywala błędy... dziękuje za cierpliwość bo tak jak wspomniałem na języku C się nie znam a co dopiero na pisaniu bibliotek do wyświetlaczy !!!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 16 sty 2017, o 08:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[danny]]></name></author>
<updated>2017-01-15T21:11:18+01:00</updated>
<published>2017-01-15T21:11:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179921#p179921</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179921#p179921"/>
<title type="html"><![CDATA[Re: Arduino TFT-LCD PP_TFTLCD obsluga]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179921#p179921"><![CDATA[
A dlaczego kolega zmieniając nagłówki funkcji w pliku PP_TFTLCD.cpp nie zrobił tego samego ich deklaracjami w pliku  PP_TFTLCD.h ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1505">danny</a> — 15 sty 2017, o 21:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-15T19:09:58+01:00</updated>
<published>2017-01-15T19:09:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179913#p179913</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179913#p179913"/>
<title type="html"><![CDATA[Re: Arduino TFT-LCD PP_TFTLCD obsluga]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179913#p179913"><![CDATA[
Nadal same błęd<br /><br />[syntax=c]#include &quot;PP_TFTLCD.h&quot;<br /><br /><br /><br />#ifdef USE_ADAFRUIT_SHIELD_PINOUT<br />// special defines for the dataport<br /> #define DATAPORT1 PORTD<br /> #define DATAPIN1 PIND<br /> #define DATADDR1 DDRD<br /><br /> #define DATAPORT2 PORTB<br /> #define DATAPIN2 PINB<br /> #define DATADDR2 DDRB<br /><br /> #define DATA1_MASK 0xD0<br /> #define DATA2_MASK 0x2F<br /><br />// for mega &amp; shield usage, we just hardcoded it (its messy)<br /><br />#else<br /> // for the breakout board tutorial, two ports are used :/<br /> #define DATAPORT1 PORTD<br /> #define DATAPIN1  PIND<br /> #define DATADDR1  DDRD<br /><br /> #define DATAPORT2 PORTB<br /> #define DATAPIN2  PINB<br /> #define DATADDR2  DDRB<br /><br /> #define DATA1_MASK 0xFC  // top 6 bits<br /> #define DATA2_MASK 0x03  // bottom 2 bits<br /><br /><br /> #define MEGA_DATAPORT PORTA<br /> #define MEGA_DATAPIN  PINA<br /> #define MEGA_DATADDR  DDRA<br />#endif<br /><br /><br />#include &quot;glcdfont.c&quot;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &quot;pins_arduino.h&quot;<br />#include &quot;wiring_private.h&quot;<br /><br /><br />void PP_TFTLCD::goHome(void) {<br />  goTo(0,0);<br />}<br /><br />uint16_t PP_TFTLCD::width(void) {<br />  return _width;<br />}<br />uint16_t PP_TFTLCD::height(void) {<br />  return _height;<br />}<br /><br />void PP_TFTLCD::goTo(int x, int y) {<br />  writeRegister(0x0020, x);     // GRAM Address Set (Horizontal Address) (R20h)<br />  writeRegister(0x0021, y);     // GRAM Address Set (Vertical Address) (R21h)<br />  writeCommand(0x0022);            // Write Data to GRAM (R22h)<br />}<br /><br />void PP_TFTLCD::setCursor(uint16_t x, uint16_t y) {<br />  cursor_x = x;<br />  cursor_y = y;<br />}<br /><br />void PP_TFTLCD::setTextSize(uint8_t s) {<br />  textsize = s;<br />}<br /><br />void PP_TFTLCD::setTextColor(uint16_t c, uint16_t b) {<br />  textcolor = c;<br />  textbgcolor = b;<br />}<br /><br />//void PP_TFTLCD::write(uint8_t c) {<br />size_t PP_TFTLCD::write(uint8_t c) {<br />  if (c == '\n') {<br />    cursor_y += textsize*8;<br />    cursor_x = 0;<br />  } else if (c == '\r') {<br />    // skip em<br />  } else {<br />    drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);<br />    cursor_x += textsize*6;<br />  }<br />}<br /><br />void PP_TFTLCD::drawString(uint16_t x, uint16_t y, char *c, <br />uint16_t color, uint8_t size) {<br />  while (c&#91;0&#93; != 0) {<br />    drawChar(x, y, c&#91;0&#93;, color, size);<br />    x += size*6;<br />    c++;<br />  }<br />}<br /><br />// Draw a character<br />void PP_TFTLCD::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size) {<br />        if ((x &gt;= _width) || // Clip right<br />                        (y &gt;= _height) || // Clip bottom<br />                        ((x + 6 * size - 1) &lt; 0) || // Clip left<br />                        ((y + 8 * size - 1) &lt; 0))   // Clip top<br />                return;<br /> <br />        for (int8_t i = 0; i &lt; 6; i++) {<br />                uint8_t line;<br />                if (i == 5)<br />                        line = 0x0;<br />                else<br />                        line = pgm_read_byte(font + (c * 5) + i);<br />                for (int8_t j = 0; j &lt; 8; j++) {<br />                        if (line &amp; 0x1) {<br />                                if (size == 1) // default size<br />                                        drawPixel(x + i, y + j, color);<br />                                else {  // big size<br />                                        fillRect(x + (i * size), y + (j * size), size, size,<br />                                                        color);<br />                                }<br />                        } else if (bg != color) {<br />                                if (size == 1) // default size<br />                                        drawPixel(x + i, y + j, bg);<br />                                else {  // big size<br />                                        fillRect(x + i * size, y + j * size, size, size, bg);<br />                                }<br />                        }<br />                        line &gt;&gt;= 1;<br />                }<br />        }<br />}<br /><br />// draw a triangle!<br />void PP_TFTLCD::drawTriangle(uint16_t x0, uint16_t y0,<br />  uint16_t x1, uint16_t y1,<br />  uint16_t x2, uint16_t y2, uint16_t color)<br />{<br />  drawLine(x0, y0, x1, y1, color);<br />  drawLine(x1, y1, x2, y2, color);<br />  drawLine(x2, y2, x0, y0, color); <br />}<br /><br />void PP_TFTLCD::fillTriangle ( int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint16_t color)<br />{<br />  if (y0 &gt; y1) {<br />    swap(y0, y1); swap(x0, x1);<br />  }<br />  if (y1 &gt; y2) {<br />    swap(y2, y1); swap(x2, x1);<br />  }<br />  if (y0 &gt; y1) {<br />    swap(y0, y1); swap(x0, x1);<br />  }<br /><br />  int32_t dx1, dx2, dx3; // Interpolation deltas<br />  int32_t sx1, sx2, sy; // Scanline co-ordinates<br /><br />  sx2=(int32_t)x0 * (int32_t)1000; // Use fixed point math for x axis values<br />  sx1 = sx2;<br />  sy=y0;<br /><br />  // Calculate interpolation deltas<br />  if (y1-y0 &gt; 0) dx1=((x1-x0)*1000)/(y1-y0);<br />    else dx1=0;<br />  if (y2-y0 &gt; 0) dx2=((x2-x0)*1000)/(y2-y0);<br />    else dx2=0;<br />  if (y2-y1 &gt; 0) dx3=((x2-x1)*1000)/(y2-y1);<br />    else dx3=0;<br /><br />  // Render scanlines (horizontal lines are the fastest rendering method)<br />  if (dx1 &gt; dx2)<br />  {<br />    for(; sy&lt;=y1; sy++, sx1+=dx2, sx2+=dx1)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />    sx2 = x1*1000;<br />    sy = y1;<br />    for(; sy&lt;=y2; sy++, sx1+=dx2, sx2+=dx3)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />  }<br />  else<br />  {<br />    for(; sy&lt;=y1; sy++, sx1+=dx1, sx2+=dx2)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />    sx1 = x1*1000;<br />    sy = y1;<br />    for(; sy&lt;=y2; sy++, sx1+=dx3, sx2+=dx2)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />  }<br />}<br /><br />uint16_t PP_TFTLCD::Color565(uint8_t r, uint8_t g, uint8_t b) {<br />  uint16_t c;<br />  c = r &gt;&gt; 3;<br />  c &lt;&lt;= 6;<br />  c |= g &gt;&gt; 2;<br />  c &lt;&lt;= 5;<br />  c |= b &gt;&gt; 3;<br /><br />  return c;<br />}<br /><br />// draw a rectangle<br />void PP_TFTLCD::drawRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, <br />      uint16_t color) {<br />  // smarter version<br />  drawHorizontalLine(x, y, w, color);<br />  drawHorizontalLine(x, y+h-1, w, color);<br />  drawVerticalLine(x, y, h, color);<br />  drawVerticalLine(x+w-1, y, h, color);<br />}<br /><br />// draw a rounded rectangle<br />void PP_TFTLCD::drawRoundRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t r,<br />   uint16_t color) {<br />  // smarter version<br />  drawHorizontalLine(x+r, y, w-2*r, color);<br />  drawHorizontalLine(x+r, y+h-1, w-2*r, color);<br />  drawVerticalLine(x, y+r, h-2*r, color);<br />  drawVerticalLine(x+w-1, y+r, h-2*r, color);<br />  // draw four corners<br />  drawCircleHelper(x+r, y+r, r, 1, color);<br />  drawCircleHelper(x+w-r-1, y+r, r, 2, color);<br />  drawCircleHelper(x+w-r-1, y+h-r-1, r, 4, color);<br />  drawCircleHelper(x+r, y+h-r-1, r, 8, color);<br />}<br /><br /><br />// fill a rounded rectangle<br />void PP_TFTLCD::fillRoundRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t r,<br />   uint16_t color) {<br />  // smarter version<br />  fillRect(x+r, y, w-2*r, h, color);<br /><br />  // draw four corners<br />  fillCircleHelper(x+w-r-1, y+r, r, 1, h-2*r-1, color);<br />  fillCircleHelper(x+r, y+r, r, 2, h-2*r-1, color);<br />}<br /><br />// fill a circle<br />void PP_TFTLCD::fillCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color) {<br />  writeRegister(PP_TFTLCD_ENTRY_MOD, 0x1030);<br />  drawVerticalLine(x0, y0-r, 2*r+1, color);<br />  fillCircleHelper(x0, y0, r, 3, 0, color);<br />}<br /><br /><br />// used to do circles and roundrects!<br />void PP_TFTLCD::fillCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t cornername, uint16_t delta,<br />uint16_t color) {<br /><br />  int16_t f = 1 - r;<br />  int16_t ddF_x = 1;<br />  int16_t ddF_y = -2 * r;<br />  int16_t x = 0;<br />  int16_t y = r;<br /><br />  while (x&lt;y) {<br />    if (f &gt;= 0) {<br />      y--;<br />      ddF_y += 2;<br />      f += ddF_y;<br />    }<br />    x++;<br />    ddF_x += 2;<br />    f += ddF_x;<br />  <br />    if (cornername &amp; 0x1) {<br />      drawVerticalLine(x0+x, y0-y, 2*y+1+delta, color);<br />      drawVerticalLine(x0+y, y0-x, 2*x+1+delta, color);<br />    }<br />    if (cornername &amp; 0x2) {<br />      drawVerticalLine(x0-x, y0-y, 2*y+1+delta, color);<br />      drawVerticalLine(x0-y, y0-x, 2*x+1+delta, color);<br />    }<br />  }<br />}<br /><br /><br />// draw a circle outline<br /><br />void PP_TFTLCD::drawCircle(uint16_t x0, uint16_t y0, uint16_t r, <br />uint16_t color) {<br />  drawPixel(x0, y0+r, color);<br />  drawPixel(x0, y0-r, color);<br />  drawPixel(x0+r, y0, color);<br />  drawPixel(x0-r, y0, color);<br /><br />  drawCircleHelper(x0, y0, r, 0xF, color);<br />}<br /><br />void PP_TFTLCD::drawCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t cornername,<br />uint16_t color) {<br />  int16_t f = 1 - r;<br />  int16_t ddF_x = 1;<br />  int16_t ddF_y = -2 * r;<br />  int16_t x = 0;<br />  int16_t y = r;<br /><br /><br />  while (x&lt;y) {<br />    if (f &gt;= 0) {<br />      y--;<br />      ddF_y += 2;<br />      f += ddF_y;<br />    }<br />    x++;<br />    ddF_x += 2;<br />    f += ddF_x;<br />    if (cornername &amp; 0x4) {<br />      drawPixel(x0 + x, y0 + y, color);<br />      drawPixel(x0 + y, y0 + x, color);<br />    } <br />    if (cornername &amp; 0x2) {<br />      drawPixel(x0 + x, y0 - y, color);<br />      drawPixel(x0 + y, y0 - x, color);<br />    }<br />    if (cornername &amp; 0x8) {<br />      drawPixel(x0 - y, y0 + x, color);<br />      drawPixel(x0 - x, y0 + y, color);<br />    }<br />    if (cornername &amp; 0x1) {<br />      drawPixel(x0 - y, y0 - x, color);<br />      drawPixel(x0 - x, y0 - y, color);<br />    }<br />  }<br />}<br /><br />// fill a rectangle<br />void PP_TFTLCD::fillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, <br />      uint16_t fillcolor) {<br />  // smarter version<br />  while (h--)<br />    drawHorizontalLine(x, y++, w, fillcolor);<br />}<br /><br /><br />void PP_TFTLCD::drawVerticalLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color)<br />{<br />  if (x &gt;= _width) return;<br /><br />  drawFastLine(x,y,length,color,1);<br />}<br /><br />void PP_TFTLCD::drawHorizontalLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color)<br />{<br />  if (y &gt;= _height) return;<br />  drawFastLine(x,y,length,color,0);<br />}<br /><br />void PP_TFTLCD::drawFastLine(uint16_t x, uint16_t y, uint16_t length, <br />  uint16_t color, uint8_t rotflag)<br />{<br />  uint16_t newentrymod;<br /><br />  switch (rotation) {<br />  case 0:<br />    if (rotflag)<br />      newentrymod = 0x1028;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1030;   // we want a 'horizontal line'<br />    break;<br />  case 1:<br />    swap(x, y);<br />    // first up fix the X<br />    x = TFTWIDTH - x - 1;<br />    if (rotflag)<br />      newentrymod = 0x1000;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1028;   // we want a 'horizontal line'<br />    break;<br />  case 2:<br />    x = TFTWIDTH - x - 1;<br />    y = TFTHEIGHT - y - 1;<br />    if (rotflag)<br />      newentrymod = 0x1008;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1020;   // we want a 'horizontal line'<br />    break;<br />  case 3:<br />    swap(x,y);<br />    y = TFTHEIGHT - y - 1;<br />    if (rotflag)<br />      newentrymod = 0x1030;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1008;   // we want a 'horizontal line'<br />    break;<br />  }<br />  <br />  writeRegister(PP_TFTLCD_ENTRY_MOD, newentrymod);<br /><br />  writeRegister(PP_TFTLCD_GRAM_HOR_AD, x); // GRAM Address Set (Horizontal Address) (R20h)<br />  writeRegister(PP_TFTLCD_GRAM_VER_AD, y); // GRAM Address Set (Vertical Address) (R21h)<br />  writeCommand(PP_TFTLCD_RW_GRAM);  // Write Data to GRAM (R22h)<br /><br /><br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(wrport) |= wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  while (length--) {<br />    writeData_unsafe(color); <br />  }<br /><br />  // set back to default<br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />  writeRegister(PP_TFTLCD_ENTRY_MOD, 0x1030);<br />}<br /><br /><br /><br />// bresenham's algorithm - thx wikpedia<br />void PP_TFTLCD::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, <br />      uint16_t color) {<br />  // if you're in rotation 1 or 3, we need to swap the X and Y's<br /><br />  int16_t steep = abs(y1 - y0) &gt; abs(x1 - x0);<br />  if (steep) {<br />    swap(x0, y0);<br />    swap(x1, y1);<br />  }<br /><br />  if (x0 &gt; x1) {<br />    swap(x0, x1);<br />    swap(y0, y1);<br />  }<br /><br />  int16_t dx, dy;<br />  dx = x1 - x0;<br />  //dy = abs(y1 - y0);<br />  dy = abs(y1 - y0);<br /><br />  int16_t err = dx / 2;<br />  int16_t ystep;<br /><br />  if (y0 &lt; y1) {<br />    ystep = 1;<br />  } else {<br />    ystep = -1;}<br /><br />  for (; x0&lt;=x1; x0++) {<br />    if (steep) {<br />      drawPixel(y0, x0, color);<br />    } else {<br />      drawPixel(x0, y0, color);<br />    }<br />    err -= dy;<br />    if (err &lt; 0) {<br />      y0 += ystep;<br />      err += dx;<br />    }<br />  }<br />}<br /><br /><br />void PP_TFTLCD::fillScreen(uint16_t color) {<br />  goHome();<br />  uint32_t i;<br />  <br />  i = 320;<br />  i *= 240;<br />  <br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(wrport) |= wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  while (i--) {<br />    writeData_unsafe(color); <br />  }<br /><br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />}<br /><br />void PP_TFTLCD::drawPixel(uint16_t x, uint16_t y, uint16_t color)<br />{<br />  // check rotation, move pixel around if necessary<br />  switch (rotation) {<br />  case 1:<br />    swap(x, y);<br />    x = TFTWIDTH - x - 1;<br />    break;<br />  case 2:<br />    x = TFTWIDTH - x - 1;<br />    y = TFTHEIGHT - y - 1;<br />    break;<br />  case 3:<br />    swap(x, y);<br />    y = TFTHEIGHT - y - 1;<br />    break;<br />  }<br />    <br />  if ((x &gt;= TFTWIDTH) || (y &gt;= TFTHEIGHT)) return;<br />  writeRegister(PP_TFTLCD_GRAM_HOR_AD, x); // GRAM Address Set (Horizontal Address) (R20h)<br />  writeRegister(PP_TFTLCD_GRAM_VER_AD, y); // GRAM Address Set (Vertical Address) (R21h)<br />  writeCommand(PP_TFTLCD_RW_GRAM);  // Write Data to GRAM (R22h)<br />  writeData(color);<br />}<br /><br />static const uint16_t _regValues&#91;&#93; PROGMEM = {<br /><br />     0x0000,0x0000,<br />0x0000,0x0000,<br />0x0000,0x0000,<br />0x0000,0x0000,<br /><br />0x00a4,0x0001,<br />//delay_ms(20,  <br />0x0060,0x2700,<br />0x0008,0x0202,<br /><br />0x0030,0x0214,<br />0x0031,0x3715,<br />0x0032,0x0604,<br />0x0033,0x0e16,<br />0x0034,0x2211,<br />0x0035,0x1500,<br />0x0036,0x8507,<br />0x0037,0x1407,<br />0x0038,0x1403,<br />0x0039,0x0020,<br /><br />0x0090,0x001a,<br />0x0010,0x0000,<br />0x0011,0x0007,<br />0x0012,0x0000,<br />0x0013,0x0000,<br />//delay_ms(20,<br /><br />0x0010,0x0730,<br />0x0011,0x0137,<br />//delay_ms(20,<br /><br />0x0012,0x01b8,<br />//delay_ms(20,<br /><br />0x0013,0x0f00,<br />0x002a,0x0080,<br />0x0029,0x0048,<br />//delay_ms(20,<br /><br />0x0001,0x0100,<br />0x0002,0x0700,<br />0x0003,0x1230,<br />0x0008,0x0202,<br />0x000a,0x0000,<br />0x000c,0x0000,<br />0x000d,0x01ff,<br />0x000e,0x0000,<br />0x0050,0x0000,<br />0x0051,0x00ef,<br />0x0052,0x0000,<br />0x0053,0x013f,<br />0x0060,0x2700,<br />0x0061,0x0001,<br />0x006a,0x0000,<br />//0x0080,0x0000,<br />//0x0081,0x0000,<br />0x0090,0X0011,<br />0x0092,0x0600,<br />0x0093,0x0402,<br />0x0094,0x0002,<br />//delay_ms(20,<br /><br />0x0007,0x0001,<br />//delay_ms(20,<br />0x0007,0x0061,<br />0x0007,0x0173,<br /><br />0x0020,0x0000,<br />0x0021,0x0000,  <br />0x00,0x22,  <br /><br />};<br /><br />void PP_TFTLCD::initDisplay(void) {<br />  uint16_t a, d;<br /><br />  reset();<br />  <br />  for (uint8_t i = 0; i &lt; sizeof(_regValues) / 4; i++) {<br />    a = pgm_read_word(_regValues + i*2);<br />    d = pgm_read_word(_regValues + i*2 + 1);<br /><br />    if (a == 0xFF) {<br />      delay(d);<br />    } else {<br />      writeRegister(a, d);<br />      //Serial.print(&quot;addr: &quot;); Serial.print(a); <br />      //Serial.print(&quot; data: &quot;); Serial.println(d, HEX);<br />    }<br />  }<br />}<br /><br />uint8_t PP_TFTLCD::getRotation(void) {<br />  return rotation;<br />}<br /><br />void PP_TFTLCD::setRotation(uint8_t x) {<br />  writeRegister(PP_TFTLCD_ENTRY_MOD, 0x1030);<br /><br />  x %= 4;  // cant be higher than 3<br />  rotation = x;<br />  switch (x) {<br />  case 0:<br />    _width = TFTWIDTH; <br />    _height = TFTHEIGHT;<br />    break;<br />  case 1:<br />    _width = TFTHEIGHT; <br />    _height = TFTWIDTH;<br />    break;<br />  case 2:<br />    _width = TFTWIDTH; <br />    _height = TFTHEIGHT;<br />    break;<br />  case 3:<br />    _width = TFTHEIGHT; <br />    _height = TFTWIDTH;<br />    break;<br /> }<br />}<br /><br />/********************************* low level pin initialization */<br /><br />PP_TFTLCD::PP_TFTLCD(uint8_t cs, uint8_t cd, uint8_t wr, uint8_t rd, uint8_t reset) {<br />  _cs = cs;<br />  _cd = cd;<br />  _wr = wr;<br />  _rd = rd;<br />  _reset = reset;<br />  <br />  rotation = 0;<br />  _width = TFTWIDTH;<br />  _height = TFTHEIGHT;<br /><br />  // disable the LCD<br />  digitalWrite(_cs, HIGH);<br />  pinMode(_cs, OUTPUT);  <br />  <br />  digitalWrite(_cd, HIGH);<br />  pinMode(_cd, OUTPUT);  <br />  <br />  digitalWrite(_wr, HIGH);<br />  pinMode(_wr, OUTPUT);  <br />  <br />  digitalWrite(_rd, HIGH);<br />  pinMode(_rd, OUTPUT);  <br /><br />  digitalWrite(_reset, HIGH); <br />  pinMode(_reset, OUTPUT); <br /><br />  csport = digitalPinToPort(_cs);<br />  cdport = digitalPinToPort(_cd);<br />  wrport = digitalPinToPort(_wr);<br />  rdport = digitalPinToPort(_rd);<br /><br />  cspin = digitalPinToBitMask(_cs);<br />  cdpin = digitalPinToBitMask(_cd);<br />  wrpin = digitalPinToBitMask(_wr);<br />  rdpin = digitalPinToBitMask(_rd);<br /><br />  cursor_y = cursor_x = 0;<br />  textsize = 1;<br />  textcolor = 0xFFFF;<br />}<br /><br /><br />/********************************** low level pin interface */<br /><br />void PP_TFTLCD::reset(void) {<br />  if (_reset)<br />    digitalWrite(_reset, LOW);<br />  delay(2); <br />  if (_reset)<br />    digitalWrite(_reset, HIGH);<br /><br />  // resync<br />  writeData(0);<br />  writeData(0);<br />  writeData(0);  <br />  writeData(0);<br />}<br /><br />inline void PP_TFTLCD::setWriteDir(void) {<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br />  DATADDR2 |= DATA2_MASK;<br />  DATADDR1 |= DATA1_MASK;<br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) <br /><br />  #ifdef USE_ADAFRUIT_SHIELD_PINOUT<br />  DDRH |= 0x78;<br />  DDRB |= 0xB0;<br />  DDRG |= _BV(5);<br />  #else<br />  MEGA_DATADDR = 0xFF;<br />  #endif<br />#else<br />  #error &quot;No pins defined!&quot;<br />#endif<br />}<br /><br />inline void PP_TFTLCD::setReadDir(void) {<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br />  DATADDR2 &amp;= ~DATA2_MASK;<br />  DATADDR1 &amp;= ~DATA1_MASK;<br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) <br /><br />  #ifdef USE_ADAFRUIT_SHIELD_PINOUT<br />  DDRH &amp;= ~0x78;<br />  DDRB &amp;= ~0xB0;<br />  DDRG &amp;= ~_BV(5);<br />  #else<br />  MEGA_DATADDR = 0;<br />  #endif<br />#else<br />  #error &quot;No pins defined!&quot;<br />#endif<br />}<br /><br />inline void PP_TFTLCD::write8(uint8_t d) {<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br /><br />  DATAPORT2 = (DATAPORT2 &amp; DATA1_MASK) | <br />    (d &amp; DATA2_MASK);<br />  DATAPORT1 = (DATAPORT1 &amp; DATA2_MASK) | <br />    (d &amp; DATA1_MASK); // top 6 bits<br />  <br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) <br /><br /><br />#ifdef USE_ADAFRUIT_SHIELD_PINOUT<br /><br />  // bit 6/7 (PH3 &amp; 4)<br />  // first two bits 0 &amp; 1 (PH5 &amp; 6)<br />  PORTH &amp;= ~(0x78);<br />  PORTH |= ((d&amp;0xC0) &gt;&gt; 3) | ((d&amp;0x3) &lt;&lt; 5);<br /><br />  // bits 2 &amp; 3 (PB4 &amp; PB5)<br />  // bit 5 (PB7)<br />  PORTB &amp;= ~(0xB0); <br />  PORTB |= ((d &amp; 0x2C) &lt;&lt; 2);<br /><br />  // bit 4  (PG5)<br />  if (d &amp; _BV(4))<br />    PORTG |= _BV(5);<br />  else<br />    PORTG &amp;= ~_BV(5);<br /><br />  #else<br />     MEGA_DATAPORT = d;  <br />  #endif<br /><br />#else<br />  #error &quot;No pins defined!&quot;<br />#endif<br />}<br /><br />inline uint8_t PP_TFTLCD::read8(void) {<br /> uint8_t d;<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br /><br /> d = DATAPIN1 &amp; DATA1_MASK; <br /> d |= DATAPIN2 &amp; DATA2_MASK; <br /><br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__)  || defined(__AVR_ATmega1280__) <br /><br />#ifdef USE_ADAFRUIT_SHIELD_PINOUT<br /><br />  // bit 6/7 (PH3 &amp; 4)<br />  // first two bits 0 &amp; 1 (PH5 &amp; 6)<br /> d = (PINH &amp; 0x60) &gt;&gt; 5;<br /> d |= (PINH &amp; 0x18) &lt;&lt; 3;<br /><br />  // bits 2 &amp; 3 &amp; 5 (PB4 &amp; PB5, PB7)<br /> d |= (PINB &amp; 0xB0) &gt;&gt; 2;<br /><br />  // bit 4  (PG5)<br />  if (PING &amp; _BV(5))<br />    d |= _BV(4);<br /><br />#else<br /> d = MEGA_DATAPIN;  <br />#endif<br /><br />#else<br /><br />  #error &quot;No pins defined!&quot;<br /><br />#endif<br /><br /> return d;<br />}<br /><br />/********************************** low level readwrite interface */<br /><br />// the C/D pin is high during write<br />void PP_TFTLCD::writeData(uint16_t data) {<br />  volatile uint8_t *wrportreg = portOutputRegister(wrport);<br /><br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  <br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  write8(data &gt;&gt; 8);<br />  <br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  write8(data);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />}<br /><br />// this is a 'sped up' version, with no direction setting, or pin initialization<br />// not for external usage, but it does speed up stuff like a screen fill<br />inline void PP_TFTLCD::writeData_unsafe(uint16_t data) {<br />  volatile uint8_t *wrportreg = portOutputRegister(wrport);<br /><br />  write8(data &gt;&gt; 8);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  write8(data);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br />}<br /><br />// the C/D pin is low during write<br />void PP_TFTLCD::writeCommand(uint16_t cmd) {<br />  volatile uint8_t *wrportreg = portOutputRegister(wrport);<br /><br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) &amp;= ~cdpin;<br />  //digitalWrite(_cd, LOW);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  <br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  write8(cmd &gt;&gt; 8);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  write8(cmd);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  *portOutputRegister(csport) |= cspin;<br />}<br /><br />uint16_t PP_TFTLCD::readData() {<br /> uint16_t d = 0;<br /> <br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(wrport) |= wrpin;<br />  //digitalWrite(_wr, HIGH);<br />  <br />  setReadDir();<br /><br />  *portOutputRegister(rdport) &amp;= ~rdpin;<br />  //digitalWrite(_rd, LOW);<br /><br />  delayMicroseconds(10);<br />  d = read8();<br />  d &lt;&lt;= 8;<br /><br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(rdport) &amp;= ~rdpin;<br />  //digitalWrite(_rd, LOW);<br /><br />  delayMicroseconds(10);<br />  d |= read8();<br /><br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  <br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />   <br />  return d;<br />}<br /><br /><br />/************************************* medium level data reading/writing */<br /><br />uint16_t PP_TFTLCD::readRegister(uint16_t addr) {<br />   writeCommand(addr);<br />   return readData();<br />}<br /><br />void PP_TFTLCD::writeRegister(uint16_t addr, uint16_t data) {<br />   writeCommand(addr);<br />   writeData(data);<br />}[/syntax]<br /><br />[syntax=c]#if ARDUINO &gt;= 100<br /> #include &quot;Arduino.h&quot;<br />#else<br /> #include &quot;WProgram.h&quot;<br />#endif<br /><br />// comment or uncomment the next line for special pinout!<br />//#define USE_ADAFRUIT_SHIELD_PINOUT<br /><br /><br />// register names from Peter Barrett's Microtouch code<br /><br />#define PP_TFTLCD_START_OSC0x00<br />#define PP_TFTLCD_DRIV_OUT_CTRL0x01<br />#define PP_TFTLCD_DRIV_WAV_CTRL0x02<br />#define PP_TFTLCD_ENTRY_MOD0x03<br />#define PP_TFTLCD_RESIZE_CTRL0x04<br />#define PP_TFTLCD_DISP_CTRL10x07<br />#define PP_TFTLCD_DISP_CTRL20x08<br />#define PP_TFTLCD_DISP_CTRL30x09<br />#define PP_TFTLCD_DISP_CTRL40x0A<br />#define PP_TFTLCD_RGB_DISP_IF_CTRL10x0C<br />#define PP_TFTLCD_FRM_MARKER_POS0x0D<br />#define PP_TFTLCD_RGB_DISP_IF_CTRL20x0F<br />#define PP_TFTLCD_POW_CTRL10x10<br />#define PP_TFTLCD_POW_CTRL20x11<br />#define PP_TFTLCD_POW_CTRL30x12<br />#define PP_TFTLCD_POW_CTRL40x13<br />#define PP_TFTLCD_GRAM_HOR_AD0x20<br />#define PP_TFTLCD_GRAM_VER_AD0x21<br />#define PP_TFTLCD_RW_GRAM0x22<br />#define PP_TFTLCD_POW_CTRL70x29<br />#define PP_TFTLCD_FRM_RATE_COL_CTRL0x2B<br />#define PP_TFTLCD_GAMMA_CTRL10x30<br />#define PP_TFTLCD_GAMMA_CTRL20x31<br />#define PP_TFTLCD_GAMMA_CTRL30x32<br />#define PP_TFTLCD_GAMMA_CTRL40x35 <br />#define PP_TFTLCD_GAMMA_CTRL50x36<br />#define PP_TFTLCD_GAMMA_CTRL60x37<br />#define PP_TFTLCD_GAMMA_CTRL70x38<br />#define PP_TFTLCD_GAMMA_CTRL80x39<br />#define PP_TFTLCD_GAMMA_CTRL90x3C<br />#define PP_TFTLCD_GAMMA_CTRL100x3D<br />#define PP_TFTLCD_HOR_START_AD0x50<br />#define PP_TFTLCD_HOR_END_AD0x51<br />#define PP_TFTLCD_VER_START_AD0x52<br />#define PP_TFTLCD_VER_END_AD0x53<br />#define PP_TFTLCD_GATE_SCAN_CTRL10x60<br />#define PP_TFTLCD_GATE_SCAN_CTRL20x61<br />#define PP_TFTLCD_GATE_SCAN_CTRL30x6A<br />#define PP_TFTLCD_PART_IMG1_DISP_POS0x80<br />#define PP_TFTLCD_PART_IMG1_START_AD0x81<br />#define PP_TFTLCD_PART_IMG1_END_AD0x82<br />#define PP_TFTLCD_PART_IMG2_DISP_POS0x83<br />#define PP_TFTLCD_PART_IMG2_START_AD0x84<br />#define PP_TFTLCD_PART_IMG2_END_AD0x85<br />#define PP_TFTLCD_PANEL_IF_CTRL10x90<br />#define PP_TFTLCD_PANEL_IF_CTRL20x92<br />#define PP_TFTLCD_PANEL_IF_CTRL30x93<br />#define PP_TFTLCD_PANEL_IF_CTRL40x95<br />#define PP_TFTLCD_PANEL_IF_CTRL50x97<br />#define PP_TFTLCD_PANEL_IF_CTRL60x98<br /><br />#define PP_TFTLCD_DELAYCMD                 0xFF<br /><br />#define swap(a, b) { int16_t t = a; a = b; b = t; }<br /><br />class PP_TFTLCD : public Print {<br /> public:<br />  PP_TFTLCD(uint8_t cs, uint8_t cd, uint8_t wr, uint8_t rd, uint8_t reset);<br /><br />  uint16_t Color565(uint8_t r, uint8_t g, uint8_t b);<br /><br />  // drawing primitives!<br />  void drawPixel(uint16_t x, uint16_t y, uint16_t color);<br />  void fillScreen(uint16_t color);<br />  void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);<br />  void drawFastLine(uint16_t x0, uint16_t y0, uint16_t l, uint16_t color, uint8_t flag);<br />  void drawVerticalLine(uint16_t x0, uint16_t y0, uint16_t length, uint16_t color);<br />  void drawHorizontalLine(uint16_t x0, uint16_t y0, uint16_t length, uint16_t color);<br />  void drawTriangle(uint16_t x0, uint16_t y0,<br />  uint16_t x1, uint16_t y1,<br />  uint16_t x2, uint16_t y2, uint16_t color);<br />  void fillTriangle(int32_t x0, int32_t y0,<br />  int32_t x1, int32_t y1,<br />    int32_t x2, int32_t y2, <br />    uint16_t color);<br />  void drawRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);<br />  void fillRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);<br />  void drawRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color);<br />  void fillRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color);<br />  void drawCircle(uint16_t x0, uint16_t y0, uint16_t r,uint16_t color);<br />  void fillCircle(uint16_t x0, uint16_t y0, uint16_t r,uint16_t color);<br /><br />  void setCursor(uint16_t x, uint16_t y);<br />  void setTextColor(uint16_t c, uint16_t b);<br />  void setTextSize(uint8_t s);<br />//  virtual void write(uint8_t);<br />  virtual size_t write(uint8_t);<br /><br />  void drawChar(uint16_t x, uint16_t y, char c, uint16_t color, uint8_t s = 1);<br />  void drawString(uint16_t x, uint16_t y, char *c, uint16_t color, uint8_t s = 1);<br /><br />  // commands<br />  void initDisplay(void);<br />  void goHome(void);<br />  void goTo(int x, int y);<br /><br />  void reset(void);<br />  void setRotation(uint8_t x);<br />  uint8_t getRotation();<br /><br />  /* low level */<br /><br />  void writeData(uint16_t d);<br />  void writeCommand(uint16_t c);<br />  uint16_t readData(void);<br />  uint16_t readRegister(uint16_t addr);<br />  void writeRegister(uint16_t addr, uint16_t data);<br /><br /><br />  uint16_t width();<br />  uint16_t height();<br /><br />  static const uint16_t TFTWIDTH = 240;<br />  static const uint16_t TFTHEIGHT = 320;<br /><br />  void writeData_unsafe(uint16_t d);<br /><br />  void setWriteDir(void);<br />  void setReadDir(void);<br /><br /><br />  void write8(uint8_t d);<br /><br /> private:<br />  void drawCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t corner, uint16_t color);<br />  void fillCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t corner, uint16_t delta, uint16_t color);<br /><br />  uint8_t read8(void);<br /><br />  uint8_t _cs, _cd, _reset, _wr, _rd;<br /><br />  uint8_t csport, cdport, wrport, rdport;<br />  uint8_t cspin, cdpin, wrpin, rdpin;<br /><br />  uint16_t _width, _height;<br />  uint8_t textsize;<br />  uint16_t cursor_x, cursor_y;<br />  uint16_t textcolor;  <br />  uint16_t textbgcolor;<br />  uint8_t rotation;<br />};[/syntax]<br /><br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD\PP_TFTLCD.cpp: In member function 'virtual size_t PP_TFTLCD::write(uint8_t)':<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD\PP_TFTLCD.cpp:85:69: error: no matching function for call to 'PP_TFTLCD::drawChar(uint16_t&amp;, uint16_t&amp;, uint8_t&amp;, uint16_t&amp;, uint16_t&amp;, uint8_t&amp;)'<br /><br />     drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);<br /><br />                                                                     ^<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD\PP_TFTLCD.cpp:85:69: note: candidate is:<br /><br />In file included from C:\Users\Endu\Arduino\libraries\PP_TFTLCD\PP_TFTLCD.cpp:1:0:<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD\PP_TFTLCD.h:101:8: note: void PP_TFTLCD::drawChar(uint16_t, uint16_t, char, uint16_t, uint8_t)<br /><br />   void drawChar(uint16_t x, uint16_t y, char c, uint16_t color, uint8_t s = 1);<br /><br />        ^<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD\PP_TFTLCD.h:101:8: note:   candidate expects 5 arguments, 6 provided<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD\PP_TFTLCD.cpp: At global scope:<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD\PP_TFTLCD.cpp:100:6: error: prototype for 'void PP_TFTLCD::drawChar(int16_t, int16_t, unsigned char, uint16_t, uint16_t, uint8_t)' does not match any in class 'PP_TFTLCD'<br /><br /> void PP_TFTLCD::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size) {<br /><br />      ^<br /><br />In file included from C:\Users\Endu\Arduino\libraries\PP_TFTLCD\PP_TFTLCD.cpp:1:0:<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD\PP_TFTLCD.h:101:8: error: candidate is: void PP_TFTLCD::drawChar(uint16_t, uint16_t, char, uint16_t, uint8_t)<br /><br />   void drawChar(uint16_t x, uint16_t y, char c, uint16_t color, uint8_t s = 1);<br /><br />        ^<br /><br />exit status 1<br />Błąd kompilacji dla płytki Arduino/Genuino Uno.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 15 sty 2017, o 19:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[danny]]></name></author>
<updated>2017-01-15T16:03:18+01:00</updated>
<published>2017-01-15T16:03:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179903#p179903</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179903#p179903"/>
<title type="html"><![CDATA[Re: Arduino TFT-LCD PP_TFTLCD obsluga]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179903#p179903"><![CDATA[
Bo nadal nie zadeklarowales tej zmiennej. W Aruino C++ robi się to identycznie przecież.<br /><br />-----<br /><br />To wszystko jest w bibliotece GFX dla Arduino. Przegladnij ja sobie. Porównaj ze swoimi funkcjami.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1505">danny</a> — 15 sty 2017, o 16:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-15T13:24:15+01:00</updated>
<published>2017-01-15T13:24:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179899#p179899</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179899#p179899"/>
<title type="html"><![CDATA[Re: Arduino TFT-LCD PP_TFTLCD obsluga]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179899#p179899"><![CDATA[
A może jest gdzieś inna biblioteka??? ja przekopałem chyba cały internet i tylko na jednej mi działa a raczej częściowo dziala<br />Jak sprawdzam identyfikator wyświetlacza to wyskakuje mi C505<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 15 sty 2017, o 13:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-15T11:10:14+01:00</updated>
<published>2017-01-15T11:10:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179886#p179886</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179886#p179886"/>
<title type="html"><![CDATA[Re: Arduino TFT-LCD PP_TFTLCD obsluga]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179886#p179886"><![CDATA[
Przepraszam ale na języku C się na tyle nie znam więc pozostaje mi tylko wklejać to co kolega mi tu podsyła<br /><br />dalej program się nie kompiluje  <br /><br />[syntax=c]#include &quot;PP_TFTLCD.h&quot;<br /><br /><br /><br />#ifdef USE_ADAFRUIT_SHIELD_PINOUT<br />// special defines for the dataport<br /> #define DATAPORT1 PORTD<br /> #define DATAPIN1 PIND<br /> #define DATADDR1 DDRD<br /><br /> #define DATAPORT2 PORTB<br /> #define DATAPIN2 PINB<br /> #define DATADDR2 DDRB<br /><br /> #define DATA1_MASK 0xD0<br /> #define DATA2_MASK 0x2F<br /><br />// for mega &amp; shield usage, we just hardcoded it (its messy)<br /><br />#else<br /> // for the breakout board tutorial, two ports are used :/<br /> #define DATAPORT1 PORTD<br /> #define DATAPIN1  PIND<br /> #define DATADDR1  DDRD<br /><br /> #define DATAPORT2 PORTB<br /> #define DATAPIN2  PINB<br /> #define DATADDR2  DDRB<br /><br /> #define DATA1_MASK 0xFC  // top 6 bits<br /> #define DATA2_MASK 0x03  // bottom 2 bits<br /><br /><br /> #define MEGA_DATAPORT PORTA<br /> #define MEGA_DATAPIN  PINA<br /> #define MEGA_DATADDR  DDRA<br />#endif<br /><br /><br />#include &quot;glcdfont.c&quot;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &quot;pins_arduino.h&quot;<br />#include &quot;wiring_private.h&quot;<br /><br /><br />void PP_TFTLCD::goHome(void) {<br />  goTo(0,0);<br />}<br /><br />uint16_t PP_TFTLCD::width(void) {<br />  return _width;<br />}<br />uint16_t PP_TFTLCD::height(void) {<br />  return _height;<br />}<br /><br />void PP_TFTLCD::goTo(int x, int y) {<br />  writeRegister(0x0020, x);     // GRAM Address Set (Horizontal Address) (R20h)<br />  writeRegister(0x0021, y);     // GRAM Address Set (Vertical Address) (R21h)<br />  writeCommand(0x0022);            // Write Data to GRAM (R22h)<br />}<br /><br />void PP_TFTLCD::setCursor(uint16_t x, uint16_t y) {<br />  cursor_x = x;<br />  cursor_y = y;<br />}<br /><br />void PP_TFTLCD::setTextSize(uint8_t s) {<br />  textsize = s;<br />}<br /><br />void PP_TFTLCD::setTextColor(uint16_t c, uint16_t b) {<br />  textcolor = c;<br />  textbgcolor = b;<br />}<br /><br />//void PP_TFTLCD::write(uint8_t c) {<br />size_t PP_TFTLCD::write(uint8_t c) {<br />  if (c == '\n') {<br />    cursor_y += textsize*8;<br />    cursor_x = 0;<br />  } else if (c == '\r') {<br />    // skip em<br />  } else {<br />  drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);<br />    cursor_x += textsize*6;<br />  }<br />}<br /><br />void PP_TFTLCD::drawString(uint16_t x, uint16_t y, char *c, <br />uint16_t color, uint8_t size) {<br />  while (c&#91;0&#93; != 0) {<br />    drawChar(x, y, c&#91;0&#93;, color, size);<br />    x += size*6;<br />    c++;<br />  }<br />}<br />// Draw a character<br />void PP_TFTLCD::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,<br />                uint16_t bg, uint8_t size) {<br />        if ((x &gt;= _width) || // Clip right<br />                        (y &gt;= _height) || // Clip bottom<br />                        ((x + 6 * size - 1) &lt; 0) || // Clip left<br />                        ((y + 8 * size - 1) &lt; 0))   // Clip top<br />                return;<br /> <br />        for (int8_t i = 0; i &lt; 6; i++) {<br />                uint8_t line;<br />                if (i == 5)<br />                        line = 0x0;<br />                else<br />                        line = pgm_read_byte(font + (c * 5) + i);<br />                for (int8_t j = 0; j &lt; 8; j++) {<br />                        if (line &amp; 0x1) {<br />                                if (size == 1) // default size<br />                                        drawPixel(x + i, y + j, color);<br />                                else {  // big size<br />                                        fillRect(x + (i * size), y + (j * size), size, size,<br />                                                        color);<br />                                }<br />                        } else if (bg != color) {<br />                                if (size == 1) // default size<br />                                        drawPixel(x + i, y + j, bg);<br />                                else {  // big size<br />                                        fillRect(x + i * size, y + j * size, size, size, bg);<br />                                }<br />                        }<br />                        line &gt;&gt;= 1;<br />                }<br />        }<br />}<br /><br />// draw a triangle!<br />void PP_TFTLCD::drawTriangle(uint16_t x0, uint16_t y0,<br />  uint16_t x1, uint16_t y1,<br />  uint16_t x2, uint16_t y2, uint16_t color)<br />{<br />  drawLine(x0, y0, x1, y1, color);<br />  drawLine(x1, y1, x2, y2, color);<br />  drawLine(x2, y2, x0, y0, color); <br />}<br /><br />void PP_TFTLCD::fillTriangle ( int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint16_t color)<br />{<br />  if (y0 &gt; y1) {<br />    swap(y0, y1); swap(x0, x1);<br />  }<br />  if (y1 &gt; y2) {<br />    swap(y2, y1); swap(x2, x1);<br />  }<br />  if (y0 &gt; y1) {<br />    swap(y0, y1); swap(x0, x1);<br />  }<br /><br />  int32_t dx1, dx2, dx3; // Interpolation deltas<br />  int32_t sx1, sx2, sy; // Scanline co-ordinates<br /><br />  sx2=(int32_t)x0 * (int32_t)1000; // Use fixed point math for x axis values<br />  sx1 = sx2;<br />  sy=y0;<br /><br />  // Calculate interpolation deltas<br />  if (y1-y0 &gt; 0) dx1=((x1-x0)*1000)/(y1-y0);<br />    else dx1=0;<br />  if (y2-y0 &gt; 0) dx2=((x2-x0)*1000)/(y2-y0);<br />    else dx2=0;<br />  if (y2-y1 &gt; 0) dx3=((x2-x1)*1000)/(y2-y1);<br />    else dx3=0;<br /><br />  // Render scanlines (horizontal lines are the fastest rendering method)<br />  if (dx1 &gt; dx2)<br />  {<br />    for(; sy&lt;=y1; sy++, sx1+=dx2, sx2+=dx1)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />    sx2 = x1*1000;<br />    sy = y1;<br />    for(; sy&lt;=y2; sy++, sx1+=dx2, sx2+=dx3)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />  }<br />  else<br />  {<br />    for(; sy&lt;=y1; sy++, sx1+=dx1, sx2+=dx2)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />    sx1 = x1*1000;<br />    sy = y1;<br />    for(; sy&lt;=y2; sy++, sx1+=dx3, sx2+=dx2)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />  }<br />}<br /><br />uint16_t PP_TFTLCD::Color565(uint8_t r, uint8_t g, uint8_t b) {<br />  uint16_t c;<br />  c = r &gt;&gt; 3;<br />  c &lt;&lt;= 6;<br />  c |= g &gt;&gt; 2;<br />  c &lt;&lt;= 5;<br />  c |= b &gt;&gt; 3;<br /><br />  return c;<br />}<br /><br />// draw a rectangle<br />void PP_TFTLCD::drawRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, <br />      uint16_t color) {<br />  // smarter version<br />  drawHorizontalLine(x, y, w, color);<br />  drawHorizontalLine(x, y+h-1, w, color);<br />  drawVerticalLine(x, y, h, color);<br />  drawVerticalLine(x+w-1, y, h, color);<br />}<br /><br />// draw a rounded rectangle<br />void PP_TFTLCD::drawRoundRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t r,<br />   uint16_t color) {<br />  // smarter version<br />  drawHorizontalLine(x+r, y, w-2*r, color);<br />  drawHorizontalLine(x+r, y+h-1, w-2*r, color);<br />  drawVerticalLine(x, y+r, h-2*r, color);<br />  drawVerticalLine(x+w-1, y+r, h-2*r, color);<br />  // draw four corners<br />  drawCircleHelper(x+r, y+r, r, 1, color);<br />  drawCircleHelper(x+w-r-1, y+r, r, 2, color);<br />  drawCircleHelper(x+w-r-1, y+h-r-1, r, 4, color);<br />  drawCircleHelper(x+r, y+h-r-1, r, 8, color);<br />}<br /><br /><br />// fill a rounded rectangle<br />void PP_TFTLCD::fillRoundRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t r,<br />   uint16_t color) {<br />  // smarter version<br />  fillRect(x+r, y, w-2*r, h, color);<br /><br />  // draw four corners<br />  fillCircleHelper(x+w-r-1, y+r, r, 1, h-2*r-1, color);<br />  fillCircleHelper(x+r, y+r, r, 2, h-2*r-1, color);<br />}<br /><br />// fill a circle<br />void PP_TFTLCD::fillCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color) {<br />  writeRegister(PP_TFTLCD_ENTRY_MOD, 0x1030);<br />  drawVerticalLine(x0, y0-r, 2*r+1, color);<br />  fillCircleHelper(x0, y0, r, 3, 0, color);<br />}<br /><br /><br />// used to do circles and roundrects!<br />void PP_TFTLCD::fillCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t cornername, uint16_t delta,<br />uint16_t color) {<br /><br />  int16_t f = 1 - r;<br />  int16_t ddF_x = 1;<br />  int16_t ddF_y = -2 * r;<br />  int16_t x = 0;<br />  int16_t y = r;<br /><br />  while (x&lt;y) {<br />    if (f &gt;= 0) {<br />      y--;<br />      ddF_y += 2;<br />      f += ddF_y;<br />    }<br />    x++;<br />    ddF_x += 2;<br />    f += ddF_x;<br />  <br />    if (cornername &amp; 0x1) {<br />      drawVerticalLine(x0+x, y0-y, 2*y+1+delta, color);<br />      drawVerticalLine(x0+y, y0-x, 2*x+1+delta, color);<br />    }<br />    if (cornername &amp; 0x2) {<br />      drawVerticalLine(x0-x, y0-y, 2*y+1+delta, color);<br />      drawVerticalLine(x0-y, y0-x, 2*x+1+delta, color);<br />    }<br />  }<br />}<br /><br /><br />// draw a circle outline<br /><br />void PP_TFTLCD::drawCircle(uint16_t x0, uint16_t y0, uint16_t r, <br />uint16_t color) {<br />  drawPixel(x0, y0+r, color);<br />  drawPixel(x0, y0-r, color);<br />  drawPixel(x0+r, y0, color);<br />  drawPixel(x0-r, y0, color);<br /><br />  drawCircleHelper(x0, y0, r, 0xF, color);<br />}<br /><br />void PP_TFTLCD::drawCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t cornername,<br />uint16_t color) {<br />  int16_t f = 1 - r;<br />  int16_t ddF_x = 1;<br />  int16_t ddF_y = -2 * r;<br />  int16_t x = 0;<br />  int16_t y = r;<br /><br /><br />  while (x&lt;y) {<br />    if (f &gt;= 0) {<br />      y--;<br />      ddF_y += 2;<br />      f += ddF_y;<br />    }<br />    x++;<br />    ddF_x += 2;<br />    f += ddF_x;<br />    if (cornername &amp; 0x4) {<br />      drawPixel(x0 + x, y0 + y, color);<br />      drawPixel(x0 + y, y0 + x, color);<br />    } <br />    if (cornername &amp; 0x2) {<br />      drawPixel(x0 + x, y0 - y, color);<br />      drawPixel(x0 + y, y0 - x, color);<br />    }<br />    if (cornername &amp; 0x8) {<br />      drawPixel(x0 - y, y0 + x, color);<br />      drawPixel(x0 - x, y0 + y, color);<br />    }<br />    if (cornername &amp; 0x1) {<br />      drawPixel(x0 - y, y0 - x, color);<br />      drawPixel(x0 - x, y0 - y, color);<br />    }<br />  }<br />}<br /><br />// fill a rectangle<br />void PP_TFTLCD::fillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, <br />      uint16_t fillcolor) {<br />  // smarter version<br />  while (h--)<br />    drawHorizontalLine(x, y++, w, fillcolor);<br />}<br /><br /><br />void PP_TFTLCD::drawVerticalLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color)<br />{<br />  if (x &gt;= _width) return;<br /><br />  drawFastLine(x,y,length,color,1);<br />}<br /><br />void PP_TFTLCD::drawHorizontalLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color)<br />{<br />  if (y &gt;= _height) return;<br />  drawFastLine(x,y,length,color,0);<br />}<br /><br />void PP_TFTLCD::drawFastLine(uint16_t x, uint16_t y, uint16_t length, <br />  uint16_t color, uint8_t rotflag)<br />{<br />  uint16_t newentrymod;<br /><br />  switch (rotation) {<br />  case 0:<br />    if (rotflag)<br />      newentrymod = 0x1028;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1030;   // we want a 'horizontal line'<br />    break;<br />  case 1:<br />    swap(x, y);<br />    // first up fix the X<br />    x = TFTWIDTH - x - 1;<br />    if (rotflag)<br />      newentrymod = 0x1000;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1028;   // we want a 'horizontal line'<br />    break;<br />  case 2:<br />    x = TFTWIDTH - x - 1;<br />    y = TFTHEIGHT - y - 1;<br />    if (rotflag)<br />      newentrymod = 0x1008;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1020;   // we want a 'horizontal line'<br />    break;<br />  case 3:<br />    swap(x,y);<br />    y = TFTHEIGHT - y - 1;<br />    if (rotflag)<br />      newentrymod = 0x1030;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1008;   // we want a 'horizontal line'<br />    break;<br />  }<br />  <br />  writeRegister(PP_TFTLCD_ENTRY_MOD, newentrymod);<br /><br />  writeRegister(PP_TFTLCD_GRAM_HOR_AD, x); // GRAM Address Set (Horizontal Address) (R20h)<br />  writeRegister(PP_TFTLCD_GRAM_VER_AD, y); // GRAM Address Set (Vertical Address) (R21h)<br />  writeCommand(PP_TFTLCD_RW_GRAM);  // Write Data to GRAM (R22h)<br /><br /><br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(wrport) |= wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  while (length--) {<br />    writeData_unsafe(color); <br />  }<br /><br />  // set back to default<br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />  writeRegister(PP_TFTLCD_ENTRY_MOD, 0x1030);<br />}<br /><br /><br /><br />// bresenham's algorithm - thx wikpedia<br />void PP_TFTLCD::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, <br />      uint16_t color) {<br />  // if you're in rotation 1 or 3, we need to swap the X and Y's<br /><br />  int16_t steep = abs(y1 - y0) &gt; abs(x1 - x0);<br />  if (steep) {<br />    swap(x0, y0);<br />    swap(x1, y1);<br />  }<br /><br />  if (x0 &gt; x1) {<br />    swap(x0, x1);<br />    swap(y0, y1);<br />  }<br /><br />  int16_t dx, dy;<br />  dx = x1 - x0;<br />  //dy = abs(y1 - y0);<br />  dy = abs(y1 - y0);<br /><br />  int16_t err = dx / 2;<br />  int16_t ystep;<br /><br />  if (y0 &lt; y1) {<br />    ystep = 1;<br />  } else {<br />    ystep = -1;}<br /><br />  for (; x0&lt;=x1; x0++) {<br />    if (steep) {<br />      drawPixel(y0, x0, color);<br />    } else {<br />      drawPixel(x0, y0, color);<br />    }<br />    err -= dy;<br />    if (err &lt; 0) {<br />      y0 += ystep;<br />      err += dx;<br />    }<br />  }<br />}<br /><br /><br />void PP_TFTLCD::fillScreen(uint16_t color) {<br />  goHome();<br />  uint32_t i;<br />  <br />  i = 320;<br />  i *= 240;<br />  <br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(wrport) |= wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  while (i--) {<br />    writeData_unsafe(color); <br />  }<br /><br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />}<br /><br />void PP_TFTLCD::drawPixel(uint16_t x, uint16_t y, uint16_t color)<br />{<br />  // check rotation, move pixel around if necessary<br />  switch (rotation) {<br />  case 1:<br />    swap(x, y);<br />    x = TFTWIDTH - x - 1;<br />    break;<br />  case 2:<br />    x = TFTWIDTH - x - 1;<br />    y = TFTHEIGHT - y - 1;<br />    break;<br />  case 3:<br />    swap(x, y);<br />    y = TFTHEIGHT - y - 1;<br />    break;<br />  }<br />    <br />  if ((x &gt;= TFTWIDTH) || (y &gt;= TFTHEIGHT)) return;<br />  writeRegister(PP_TFTLCD_GRAM_HOR_AD, x); // GRAM Address Set (Horizontal Address) (R20h)<br />  writeRegister(PP_TFTLCD_GRAM_VER_AD, y); // GRAM Address Set (Vertical Address) (R21h)<br />  writeCommand(PP_TFTLCD_RW_GRAM);  // Write Data to GRAM (R22h)<br />  writeData(color);<br />}<br /><br />static const uint16_t _regValues&#91;&#93; PROGMEM = {<br /><br />     0x0000,0x0000,<br />0x0000,0x0000,<br />0x0000,0x0000,<br />0x0000,0x0000,<br /><br />0x00a4,0x0001,<br />//delay_ms(20,  <br />0x0060,0x2700,<br />0x0008,0x0202,<br /><br />0x0030,0x0214,<br />0x0031,0x3715,<br />0x0032,0x0604,<br />0x0033,0x0e16,<br />0x0034,0x2211,<br />0x0035,0x1500,<br />0x0036,0x8507,<br />0x0037,0x1407,<br />0x0038,0x1403,<br />0x0039,0x0020,<br /><br />0x0090,0x001a,<br />0x0010,0x0000,<br />0x0011,0x0007,<br />0x0012,0x0000,<br />0x0013,0x0000,<br />//delay_ms(20,<br /><br />0x0010,0x0730,<br />0x0011,0x0137,<br />//delay_ms(20,<br /><br />0x0012,0x01b8,<br />//delay_ms(20,<br /><br />0x0013,0x0f00,<br />0x002a,0x0080,<br />0x0029,0x0048,<br />//delay_ms(20,<br /><br />0x0001,0x0100,<br />0x0002,0x0700,<br />0x0003,0x1230,<br />0x0008,0x0202,<br />0x000a,0x0000,<br />0x000c,0x0000,<br />0x000d,0x01ff,<br />0x000e,0x0000,<br />0x0050,0x0000,<br />0x0051,0x00ef,<br />0x0052,0x0000,<br />0x0053,0x013f,<br />0x0060,0x2700,<br />0x0061,0x0001,<br />0x006a,0x0000,<br />//0x0080,0x0000,<br />//0x0081,0x0000,<br />0x0090,0X0011,<br />0x0092,0x0600,<br />0x0093,0x0402,<br />0x0094,0x0002,<br />//delay_ms(20,<br /><br />0x0007,0x0001,<br />//delay_ms(20,<br />0x0007,0x0061,<br />0x0007,0x0173,<br /><br />0x0020,0x0000,<br />0x0021,0x0000,  <br />0x00,0x22,  <br /><br />};<br /><br />void PP_TFTLCD::initDisplay(void) {<br />  uint16_t a, d;<br /><br />  reset();<br />  <br />  for (uint8_t i = 0; i &lt; sizeof(_regValues) / 4; i++) {<br />    a = pgm_read_word(_regValues + i*2);<br />    d = pgm_read_word(_regValues + i*2 + 1);<br /><br />    if (a == 0xFF) {<br />      delay(d);<br />    } else {<br />      writeRegister(a, d);<br />      //Serial.print(&quot;addr: &quot;); Serial.print(a); <br />      //Serial.print(&quot; data: &quot;); Serial.println(d, HEX);<br />    }<br />  }<br />}<br /><br />uint8_t PP_TFTLCD::getRotation(void) {<br />  return rotation;<br />}<br /><br />void PP_TFTLCD::setRotation(uint8_t x) {<br />  writeRegister(PP_TFTLCD_ENTRY_MOD, 0x1030);<br /><br />  x %= 4;  // cant be higher than 3<br />  rotation = x;<br />  switch (x) {<br />  case 0:<br />    _width = TFTWIDTH; <br />    _height = TFTHEIGHT;<br />    break;<br />  case 1:<br />    _width = TFTHEIGHT; <br />    _height = TFTWIDTH;<br />    break;<br />  case 2:<br />    _width = TFTWIDTH; <br />    _height = TFTHEIGHT;<br />    break;<br />  case 3:<br />    _width = TFTHEIGHT; <br />    _height = TFTWIDTH;<br />    break;<br /> }<br />}<br /><br />/********************************* low level pin initialization */<br /><br />PP_TFTLCD::PP_TFTLCD(uint8_t cs, uint8_t cd, uint8_t wr, uint8_t rd, uint8_t reset) {<br />  _cs = cs;<br />  _cd = cd;<br />  _wr = wr;<br />  _rd = rd;<br />  _reset = reset;<br />  <br />  rotation = 0;<br />  _width = TFTWIDTH;<br />  _height = TFTHEIGHT;<br /><br />  // disable the LCD<br />  digitalWrite(_cs, HIGH);<br />  pinMode(_cs, OUTPUT);  <br />  <br />  digitalWrite(_cd, HIGH);<br />  pinMode(_cd, OUTPUT);  <br />  <br />  digitalWrite(_wr, HIGH);<br />  pinMode(_wr, OUTPUT);  <br />  <br />  digitalWrite(_rd, HIGH);<br />  pinMode(_rd, OUTPUT);  <br /><br />  digitalWrite(_reset, HIGH); <br />  pinMode(_reset, OUTPUT); <br /><br />  csport = digitalPinToPort(_cs);<br />  cdport = digitalPinToPort(_cd);<br />  wrport = digitalPinToPort(_wr);<br />  rdport = digitalPinToPort(_rd);<br /><br />  cspin = digitalPinToBitMask(_cs);<br />  cdpin = digitalPinToBitMask(_cd);<br />  wrpin = digitalPinToBitMask(_wr);<br />  rdpin = digitalPinToBitMask(_rd);<br /><br />  cursor_y = cursor_x = 0;<br />  textsize = 1;<br />  textcolor = 0xFFFF;<br />}<br /><br /><br />/********************************** low level pin interface */<br /><br />void PP_TFTLCD::reset(void) {<br />  if (_reset)<br />    digitalWrite(_reset, LOW);<br />  delay(2); <br />  if (_reset)<br />    digitalWrite(_reset, HIGH);<br /><br />  // resync<br />  writeData(0);<br />  writeData(0);<br />  writeData(0);  <br />  writeData(0);<br />}<br /><br />inline void PP_TFTLCD::setWriteDir(void) {<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br />  DATADDR2 |= DATA2_MASK;<br />  DATADDR1 |= DATA1_MASK;<br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) <br /><br />  #ifdef USE_ADAFRUIT_SHIELD_PINOUT<br />  DDRH |= 0x78;<br />  DDRB |= 0xB0;<br />  DDRG |= _BV(5);<br />  #else<br />  MEGA_DATADDR = 0xFF;<br />  #endif<br />#else<br />  #error &quot;No pins defined!&quot;<br />#endif<br />}<br /><br />inline void PP_TFTLCD::setReadDir(void) {<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br />  DATADDR2 &amp;= ~DATA2_MASK;<br />  DATADDR1 &amp;= ~DATA1_MASK;<br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) <br /><br />  #ifdef USE_ADAFRUIT_SHIELD_PINOUT<br />  DDRH &amp;= ~0x78;<br />  DDRB &amp;= ~0xB0;<br />  DDRG &amp;= ~_BV(5);<br />  #else<br />  MEGA_DATADDR = 0;<br />  #endif<br />#else<br />  #error &quot;No pins defined!&quot;<br />#endif<br />}<br /><br />inline void PP_TFTLCD::write8(uint8_t d) {<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br /><br />  DATAPORT2 = (DATAPORT2 &amp; DATA1_MASK) | <br />    (d &amp; DATA2_MASK);<br />  DATAPORT1 = (DATAPORT1 &amp; DATA2_MASK) | <br />    (d &amp; DATA1_MASK); // top 6 bits<br />  <br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) <br /><br /><br />#ifdef USE_ADAFRUIT_SHIELD_PINOUT<br /><br />  // bit 6/7 (PH3 &amp; 4)<br />  // first two bits 0 &amp; 1 (PH5 &amp; 6)<br />  PORTH &amp;= ~(0x78);<br />  PORTH |= ((d&amp;0xC0) &gt;&gt; 3) | ((d&amp;0x3) &lt;&lt; 5);<br /><br />  // bits 2 &amp; 3 (PB4 &amp; PB5)<br />  // bit 5 (PB7)<br />  PORTB &amp;= ~(0xB0); <br />  PORTB |= ((d &amp; 0x2C) &lt;&lt; 2);<br /><br />  // bit 4  (PG5)<br />  if (d &amp; _BV(4))<br />    PORTG |= _BV(5);<br />  else<br />    PORTG &amp;= ~_BV(5);<br /><br />  #else<br />     MEGA_DATAPORT = d;  <br />  #endif<br /><br />#else<br />  #error &quot;No pins defined!&quot;<br />#endif<br />}<br /><br />inline uint8_t PP_TFTLCD::read8(void) {<br /> uint8_t d;<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br /><br /> d = DATAPIN1 &amp; DATA1_MASK; <br /> d |= DATAPIN2 &amp; DATA2_MASK; <br /><br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__)  || defined(__AVR_ATmega1280__) <br /><br />#ifdef USE_ADAFRUIT_SHIELD_PINOUT<br /><br />  // bit 6/7 (PH3 &amp; 4)<br />  // first two bits 0 &amp; 1 (PH5 &amp; 6)<br /> d = (PINH &amp; 0x60) &gt;&gt; 5;<br /> d |= (PINH &amp; 0x18) &lt;&lt; 3;<br /><br />  // bits 2 &amp; 3 &amp; 5 (PB4 &amp; PB5, PB7)<br /> d |= (PINB &amp; 0xB0) &gt;&gt; 2;<br /><br />  // bit 4  (PG5)<br />  if (PING &amp; _BV(5))<br />    d |= _BV(4);<br /><br />#else<br /> d = MEGA_DATAPIN;  <br />#endif<br /><br />#else<br /><br />  #error &quot;No pins defined!&quot;<br /><br />#endif<br /><br /> return d;<br />}<br /><br />/********************************** low level readwrite interface */<br /><br />// the C/D pin is high during write<br />void PP_TFTLCD::writeData(uint16_t data) {<br />  volatile uint8_t *wrportreg = portOutputRegister(wrport);<br /><br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  <br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  write8(data &gt;&gt; 8);<br />  <br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  write8(data);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />}<br /><br />// this is a 'sped up' version, with no direction setting, or pin initialization<br />// not for external usage, but it does speed up stuff like a screen fill<br />inline void PP_TFTLCD::writeData_unsafe(uint16_t data) {<br />  volatile uint8_t *wrportreg = portOutputRegister(wrport);<br /><br />  write8(data &gt;&gt; 8);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  write8(data);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br />}<br /><br />// the C/D pin is low during write<br />void PP_TFTLCD::writeCommand(uint16_t cmd) {<br />  volatile uint8_t *wrportreg = portOutputRegister(wrport);<br /><br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) &amp;= ~cdpin;<br />  //digitalWrite(_cd, LOW);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  <br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  write8(cmd &gt;&gt; 8);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  write8(cmd);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  *portOutputRegister(csport) |= cspin;<br />}<br /><br />uint16_t PP_TFTLCD::readData() {<br /> uint16_t d = 0;<br /> <br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(wrport) |= wrpin;<br />  //digitalWrite(_wr, HIGH);<br />  <br />  setReadDir();<br /><br />  *portOutputRegister(rdport) &amp;= ~rdpin;<br />  //digitalWrite(_rd, LOW);<br /><br />  delayMicroseconds(10);<br />  d = read8();<br />  d &lt;&lt;= 8;<br /><br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(rdport) &amp;= ~rdpin;<br />  //digitalWrite(_rd, LOW);<br /><br />  delayMicroseconds(10);<br />  d |= read8();<br /><br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  <br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />   <br />  return d;<br />}<br /><br /><br />/************************************* medium level data reading/writing */<br /><br />uint16_t PP_TFTLCD::readRegister(uint16_t addr) {<br />   writeCommand(addr);<br />   return readData();<br />}<br /><br />void PP_TFTLCD::writeRegister(uint16_t addr, uint16_t data) {<br />   writeCommand(addr);<br />   writeData(data);<br />}[/syntax]<br /><br />Wcześniej nie wygaszał pixeli a teraz to nie chce się nawet skapilowac<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD-master\PP_TFTLCD.cpp: In member function 'void PP_TFTLCD::setTextColor(uint16_t, uint16_t)':<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD-master\PP_TFTLCD.cpp:74:3: error: 'textbgcolor' was not declared in this scope<br /><br />   textbgcolor = b;<br /><br />   ^<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD-master\PP_TFTLCD.cpp: In member function 'virtual size_t PP_TFTLCD::write(uint8_t)':<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD-master\PP_TFTLCD.cpp:85:47: error: 'textbgcolor' was not declared in this scope<br /><br />    drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);<br /><br />                                               ^<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD-master\PP_TFTLCD.cpp: At global scope:<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD-master\PP_TFTLCD.cpp:99:6: error: prototype for 'void PP_TFTLCD::drawChar(int16_t, int16_t, unsigned char, uint16_t, uint16_t, uint8_t)' does not match any in class 'PP_TFTLCD'<br /><br /> void PP_TFTLCD::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,<br /><br />      ^<br /><br />In file included from C:\Users\Endu\Arduino\libraries\PP_TFTLCD-master\PP_TFTLCD.cpp:1:0:<br /><br />C:\Users\Endu\Arduino\libraries\PP_TFTLCD-master\PP_TFTLCD.h:101:8: error: candidate is: void PP_TFTLCD::drawChar(uint16_t, uint16_t, char, uint16_t, uint8_t)<br /><br />   void drawChar(uint16_t x, uint16_t y, char c, uint16_t color, uint8_t s = 1);<br /><br />        ^<br /><br />exit status 1<br />Błąd kompilacji dla płytki Arduino/Genuino Uno.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 15 sty 2017, o 11:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[danny]]></name></author>
<updated>2017-01-14T23:07:08+01:00</updated>
<published>2017-01-14T23:07:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179871#p179871</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179871#p179871"/>
<title type="html"><![CDATA[Re: Arduino TFT-LCD PP_TFTLCD obsluga]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179871#p179871"><![CDATA[
To jest zmienna typu uint_16t.  A zadeklarowałeś ją przy okazji przeróbki funkcji której przykład Ci podałem naprowadzając, z czego wynika nie gaszenie pikseli przy wypisywaniu tekstu?<br /><br />Żeby niepotrzebne piksele zmieniły kolor na identyczny z tłem zmiennej textbgcolor przy wywoływaniu funkcji przypisuj ten sam olor co w funkcji Twojej tft.fillscreen.<br /><br /><br />Musisz także lekko zmodyfikować swoja funkcję:<br />[syntax=c]// draw a character<br />void PP_TFTLCD::drawChar(uint16_t x, uint16_t y, char c,<br />                      uint16_t color, uint8_t size) {<br />  for (uint8_t i =0; i&lt;5; i++ ) {<br />    uint8_t line = pgm_read_byte(font+(c*5)+i);<br />    for (uint8_t j = 0; j&lt;8; j++) {<br />      if (line &amp; 0x1) {<br />        if (size == 1) // default size<br />          drawPixel(x+i, y+j, color);<br />        else {  // big size<br />          fillRect(x+i*size, y+j*size, size, size, color);<br />        }<br />      }<br />      line &gt;&gt;= 1;<br />    }<br />  }<br />}[/syntax]<br /><br />na coś takiego:<br /><br />[syntax=c]// Draw a character<br />void PP_TFTLCD::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,<br />uint16_t bg, uint8_t size) {<br />if ((x &gt;= _width) || // Clip right<br />(y &gt;= _height) || // Clip bottom<br />((x + 6 * size - 1) &lt; 0) || // Clip left<br />((y + 8 * size - 1) &lt; 0))   // Clip top<br />return;<br /><br />for (int8_t i = 0; i &lt; 6; i++) {<br />uint8_t line;<br />if (i == 5)<br />line = 0x0;<br />else<br />line = pgm_read_byte(font + (c * 5) + i);<br />for (int8_t j = 0; j &lt; 8; j++) {<br />if (line &amp; 0x1) {<br />if (size == 1) // default size<br />drawPixel(x + i, y + j, color);<br />else {  // big size<br />fillRect(x + (i * size), y + (j * size), size, size,<br />color);<br />}<br />} else if (bg != color) {<br />if (size == 1) // default size<br />drawPixel(x + i, y + j, bg);<br />else {  // big size<br />fillRect(x + i * size, y + j * size, size, size, bg);<br />}<br />}<br />line &gt;&gt;= 1;<br />}<br />}<br />}[/syntax]<br /><br />I oczywiscie w kodzie tam, gdzie kolega ma funkcję: [syntax=c]size_t PP_TFTLCD::write(uint8_t c):[/syntax]<br /><br />[syntax=c]drawChar(cursor_x, cursor_y, c, textcolor, textsize);[/syntax]<br /><br />zmienić na:<br /><br />[syntax=c]drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1505">danny</a> — 14 sty 2017, o 23:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-14T21:41:49+01:00</updated>
<published>2017-01-14T21:41:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179863#p179863</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179863#p179863"/>
<title type="html"><![CDATA[Re: Arduino TFT-LCD PP_TFTLCD obsluga]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179863#p179863"><![CDATA[
W obu plikach zmieniłem linijki ale wywala hasło że C:\Users\Endu\Arduino\libraries\PP_TFTLCD-master\PP_TFTLCD.cpp:74:3: error: 'textbgcolor' was not declared in this scope<br /><br />   textbgcolor = b;<br /><br />[syntax=c]#include &quot;PP_TFTLCD.h&quot;<br /><br /><br /><br />#ifdef USE_ADAFRUIT_SHIELD_PINOUT<br />// special defines for the dataport<br /> #define DATAPORT1 PORTD<br /> #define DATAPIN1 PIND<br /> #define DATADDR1 DDRD<br /><br /> #define DATAPORT2 PORTB<br /> #define DATAPIN2 PINB<br /> #define DATADDR2 DDRB<br /><br /> #define DATA1_MASK 0xD0<br /> #define DATA2_MASK 0x2F<br /><br />// for mega &amp; shield usage, we just hardcoded it (its messy)<br /><br />#else<br /> // for the breakout board tutorial, two ports are used :/<br /> #define DATAPORT1 PORTD<br /> #define DATAPIN1  PIND<br /> #define DATADDR1  DDRD<br /><br /> #define DATAPORT2 PORTB<br /> #define DATAPIN2  PINB<br /> #define DATADDR2  DDRB<br /><br /> #define DATA1_MASK 0xFC  // top 6 bits<br /> #define DATA2_MASK 0x03  // bottom 2 bits<br /><br /><br /> #define MEGA_DATAPORT PORTA<br /> #define MEGA_DATAPIN  PINA<br /> #define MEGA_DATADDR  DDRA<br />#endif<br /><br /><br />#include &quot;glcdfont.c&quot;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &quot;pins_arduino.h&quot;<br />#include &quot;wiring_private.h&quot;<br /><br /><br />void PP_TFTLCD::goHome(void) {<br />  goTo(0,0);<br />}<br /><br />uint16_t PP_TFTLCD::width(void) {<br />  return _width;<br />}<br />uint16_t PP_TFTLCD::height(void) {<br />  return _height;<br />}<br /><br />void PP_TFTLCD::goTo(int x, int y) {<br />  writeRegister(0x0020, x);     // GRAM Address Set (Horizontal Address) (R20h)<br />  writeRegister(0x0021, y);     // GRAM Address Set (Vertical Address) (R21h)<br />  writeCommand(0x0022);            // Write Data to GRAM (R22h)<br />}<br /><br />void PP_TFTLCD::setCursor(uint16_t x, uint16_t y) {<br />  cursor_x = x;<br />  cursor_y = y;<br />}<br /><br />void PP_TFTLCD::setTextSize(uint8_t s) {<br />  textsize = s;<br />}<br /><br />void PP_TFTLCD::setTextColor(uint16_t c, uint16_t b) {<br />  textcolor = c;<br />  textbgcolor = b;<br />}<br /><br />//void PP_TFTLCD::write(uint8_t c) {<br />size_t PP_TFTLCD::write(uint8_t c) {<br />  if (c == '\n') {<br />    cursor_y += textsize*8;<br />    cursor_x = 0;<br />  } else if (c == '\r') {<br />    // skip em<br />  } else {<br />    drawChar(cursor_x, cursor_y, c, textcolor, textsize);<br />    cursor_x += textsize*6;<br />  }<br />}<br /><br />void PP_TFTLCD::drawString(uint16_t x, uint16_t y, char *c, <br />uint16_t color, uint8_t size) {<br />  while (c&#91;0&#93; != 0) {<br />    drawChar(x, y, c&#91;0&#93;, color, size);<br />    x += size*6;<br />    c++;<br />  }<br />}<br />// draw a character<br />void PP_TFTLCD::drawChar(uint16_t x, uint16_t y, char c, <br />      uint16_t color, uint8_t size) {<br />  for (uint8_t i =0; i&lt;5; i++ ) {<br />    uint8_t line = pgm_read_byte(font+(c*5)+i);<br />    for (uint8_t j = 0; j&lt;8; j++) {<br />      if (line &amp; 0x1) {<br />if (size == 1) // default size<br />  drawPixel(x+i, y+j, color);<br />else {  // big size<br />  fillRect(x+i*size, y+j*size, size, size, color);<br />} <br />      }<br />      line &gt;&gt;= 1;<br />    }<br />  }<br />}<br /><br />// draw a triangle!<br />void PP_TFTLCD::drawTriangle(uint16_t x0, uint16_t y0,<br />  uint16_t x1, uint16_t y1,<br />  uint16_t x2, uint16_t y2, uint16_t color)<br />{<br />  drawLine(x0, y0, x1, y1, color);<br />  drawLine(x1, y1, x2, y2, color);<br />  drawLine(x2, y2, x0, y0, color); <br />}<br /><br />void PP_TFTLCD::fillTriangle ( int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint16_t color)<br />{<br />  if (y0 &gt; y1) {<br />    swap(y0, y1); swap(x0, x1);<br />  }<br />  if (y1 &gt; y2) {<br />    swap(y2, y1); swap(x2, x1);<br />  }<br />  if (y0 &gt; y1) {<br />    swap(y0, y1); swap(x0, x1);<br />  }<br /><br />  int32_t dx1, dx2, dx3; // Interpolation deltas<br />  int32_t sx1, sx2, sy; // Scanline co-ordinates<br /><br />  sx2=(int32_t)x0 * (int32_t)1000; // Use fixed point math for x axis values<br />  sx1 = sx2;<br />  sy=y0;<br /><br />  // Calculate interpolation deltas<br />  if (y1-y0 &gt; 0) dx1=((x1-x0)*1000)/(y1-y0);<br />    else dx1=0;<br />  if (y2-y0 &gt; 0) dx2=((x2-x0)*1000)/(y2-y0);<br />    else dx2=0;<br />  if (y2-y1 &gt; 0) dx3=((x2-x1)*1000)/(y2-y1);<br />    else dx3=0;<br /><br />  // Render scanlines (horizontal lines are the fastest rendering method)<br />  if (dx1 &gt; dx2)<br />  {<br />    for(; sy&lt;=y1; sy++, sx1+=dx2, sx2+=dx1)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />    sx2 = x1*1000;<br />    sy = y1;<br />    for(; sy&lt;=y2; sy++, sx1+=dx2, sx2+=dx3)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />  }<br />  else<br />  {<br />    for(; sy&lt;=y1; sy++, sx1+=dx1, sx2+=dx2)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />    sx1 = x1*1000;<br />    sy = y1;<br />    for(; sy&lt;=y2; sy++, sx1+=dx3, sx2+=dx2)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />  }<br />}<br /><br />uint16_t PP_TFTLCD::Color565(uint8_t r, uint8_t g, uint8_t b) {<br />  uint16_t c;<br />  c = r &gt;&gt; 3;<br />  c &lt;&lt;= 6;<br />  c |= g &gt;&gt; 2;<br />  c &lt;&lt;= 5;<br />  c |= b &gt;&gt; 3;<br /><br />  return c;<br />}<br /><br />// draw a rectangle<br />void PP_TFTLCD::drawRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, <br />      uint16_t color) {<br />  // smarter version<br />  drawHorizontalLine(x, y, w, color);<br />  drawHorizontalLine(x, y+h-1, w, color);<br />  drawVerticalLine(x, y, h, color);<br />  drawVerticalLine(x+w-1, y, h, color);<br />}<br /><br />// draw a rounded rectangle<br />void PP_TFTLCD::drawRoundRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t r,<br />   uint16_t color) {<br />  // smarter version<br />  drawHorizontalLine(x+r, y, w-2*r, color);<br />  drawHorizontalLine(x+r, y+h-1, w-2*r, color);<br />  drawVerticalLine(x, y+r, h-2*r, color);<br />  drawVerticalLine(x+w-1, y+r, h-2*r, color);<br />  // draw four corners<br />  drawCircleHelper(x+r, y+r, r, 1, color);<br />  drawCircleHelper(x+w-r-1, y+r, r, 2, color);<br />  drawCircleHelper(x+w-r-1, y+h-r-1, r, 4, color);<br />  drawCircleHelper(x+r, y+h-r-1, r, 8, color);<br />}<br /><br /><br />// fill a rounded rectangle<br />void PP_TFTLCD::fillRoundRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t r,<br />   uint16_t color) {<br />  // smarter version<br />  fillRect(x+r, y, w-2*r, h, color);<br /><br />  // draw four corners<br />  fillCircleHelper(x+w-r-1, y+r, r, 1, h-2*r-1, color);<br />  fillCircleHelper(x+r, y+r, r, 2, h-2*r-1, color);<br />}<br /><br />// fill a circle<br />void PP_TFTLCD::fillCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color) {<br />  writeRegister(PP_TFTLCD_ENTRY_MOD, 0x1030);<br />  drawVerticalLine(x0, y0-r, 2*r+1, color);<br />  fillCircleHelper(x0, y0, r, 3, 0, color);<br />}<br /><br /><br />// used to do circles and roundrects!<br />void PP_TFTLCD::fillCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t cornername, uint16_t delta,<br />uint16_t color) {<br /><br />  int16_t f = 1 - r;<br />  int16_t ddF_x = 1;<br />  int16_t ddF_y = -2 * r;<br />  int16_t x = 0;<br />  int16_t y = r;<br /><br />  while (x&lt;y) {<br />    if (f &gt;= 0) {<br />      y--;<br />      ddF_y += 2;<br />      f += ddF_y;<br />    }<br />    x++;<br />    ddF_x += 2;<br />    f += ddF_x;<br />  <br />    if (cornername &amp; 0x1) {<br />      drawVerticalLine(x0+x, y0-y, 2*y+1+delta, color);<br />      drawVerticalLine(x0+y, y0-x, 2*x+1+delta, color);<br />    }<br />    if (cornername &amp; 0x2) {<br />      drawVerticalLine(x0-x, y0-y, 2*y+1+delta, color);<br />      drawVerticalLine(x0-y, y0-x, 2*x+1+delta, color);<br />    }<br />  }<br />}<br /><br /><br />// draw a circle outline<br /><br />void PP_TFTLCD::drawCircle(uint16_t x0, uint16_t y0, uint16_t r, <br />uint16_t color) {<br />  drawPixel(x0, y0+r, color);<br />  drawPixel(x0, y0-r, color);<br />  drawPixel(x0+r, y0, color);<br />  drawPixel(x0-r, y0, color);<br /><br />  drawCircleHelper(x0, y0, r, 0xF, color);<br />}<br /><br />void PP_TFTLCD::drawCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t cornername,<br />uint16_t color) {<br />  int16_t f = 1 - r;<br />  int16_t ddF_x = 1;<br />  int16_t ddF_y = -2 * r;<br />  int16_t x = 0;<br />  int16_t y = r;<br /><br /><br />  while (x&lt;y) {<br />    if (f &gt;= 0) {<br />      y--;<br />      ddF_y += 2;<br />      f += ddF_y;<br />    }<br />    x++;<br />    ddF_x += 2;<br />    f += ddF_x;<br />    if (cornername &amp; 0x4) {<br />      drawPixel(x0 + x, y0 + y, color);<br />      drawPixel(x0 + y, y0 + x, color);<br />    } <br />    if (cornername &amp; 0x2) {<br />      drawPixel(x0 + x, y0 - y, color);<br />      drawPixel(x0 + y, y0 - x, color);<br />    }<br />    if (cornername &amp; 0x8) {<br />      drawPixel(x0 - y, y0 + x, color);<br />      drawPixel(x0 - x, y0 + y, color);<br />    }<br />    if (cornername &amp; 0x1) {<br />      drawPixel(x0 - y, y0 - x, color);<br />      drawPixel(x0 - x, y0 - y, color);<br />    }<br />  }<br />}<br /><br />// fill a rectangle<br />void PP_TFTLCD::fillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, <br />      uint16_t fillcolor) {<br />  // smarter version<br />  while (h--)<br />    drawHorizontalLine(x, y++, w, fillcolor);<br />}<br /><br /><br />void PP_TFTLCD::drawVerticalLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color)<br />{<br />  if (x &gt;= _width) return;<br /><br />  drawFastLine(x,y,length,color,1);<br />}<br /><br />void PP_TFTLCD::drawHorizontalLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color)<br />{<br />  if (y &gt;= _height) return;<br />  drawFastLine(x,y,length,color,0);<br />}<br /><br />void PP_TFTLCD::drawFastLine(uint16_t x, uint16_t y, uint16_t length, <br />  uint16_t color, uint8_t rotflag)<br />{<br />  uint16_t newentrymod;<br /><br />  switch (rotation) {<br />  case 0:<br />    if (rotflag)<br />      newentrymod = 0x1028;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1030;   // we want a 'horizontal line'<br />    break;<br />  case 1:<br />    swap(x, y);<br />    // first up fix the X<br />    x = TFTWIDTH - x - 1;<br />    if (rotflag)<br />      newentrymod = 0x1000;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1028;   // we want a 'horizontal line'<br />    break;<br />  case 2:<br />    x = TFTWIDTH - x - 1;<br />    y = TFTHEIGHT - y - 1;<br />    if (rotflag)<br />      newentrymod = 0x1008;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1020;   // we want a 'horizontal line'<br />    break;<br />  case 3:<br />    swap(x,y);<br />    y = TFTHEIGHT - y - 1;<br />    if (rotflag)<br />      newentrymod = 0x1030;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1008;   // we want a 'horizontal line'<br />    break;<br />  }<br />  <br />  writeRegister(PP_TFTLCD_ENTRY_MOD, newentrymod);<br /><br />  writeRegister(PP_TFTLCD_GRAM_HOR_AD, x); // GRAM Address Set (Horizontal Address) (R20h)<br />  writeRegister(PP_TFTLCD_GRAM_VER_AD, y); // GRAM Address Set (Vertical Address) (R21h)<br />  writeCommand(PP_TFTLCD_RW_GRAM);  // Write Data to GRAM (R22h)<br /><br /><br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(wrport) |= wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  while (length--) {<br />    writeData_unsafe(color); <br />  }<br /><br />  // set back to default<br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />  writeRegister(PP_TFTLCD_ENTRY_MOD, 0x1030);<br />}<br /><br /><br /><br />// bresenham's algorithm - thx wikpedia<br />void PP_TFTLCD::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, <br />      uint16_t color) {<br />  // if you're in rotation 1 or 3, we need to swap the X and Y's<br /><br />  int16_t steep = abs(y1 - y0) &gt; abs(x1 - x0);<br />  if (steep) {<br />    swap(x0, y0);<br />    swap(x1, y1);<br />  }<br /><br />  if (x0 &gt; x1) {<br />    swap(x0, x1);<br />    swap(y0, y1);<br />  }<br /><br />  int16_t dx, dy;<br />  dx = x1 - x0;<br />  //dy = abs(y1 - y0);<br />  dy = abs(y1 - y0);<br /><br />  int16_t err = dx / 2;<br />  int16_t ystep;<br /><br />  if (y0 &lt; y1) {<br />    ystep = 1;<br />  } else {<br />    ystep = -1;}<br /><br />  for (; x0&lt;=x1; x0++) {<br />    if (steep) {<br />      drawPixel(y0, x0, color);<br />    } else {<br />      drawPixel(x0, y0, color);<br />    }<br />    err -= dy;<br />    if (err &lt; 0) {<br />      y0 += ystep;<br />      err += dx;<br />    }<br />  }<br />}<br /><br /><br />void PP_TFTLCD::fillScreen(uint16_t color) {<br />  goHome();<br />  uint32_t i;<br />  <br />  i = 320;<br />  i *= 240;<br />  <br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(wrport) |= wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  while (i--) {<br />    writeData_unsafe(color); <br />  }<br /><br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />}<br /><br />void PP_TFTLCD::drawPixel(uint16_t x, uint16_t y, uint16_t color)<br />{<br />  // check rotation, move pixel around if necessary<br />  switch (rotation) {<br />  case 1:<br />    swap(x, y);<br />    x = TFTWIDTH - x - 1;<br />    break;<br />  case 2:<br />    x = TFTWIDTH - x - 1;<br />    y = TFTHEIGHT - y - 1;<br />    break;<br />  case 3:<br />    swap(x, y);<br />    y = TFTHEIGHT - y - 1;<br />    break;<br />  }<br />    <br />  if ((x &gt;= TFTWIDTH) || (y &gt;= TFTHEIGHT)) return;<br />  writeRegister(PP_TFTLCD_GRAM_HOR_AD, x); // GRAM Address Set (Horizontal Address) (R20h)<br />  writeRegister(PP_TFTLCD_GRAM_VER_AD, y); // GRAM Address Set (Vertical Address) (R21h)<br />  writeCommand(PP_TFTLCD_RW_GRAM);  // Write Data to GRAM (R22h)<br />  writeData(color);<br />}<br /><br />static const uint16_t _regValues&#91;&#93; PROGMEM = {<br /><br />     0x0000,0x0000,<br />0x0000,0x0000,<br />0x0000,0x0000,<br />0x0000,0x0000,<br /><br />0x00a4,0x0001,<br />//delay_ms(20,  <br />0x0060,0x2700,<br />0x0008,0x0202,<br /><br />0x0030,0x0214,<br />0x0031,0x3715,<br />0x0032,0x0604,<br />0x0033,0x0e16,<br />0x0034,0x2211,<br />0x0035,0x1500,<br />0x0036,0x8507,<br />0x0037,0x1407,<br />0x0038,0x1403,<br />0x0039,0x0020,<br /><br />0x0090,0x001a,<br />0x0010,0x0000,<br />0x0011,0x0007,<br />0x0012,0x0000,<br />0x0013,0x0000,<br />//delay_ms(20,<br /><br />0x0010,0x0730,<br />0x0011,0x0137,<br />//delay_ms(20,<br /><br />0x0012,0x01b8,<br />//delay_ms(20,<br /><br />0x0013,0x0f00,<br />0x002a,0x0080,<br />0x0029,0x0048,<br />//delay_ms(20,<br /><br />0x0001,0x0100,<br />0x0002,0x0700,<br />0x0003,0x1230,<br />0x0008,0x0202,<br />0x000a,0x0000,<br />0x000c,0x0000,<br />0x000d,0x01ff,<br />0x000e,0x0000,<br />0x0050,0x0000,<br />0x0051,0x00ef,<br />0x0052,0x0000,<br />0x0053,0x013f,<br />0x0060,0x2700,<br />0x0061,0x0001,<br />0x006a,0x0000,<br />//0x0080,0x0000,<br />//0x0081,0x0000,<br />0x0090,0X0011,<br />0x0092,0x0600,<br />0x0093,0x0402,<br />0x0094,0x0002,<br />//delay_ms(20,<br /><br />0x0007,0x0001,<br />//delay_ms(20,<br />0x0007,0x0061,<br />0x0007,0x0173,<br /><br />0x0020,0x0000,<br />0x0021,0x0000,  <br />0x00,0x22,  <br /><br />};<br /><br />void PP_TFTLCD::initDisplay(void) {<br />  uint16_t a, d;<br /><br />  reset();<br />  <br />  for (uint8_t i = 0; i &lt; sizeof(_regValues) / 4; i++) {<br />    a = pgm_read_word(_regValues + i*2);<br />    d = pgm_read_word(_regValues + i*2 + 1);<br /><br />    if (a == 0xFF) {<br />      delay(d);<br />    } else {<br />      writeRegister(a, d);<br />      //Serial.print(&quot;addr: &quot;); Serial.print(a); <br />      //Serial.print(&quot; data: &quot;); Serial.println(d, HEX);<br />    }<br />  }<br />}<br /><br />uint8_t PP_TFTLCD::getRotation(void) {<br />  return rotation;<br />}<br /><br />void PP_TFTLCD::setRotation(uint8_t x) {<br />  writeRegister(PP_TFTLCD_ENTRY_MOD, 0x1030);<br /><br />  x %= 4;  // cant be higher than 3<br />  rotation = x;<br />  switch (x) {<br />  case 0:<br />    _width = TFTWIDTH; <br />    _height = TFTHEIGHT;<br />    break;<br />  case 1:<br />    _width = TFTHEIGHT; <br />    _height = TFTWIDTH;<br />    break;<br />  case 2:<br />    _width = TFTWIDTH; <br />    _height = TFTHEIGHT;<br />    break;<br />  case 3:<br />    _width = TFTHEIGHT; <br />    _height = TFTWIDTH;<br />    break;<br /> }<br />}<br /><br />/********************************* low level pin initialization */<br /><br />PP_TFTLCD::PP_TFTLCD(uint8_t cs, uint8_t cd, uint8_t wr, uint8_t rd, uint8_t reset) {<br />  _cs = cs;<br />  _cd = cd;<br />  _wr = wr;<br />  _rd = rd;<br />  _reset = reset;<br />  <br />  rotation = 0;<br />  _width = TFTWIDTH;<br />  _height = TFTHEIGHT;<br /><br />  // disable the LCD<br />  digitalWrite(_cs, HIGH);<br />  pinMode(_cs, OUTPUT);  <br />  <br />  digitalWrite(_cd, HIGH);<br />  pinMode(_cd, OUTPUT);  <br />  <br />  digitalWrite(_wr, HIGH);<br />  pinMode(_wr, OUTPUT);  <br />  <br />  digitalWrite(_rd, HIGH);<br />  pinMode(_rd, OUTPUT);  <br /><br />  digitalWrite(_reset, HIGH); <br />  pinMode(_reset, OUTPUT); <br /><br />  csport = digitalPinToPort(_cs);<br />  cdport = digitalPinToPort(_cd);<br />  wrport = digitalPinToPort(_wr);<br />  rdport = digitalPinToPort(_rd);<br /><br />  cspin = digitalPinToBitMask(_cs);<br />  cdpin = digitalPinToBitMask(_cd);<br />  wrpin = digitalPinToBitMask(_wr);<br />  rdpin = digitalPinToBitMask(_rd);<br /><br />  cursor_y = cursor_x = 0;<br />  textsize = 1;<br />  textcolor = 0xFFFF;<br />}<br /><br /><br />/********************************** low level pin interface */<br /><br />void PP_TFTLCD::reset(void) {<br />  if (_reset)<br />    digitalWrite(_reset, LOW);<br />  delay(2); <br />  if (_reset)<br />    digitalWrite(_reset, HIGH);<br /><br />  // resync<br />  writeData(0);<br />  writeData(0);<br />  writeData(0);  <br />  writeData(0);<br />}<br /><br />inline void PP_TFTLCD::setWriteDir(void) {<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br />  DATADDR2 |= DATA2_MASK;<br />  DATADDR1 |= DATA1_MASK;<br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) <br /><br />  #ifdef USE_ADAFRUIT_SHIELD_PINOUT<br />  DDRH |= 0x78;<br />  DDRB |= 0xB0;<br />  DDRG |= _BV(5);<br />  #else<br />  MEGA_DATADDR = 0xFF;<br />  #endif<br />#else<br />  #error &quot;No pins defined!&quot;<br />#endif<br />}<br /><br />inline void PP_TFTLCD::setReadDir(void) {<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br />  DATADDR2 &amp;= ~DATA2_MASK;<br />  DATADDR1 &amp;= ~DATA1_MASK;<br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) <br /><br />  #ifdef USE_ADAFRUIT_SHIELD_PINOUT<br />  DDRH &amp;= ~0x78;<br />  DDRB &amp;= ~0xB0;<br />  DDRG &amp;= ~_BV(5);<br />  #else<br />  MEGA_DATADDR = 0;<br />  #endif<br />#else<br />  #error &quot;No pins defined!&quot;<br />#endif<br />}<br /><br />inline void PP_TFTLCD::write8(uint8_t d) {<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br /><br />  DATAPORT2 = (DATAPORT2 &amp; DATA1_MASK) | <br />    (d &amp; DATA2_MASK);<br />  DATAPORT1 = (DATAPORT1 &amp; DATA2_MASK) | <br />    (d &amp; DATA1_MASK); // top 6 bits<br />  <br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) <br /><br /><br />#ifdef USE_ADAFRUIT_SHIELD_PINOUT<br /><br />  // bit 6/7 (PH3 &amp; 4)<br />  // first two bits 0 &amp; 1 (PH5 &amp; 6)<br />  PORTH &amp;= ~(0x78);<br />  PORTH |= ((d&amp;0xC0) &gt;&gt; 3) | ((d&amp;0x3) &lt;&lt; 5);<br /><br />  // bits 2 &amp; 3 (PB4 &amp; PB5)<br />  // bit 5 (PB7)<br />  PORTB &amp;= ~(0xB0); <br />  PORTB |= ((d &amp; 0x2C) &lt;&lt; 2);<br /><br />  // bit 4  (PG5)<br />  if (d &amp; _BV(4))<br />    PORTG |= _BV(5);<br />  else<br />    PORTG &amp;= ~_BV(5);<br /><br />  #else<br />     MEGA_DATAPORT = d;  <br />  #endif<br /><br />#else<br />  #error &quot;No pins defined!&quot;<br />#endif<br />}<br /><br />inline uint8_t PP_TFTLCD::read8(void) {<br /> uint8_t d;<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br /><br /> d = DATAPIN1 &amp; DATA1_MASK; <br /> d |= DATAPIN2 &amp; DATA2_MASK; <br /><br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__)  || defined(__AVR_ATmega1280__) <br /><br />#ifdef USE_ADAFRUIT_SHIELD_PINOUT<br /><br />  // bit 6/7 (PH3 &amp; 4)<br />  // first two bits 0 &amp; 1 (PH5 &amp; 6)<br /> d = (PINH &amp; 0x60) &gt;&gt; 5;<br /> d |= (PINH &amp; 0x18) &lt;&lt; 3;<br /><br />  // bits 2 &amp; 3 &amp; 5 (PB4 &amp; PB5, PB7)<br /> d |= (PINB &amp; 0xB0) &gt;&gt; 2;<br /><br />  // bit 4  (PG5)<br />  if (PING &amp; _BV(5))<br />    d |= _BV(4);<br /><br />#else<br /> d = MEGA_DATAPIN;  <br />#endif<br /><br />#else<br /><br />  #error &quot;No pins defined!&quot;<br /><br />#endif<br /><br /> return d;<br />}<br /><br />/********************************** low level readwrite interface */<br /><br />// the C/D pin is high during write<br />void PP_TFTLCD::writeData(uint16_t data) {<br />  volatile uint8_t *wrportreg = portOutputRegister(wrport);<br /><br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  <br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  write8(data &gt;&gt; 8);<br />  <br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  write8(data);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />}<br /><br />// this is a 'sped up' version, with no direction setting, or pin initialization<br />// not for external usage, but it does speed up stuff like a screen fill<br />inline void PP_TFTLCD::writeData_unsafe(uint16_t data) {<br />  volatile uint8_t *wrportreg = portOutputRegister(wrport);<br /><br />  write8(data &gt;&gt; 8);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  write8(data);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br />}<br /><br />// the C/D pin is low during write<br />void PP_TFTLCD::writeCommand(uint16_t cmd) {<br />  volatile uint8_t *wrportreg = portOutputRegister(wrport);<br /><br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) &amp;= ~cdpin;<br />  //digitalWrite(_cd, LOW);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  <br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  write8(cmd &gt;&gt; 8);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  write8(cmd);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  *portOutputRegister(csport) |= cspin;<br />}<br /><br />uint16_t PP_TFTLCD::readData() {<br /> uint16_t d = 0;<br /> <br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(wrport) |= wrpin;<br />  //digitalWrite(_wr, HIGH);<br />  <br />  setReadDir();<br /><br />  *portOutputRegister(rdport) &amp;= ~rdpin;<br />  //digitalWrite(_rd, LOW);<br /><br />  delayMicroseconds(10);<br />  d = read8();<br />  d &lt;&lt;= 8;<br /><br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(rdport) &amp;= ~rdpin;<br />  //digitalWrite(_rd, LOW);<br /><br />  delayMicroseconds(10);<br />  d |= read8();<br /><br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  <br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />   <br />  return d;<br />}<br /><br /><br />/************************************* medium level data reading/writing */<br /><br />uint16_t PP_TFTLCD::readRegister(uint16_t addr) {<br />   writeCommand(addr);<br />   return readData();<br />}<br /><br />void PP_TFTLCD::writeRegister(uint16_t addr, uint16_t data) {<br />   writeCommand(addr);<br />   writeData(data);<br />}[/syntax]<br /><br />[syntax=c]#if ARDUINO &gt;= 100<br /> #include &quot;Arduino.h&quot;<br />#else<br /> #include &quot;WProgram.h&quot;<br />#endif<br /><br />// comment or uncomment the next line for special pinout!<br />//#define USE_ADAFRUIT_SHIELD_PINOUT<br /><br /><br />// register names from Peter Barrett's Microtouch code<br /><br />#define PP_TFTLCD_START_OSC0x00<br />#define PP_TFTLCD_DRIV_OUT_CTRL0x01<br />#define PP_TFTLCD_DRIV_WAV_CTRL0x02<br />#define PP_TFTLCD_ENTRY_MOD0x03<br />#define PP_TFTLCD_RESIZE_CTRL0x04<br />#define PP_TFTLCD_DISP_CTRL10x07<br />#define PP_TFTLCD_DISP_CTRL20x08<br />#define PP_TFTLCD_DISP_CTRL30x09<br />#define PP_TFTLCD_DISP_CTRL40x0A<br />#define PP_TFTLCD_RGB_DISP_IF_CTRL10x0C<br />#define PP_TFTLCD_FRM_MARKER_POS0x0D<br />#define PP_TFTLCD_RGB_DISP_IF_CTRL20x0F<br />#define PP_TFTLCD_POW_CTRL10x10<br />#define PP_TFTLCD_POW_CTRL20x11<br />#define PP_TFTLCD_POW_CTRL30x12<br />#define PP_TFTLCD_POW_CTRL40x13<br />#define PP_TFTLCD_GRAM_HOR_AD0x20<br />#define PP_TFTLCD_GRAM_VER_AD0x21<br />#define PP_TFTLCD_RW_GRAM0x22<br />#define PP_TFTLCD_POW_CTRL70x29<br />#define PP_TFTLCD_FRM_RATE_COL_CTRL0x2B<br />#define PP_TFTLCD_GAMMA_CTRL10x30<br />#define PP_TFTLCD_GAMMA_CTRL20x31<br />#define PP_TFTLCD_GAMMA_CTRL30x32<br />#define PP_TFTLCD_GAMMA_CTRL40x35 <br />#define PP_TFTLCD_GAMMA_CTRL50x36<br />#define PP_TFTLCD_GAMMA_CTRL60x37<br />#define PP_TFTLCD_GAMMA_CTRL70x38<br />#define PP_TFTLCD_GAMMA_CTRL80x39<br />#define PP_TFTLCD_GAMMA_CTRL90x3C<br />#define PP_TFTLCD_GAMMA_CTRL100x3D<br />#define PP_TFTLCD_HOR_START_AD0x50<br />#define PP_TFTLCD_HOR_END_AD0x51<br />#define PP_TFTLCD_VER_START_AD0x52<br />#define PP_TFTLCD_VER_END_AD0x53<br />#define PP_TFTLCD_GATE_SCAN_CTRL10x60<br />#define PP_TFTLCD_GATE_SCAN_CTRL20x61<br />#define PP_TFTLCD_GATE_SCAN_CTRL30x6A<br />#define PP_TFTLCD_PART_IMG1_DISP_POS0x80<br />#define PP_TFTLCD_PART_IMG1_START_AD0x81<br />#define PP_TFTLCD_PART_IMG1_END_AD0x82<br />#define PP_TFTLCD_PART_IMG2_DISP_POS0x83<br />#define PP_TFTLCD_PART_IMG2_START_AD0x84<br />#define PP_TFTLCD_PART_IMG2_END_AD0x85<br />#define PP_TFTLCD_PANEL_IF_CTRL10x90<br />#define PP_TFTLCD_PANEL_IF_CTRL20x92<br />#define PP_TFTLCD_PANEL_IF_CTRL30x93<br />#define PP_TFTLCD_PANEL_IF_CTRL40x95<br />#define PP_TFTLCD_PANEL_IF_CTRL50x97<br />#define PP_TFTLCD_PANEL_IF_CTRL60x98<br /><br />#define PP_TFTLCD_DELAYCMD                 0xFF<br /><br />#define swap(a, b) { int16_t t = a; a = b; b = t; }<br /><br />class PP_TFTLCD : public Print {<br /> public:<br />  PP_TFTLCD(uint8_t cs, uint8_t cd, uint8_t wr, uint8_t rd, uint8_t reset);<br /><br />  uint16_t Color565(uint8_t r, uint8_t g, uint8_t b);<br /><br />  // drawing primitives!<br />  void drawPixel(uint16_t x, uint16_t y, uint16_t color);<br />  void fillScreen(uint16_t color);<br />  void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);<br />  void drawFastLine(uint16_t x0, uint16_t y0, uint16_t l, uint16_t color, uint8_t flag);<br />  void drawVerticalLine(uint16_t x0, uint16_t y0, uint16_t length, uint16_t color);<br />  void drawHorizontalLine(uint16_t x0, uint16_t y0, uint16_t length, uint16_t color);<br />  void drawTriangle(uint16_t x0, uint16_t y0,<br />  uint16_t x1, uint16_t y1,<br />  uint16_t x2, uint16_t y2, uint16_t color);<br />  void fillTriangle(int32_t x0, int32_t y0,<br />  int32_t x1, int32_t y1,<br />    int32_t x2, int32_t y2, <br />    uint16_t color);<br />  void drawRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);<br />  void fillRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);<br />  void drawRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color);<br />  void fillRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color);<br />  void drawCircle(uint16_t x0, uint16_t y0, uint16_t r,uint16_t color);<br />  void fillCircle(uint16_t x0, uint16_t y0, uint16_t r,uint16_t color);<br /><br />  void setCursor(uint16_t x, uint16_t y);<br />  void setTextColor(uint16_t c, uint16_t b);<br />  void setTextSize(uint8_t s);<br />//  virtual void write(uint8_t);<br />  virtual size_t write(uint8_t);<br /><br />  void drawChar(uint16_t x, uint16_t y, char c, uint16_t color, uint8_t s = 1);<br />  void drawString(uint16_t x, uint16_t y, char *c, uint16_t color, uint8_t s = 1);<br /><br />  // commands<br />  void initDisplay(void);<br />  void goHome(void);<br />  void goTo(int x, int y);<br /><br />  void reset(void);<br />  void setRotation(uint8_t x);<br />  uint8_t getRotation();<br /><br />  /* low level */<br /><br />  void writeData(uint16_t d);<br />  void writeCommand(uint16_t c);<br />  uint16_t readData(void);<br />  uint16_t readRegister(uint16_t addr);<br />  void writeRegister(uint16_t addr, uint16_t data);<br /><br /><br />  uint16_t width();<br />  uint16_t height();<br /><br />  static const uint16_t TFTWIDTH = 240;<br />  static const uint16_t TFTHEIGHT = 320;<br /><br />  void writeData_unsafe(uint16_t d);<br /><br />  void setWriteDir(void);<br />  void setReadDir(void);<br /><br /><br />  void write8(uint8_t d);<br /><br /> private:<br />  void drawCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t corner, uint16_t color);<br />  void fillCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t corner, uint16_t delta, uint16_t color);<br /><br />  uint8_t read8(void);<br /><br />  uint8_t _cs, _cd, _reset, _wr, _rd;<br /><br />  uint8_t csport, cdport, wrport, rdport;<br />  uint8_t cspin, cdpin, wrpin, rdpin;<br /><br />  uint16_t _width, _height;<br />  uint8_t textsize;<br />  uint16_t cursor_x, cursor_y;<br />  uint16_t textcolor;<br />  uint8_t rotation;<br />};[/syntax]<br /><br />Zdaje sie że program nie używa takiej funkcji jak 'textbgcolor'<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 14 sty 2017, o 21:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[danny]]></name></author>
<updated>2017-01-14T19:07:03+01:00</updated>
<published>2017-01-14T19:07:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179849#p179849</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179849#p179849"/>
<title type="html"><![CDATA[Re: Arduino TFT-LCD PP_TFTLCD obsluga]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179849#p179849"><![CDATA[
W oryginalnej bibliotece Arduino tft_lcd  były 2 funkcje do ustawiania koloru czcionki. W pierwszej wersji (tak też jest u Ciebie) settextcolor miał jeden argument - kolor czcionki (textcolor), tło było &quot;przezroczyste&quot;<br /><br />Druga wersja tej funkcji w bibliotece posiada drugi argument kolor tła (textbgcolor). U mnie po przeportowaniu z Arduino do C, funkcja wyglada tak:<br /><br />[syntax=c]void tft_setTextColor(uint16_t c, uint16_t b) {<br />textcolor = c;<br />textbgcolor = b;<br />}[/syntax]<br /><br /><br />Poniżej funkcja jedno argumentowa:<br /><br />[syntax=c]/*<br /> void tft_setTextColor(uint16_t c) {<br /> // For 'transparent' background, we'll set the bg<br /> // to the same as fg instead of using a flag<br /> textcolor = textbgcolor = c;<br /> }<br /> */[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1505">danny</a> — 14 sty 2017, o 19:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-14T18:43:57+01:00</updated>
<published>2017-01-14T18:43:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179845#p179845</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179845#p179845"/>
<title type="html"><![CDATA[Arduino TFT-LCD PP_TFTLCD obsluga]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17321&amp;p=179845#p179845"><![CDATA[
Witam<br />Czy ktoś z forumowiczów używa biblioteki PP_TFTLCD? mam taki problem że dane na wyświetlaczu które odczytuje i chce wyświetlić nakładają się na siebie tz. jeśli chce wyświetlić liczbę 8 a następnie 2 to wszystkie piksele które wyświetlały liczbę 8 zostają na wyświetlaczu i dochodzą następne z liczby 2.<br /><br />[syntax=c]/*<br />tft.setRotation(i);               Kierunek ekranu; i=0..3<br />tft.fillScreen(z);                Wypełnienie całego ekranu; z: kolor w systemie 565, np:<br />                                  #define RED 0xF800<br />tft.setTextColor(RED)             kolor textu<br />tft.fillRect(x, y, xl, yl, z);    Wykreśl na pozycji (x,y) wypełniony kwadrat o bokach (xl, yl) i kolorze z<br />tft.drawPixel(x,y,c);             Zapal piksel na pozycji (x,y) na kolor c<br />tft.setTextSize(4);               Ustaw wielkość czcionki na 4<br />tft.setCursor(x,y);               Ustaw kursor w pozycji (x,y)<br />tft.println(„a”);                  Wyświetl napis „a” na ekranie<br />*/<br />#include &lt;SimpleModbusSlave.h&gt;<br />#include &lt;LiquidCrystal.h&gt;<br /><br />#include &quot;PP_TFTLCD.h&quot;<br />#include &quot;PP_TouchScreen.h&quot;<br /><br />#define YP A2 // Y+ is on Analog1<br />#define XM A1 // X- is on Analog2<br />#define YM 6 // Y- is on Digital7<br />#define XP 7 // X+ is on Digital6<br /><br /><br />#define TS_MINX 150<br />#define TS_MINY 120<br />#define TS_MAXX 920<br />#define TS_MAXY 940<br /><br />PP_TouchScreen ts = PP_TouchScreen(XP, YP, XM, YM, 100);<br /><br />#define LCD_CS A3<br />#define LCD_CD A2<br />#define LCD_WR A1<br />#define LCD_RD A0 <br />// optional<br />#define LCD_RESET A4<br /><br />// Color definitions<br />#define  BLACK           0x0000<br />#define BLUE            0x001F<br />#define RED             0xF800<br />#define GREEN           0x07E0<br />#define CYAN            0x07FF<br />#define MAGENTA         0xF81F<br />#define YELLOW          0xFFE0 <br />#define WHITE           0xFFFF<br /><br />PP_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);<br /><br /><br />enum <br /> {<br />   reg0_VAL,     //dla 40001<br />   reg1_VAL,     //dla 40002<br />   reg2_VAL,     //dla 40003<br />   reg3_VAL,    //dla 40004<br />   reg4_VAL,<br />   reg5_VAL,       <br />   HOLDING_REGS_SIZE<br /> };<br /> <br /> unsigned int holdingRegs&#91;HOLDING_REGS_SIZE&#93;;<br /><br />void setup() {<br /><br />tft.reset(); <br />tft.setRotation(1); // pozycja ekranu o 0 do 3<br /><br />tft.initDisplay(); <br />tft.fillScreen(BLACK); //caly ekran podswietla na czarno (zdefiniowane w setup kolor)<br /><br />modbus_configure(&amp;Serial, 9600, SERIAL_8N2, 1, 2, HOLDING_REGS_SIZE, holdingRegs);<br />modbus_update_comms(9600, SERIAL_8N1, 10);<br /><br />}<br /><br />void loop() {<br /><br />modbus_update();<br /><br />tft.setTextSize(2);   // wielkosc textu<br />tft.setCursor(0,10);  //pozycja textu x,y<br />tft.setTextColor(WHITE);<br />tft.println(&quot;AKTUALNE TEMPERATURY&quot;);  //wyswietlanie nazwy<br /><br />tft.setTextSize(3);   // wielkosc textu<br />tft.setCursor(0,50);  //pozycja textu x,y<br />tft.setTextColor(RED);<br />tft.println(&quot;Solar&quot;); <br />tft.setCursor(100,50);<br />tft.setTextColor(WHITE);<br />tft.println(holdingRegs&#91;reg0_VAL&#93;); <br /><br /><br /><br />//tft.setTextSize(3);   // wielkosc textu<br />//tft.setCursor(0,80);<br />//tft.setTextColor(BLUE);<br />//tft.println(&quot;Piec&quot;);<br /><br />tft.setTextSize(3);   // wielkosc textu<br />tft.setCursor(0,110);<br />tft.setTextColor(BLUE);<br />tft.println(&quot;Bojler&quot;);<br /><br />tft.setTextSize(3);   // wielkosc textu<br />tft.setCursor(0,140);<br />tft.setTextColor(BLUE);<br />tft.println(&quot;Zew&quot;);<br />}[/syntax]<br /><br /><br />biblioteka<br />PP_TFTLCD.h<br />[syntax=c]#if ARDUINO &gt;= 100<br /> #include &quot;Arduino.h&quot;<br />#else<br /> #include &quot;WProgram.h&quot;<br />#endif<br /><br />// comment or uncomment the next line for special pinout!<br />//#define USE_ADAFRUIT_SHIELD_PINOUT<br /><br /><br />// register names from Peter Barrett's Microtouch code<br /><br />#define PP_TFTLCD_START_OSC0x00<br />#define PP_TFTLCD_DRIV_OUT_CTRL0x01<br />#define PP_TFTLCD_DRIV_WAV_CTRL0x02<br />#define PP_TFTLCD_ENTRY_MOD0x03<br />#define PP_TFTLCD_RESIZE_CTRL0x04<br />#define PP_TFTLCD_DISP_CTRL10x07<br />#define PP_TFTLCD_DISP_CTRL20x08<br />#define PP_TFTLCD_DISP_CTRL30x09<br />#define PP_TFTLCD_DISP_CTRL40x0A<br />#define PP_TFTLCD_RGB_DISP_IF_CTRL10x0C<br />#define PP_TFTLCD_FRM_MARKER_POS0x0D<br />#define PP_TFTLCD_RGB_DISP_IF_CTRL20x0F<br />#define PP_TFTLCD_POW_CTRL10x10<br />#define PP_TFTLCD_POW_CTRL20x11<br />#define PP_TFTLCD_POW_CTRL30x12<br />#define PP_TFTLCD_POW_CTRL40x13<br />#define PP_TFTLCD_GRAM_HOR_AD0x20<br />#define PP_TFTLCD_GRAM_VER_AD0x21<br />#define PP_TFTLCD_RW_GRAM0x22<br />#define PP_TFTLCD_POW_CTRL70x29<br />#define PP_TFTLCD_FRM_RATE_COL_CTRL0x2B<br />#define PP_TFTLCD_GAMMA_CTRL10x30<br />#define PP_TFTLCD_GAMMA_CTRL20x31<br />#define PP_TFTLCD_GAMMA_CTRL30x32<br />#define PP_TFTLCD_GAMMA_CTRL40x35 <br />#define PP_TFTLCD_GAMMA_CTRL50x36<br />#define PP_TFTLCD_GAMMA_CTRL60x37<br />#define PP_TFTLCD_GAMMA_CTRL70x38<br />#define PP_TFTLCD_GAMMA_CTRL80x39<br />#define PP_TFTLCD_GAMMA_CTRL90x3C<br />#define PP_TFTLCD_GAMMA_CTRL100x3D<br />#define PP_TFTLCD_HOR_START_AD0x50<br />#define PP_TFTLCD_HOR_END_AD0x51<br />#define PP_TFTLCD_VER_START_AD0x52<br />#define PP_TFTLCD_VER_END_AD0x53<br />#define PP_TFTLCD_GATE_SCAN_CTRL10x60<br />#define PP_TFTLCD_GATE_SCAN_CTRL20x61<br />#define PP_TFTLCD_GATE_SCAN_CTRL30x6A<br />#define PP_TFTLCD_PART_IMG1_DISP_POS0x80<br />#define PP_TFTLCD_PART_IMG1_START_AD0x81<br />#define PP_TFTLCD_PART_IMG1_END_AD0x82<br />#define PP_TFTLCD_PART_IMG2_DISP_POS0x83<br />#define PP_TFTLCD_PART_IMG2_START_AD0x84<br />#define PP_TFTLCD_PART_IMG2_END_AD0x85<br />#define PP_TFTLCD_PANEL_IF_CTRL10x90<br />#define PP_TFTLCD_PANEL_IF_CTRL20x92<br />#define PP_TFTLCD_PANEL_IF_CTRL30x93<br />#define PP_TFTLCD_PANEL_IF_CTRL40x95<br />#define PP_TFTLCD_PANEL_IF_CTRL50x97<br />#define PP_TFTLCD_PANEL_IF_CTRL60x98<br /><br />#define PP_TFTLCD_DELAYCMD                 0xFF<br /><br />#define swap(a, b) { int16_t t = a; a = b; b = t; }<br /><br />class PP_TFTLCD : public Print {<br /> public:<br />  PP_TFTLCD(uint8_t cs, uint8_t cd, uint8_t wr, uint8_t rd, uint8_t reset);<br /><br />  uint16_t Color565(uint8_t r, uint8_t g, uint8_t b);<br /><br />  // drawing primitives!<br />  void drawPixel(uint16_t x, uint16_t y, uint16_t color);<br />  void fillScreen(uint16_t color);<br />  void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);<br />  void drawFastLine(uint16_t x0, uint16_t y0, uint16_t l, uint16_t color, uint8_t flag);<br />  void drawVerticalLine(uint16_t x0, uint16_t y0, uint16_t length, uint16_t color);<br />  void drawHorizontalLine(uint16_t x0, uint16_t y0, uint16_t length, uint16_t color);<br />  void drawTriangle(uint16_t x0, uint16_t y0,<br />  uint16_t x1, uint16_t y1,<br />  uint16_t x2, uint16_t y2, uint16_t color);<br />  void fillTriangle(int32_t x0, int32_t y0,<br />  int32_t x1, int32_t y1,<br />    int32_t x2, int32_t y2, <br />    uint16_t color);<br />  void drawRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);<br />  void fillRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);<br />  void drawRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color);<br />  void fillRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color);<br />  void drawCircle(uint16_t x0, uint16_t y0, uint16_t r,uint16_t color);<br />  void fillCircle(uint16_t x0, uint16_t y0, uint16_t r,uint16_t color);<br /><br />  void setCursor(uint16_t x, uint16_t y);<br />  void setTextColor(uint16_t c);<br />  void setTextSize(uint8_t s);<br />//  virtual void write(uint8_t);<br />  virtual size_t write(uint8_t);<br /><br />  void drawChar(uint16_t x, uint16_t y, char c, uint16_t color, uint8_t s = 1);<br />  void drawString(uint16_t x, uint16_t y, char *c, uint16_t color, uint8_t s = 1);<br /><br />  // commands<br />  void initDisplay(void);<br />  void goHome(void);<br />  void goTo(int x, int y);<br /><br />  void reset(void);<br />  void setRotation(uint8_t x);<br />  uint8_t getRotation();<br /><br />  /* low level */<br /><br />  void writeData(uint16_t d);<br />  void writeCommand(uint16_t c);<br />  uint16_t readData(void);<br />  uint16_t readRegister(uint16_t addr);<br />  void writeRegister(uint16_t addr, uint16_t data);<br /><br /><br />  uint16_t width();<br />  uint16_t height();<br /><br />  static const uint16_t TFTWIDTH = 240;<br />  static const uint16_t TFTHEIGHT = 320;<br /><br />  void writeData_unsafe(uint16_t d);<br /><br />  void setWriteDir(void);<br />  void setReadDir(void);<br /><br /><br />  void write8(uint8_t d);<br /><br /> private:<br />  void drawCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t corner, uint16_t color);<br />  void fillCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t corner, uint16_t delta, uint16_t color);<br /><br />  uint8_t read8(void);<br /><br />  uint8_t _cs, _cd, _reset, _wr, _rd;<br /><br />  uint8_t csport, cdport, wrport, rdport;<br />  uint8_t cspin, cdpin, wrpin, rdpin;<br /><br />  uint16_t _width, _height;<br />  uint8_t textsize;<br />  uint16_t cursor_x, cursor_y;<br />  uint16_t textcolor;<br />  uint8_t rotation;<br />};[/syntax]<br /><br />PP_TFTLCD.ccp<br />[syntax=c]#include &quot;PP_TFTLCD.h&quot;<br /><br /><br /><br />#ifdef USE_ADAFRUIT_SHIELD_PINOUT<br />// special defines for the dataport<br /> #define DATAPORT1 PORTD<br /> #define DATAPIN1 PIND<br /> #define DATADDR1 DDRD<br /><br /> #define DATAPORT2 PORTB<br /> #define DATAPIN2 PINB<br /> #define DATADDR2 DDRB<br /><br /> #define DATA1_MASK 0xD0<br /> #define DATA2_MASK 0x2F<br /><br />// for mega &amp; shield usage, we just hardcoded it (its messy)<br /><br />#else<br /> // for the breakout board tutorial, two ports are used :/<br /> #define DATAPORT1 PORTD<br /> #define DATAPIN1  PIND<br /> #define DATADDR1  DDRD<br /><br /> #define DATAPORT2 PORTB<br /> #define DATAPIN2  PINB<br /> #define DATADDR2  DDRB<br /><br /> #define DATA1_MASK 0xFC  // top 6 bits<br /> #define DATA2_MASK 0x03  // bottom 2 bits<br /><br /><br /> #define MEGA_DATAPORT PORTA<br /> #define MEGA_DATAPIN  PINA<br /> #define MEGA_DATADDR  DDRA<br />#endif<br /><br /><br />#include &quot;glcdfont.c&quot;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &quot;pins_arduino.h&quot;<br />#include &quot;wiring_private.h&quot;<br /><br /><br />void PP_TFTLCD::goHome(void) {<br />  goTo(0,0);<br />}<br /><br />uint16_t PP_TFTLCD::width(void) {<br />  return _width;<br />}<br />uint16_t PP_TFTLCD::height(void) {<br />  return _height;<br />}<br /><br />void PP_TFTLCD::goTo(int x, int y) {<br />  writeRegister(0x0020, x);     // GRAM Address Set (Horizontal Address) (R20h)<br />  writeRegister(0x0021, y);     // GRAM Address Set (Vertical Address) (R21h)<br />  writeCommand(0x0022);            // Write Data to GRAM (R22h)<br />}<br /><br />void PP_TFTLCD::setCursor(uint16_t x, uint16_t y) {<br />  cursor_x = x;<br />  cursor_y = y;<br />}<br /><br />void PP_TFTLCD::setTextSize(uint8_t s) {<br />  textsize = s;<br />}<br /><br />void PP_TFTLCD::setTextColor(uint16_t c) {<br />  textcolor = c;<br />}<br /><br />//void PP_TFTLCD::write(uint8_t c) {<br />size_t PP_TFTLCD::write(uint8_t c) {<br />  if (c == '\n') {<br />    cursor_y += textsize*8;<br />    cursor_x = 0;<br />  } else if (c == '\r') {<br />    // skip em<br />  } else {<br />    drawChar(cursor_x, cursor_y, c, textcolor, textsize);<br />    cursor_x += textsize*6;<br />  }<br />}<br /><br />void PP_TFTLCD::drawString(uint16_t x, uint16_t y, char *c, <br />uint16_t color, uint8_t size) {<br />  while (c&#91;0&#93; != 0) {<br />    drawChar(x, y, c&#91;0&#93;, color, size);<br />    x += size*6;<br />    c++;<br />  }<br />}<br />// draw a character<br />void PP_TFTLCD::drawChar(uint16_t x, uint16_t y, char c, <br />      uint16_t color, uint8_t size) {<br />  for (uint8_t i =0; i&lt;5; i++ ) {<br />    uint8_t line = pgm_read_byte(font+(c*5)+i);<br />    for (uint8_t j = 0; j&lt;8; j++) {<br />      if (line &amp; 0x1) {<br />if (size == 1) // default size<br />  drawPixel(x+i, y+j, color);<br />else {  // big size<br />  fillRect(x+i*size, y+j*size, size, size, color);<br />} <br />      }<br />      line &gt;&gt;= 1;<br />    }<br />  }<br />}<br /><br />// draw a triangle!<br />void PP_TFTLCD::drawTriangle(uint16_t x0, uint16_t y0,<br />  uint16_t x1, uint16_t y1,<br />  uint16_t x2, uint16_t y2, uint16_t color)<br />{<br />  drawLine(x0, y0, x1, y1, color);<br />  drawLine(x1, y1, x2, y2, color);<br />  drawLine(x2, y2, x0, y0, color); <br />}<br /><br />void PP_TFTLCD::fillTriangle ( int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint16_t color)<br />{<br />  if (y0 &gt; y1) {<br />    swap(y0, y1); swap(x0, x1);<br />  }<br />  if (y1 &gt; y2) {<br />    swap(y2, y1); swap(x2, x1);<br />  }<br />  if (y0 &gt; y1) {<br />    swap(y0, y1); swap(x0, x1);<br />  }<br /><br />  int32_t dx1, dx2, dx3; // Interpolation deltas<br />  int32_t sx1, sx2, sy; // Scanline co-ordinates<br /><br />  sx2=(int32_t)x0 * (int32_t)1000; // Use fixed point math for x axis values<br />  sx1 = sx2;<br />  sy=y0;<br /><br />  // Calculate interpolation deltas<br />  if (y1-y0 &gt; 0) dx1=((x1-x0)*1000)/(y1-y0);<br />    else dx1=0;<br />  if (y2-y0 &gt; 0) dx2=((x2-x0)*1000)/(y2-y0);<br />    else dx2=0;<br />  if (y2-y1 &gt; 0) dx3=((x2-x1)*1000)/(y2-y1);<br />    else dx3=0;<br /><br />  // Render scanlines (horizontal lines are the fastest rendering method)<br />  if (dx1 &gt; dx2)<br />  {<br />    for(; sy&lt;=y1; sy++, sx1+=dx2, sx2+=dx1)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />    sx2 = x1*1000;<br />    sy = y1;<br />    for(; sy&lt;=y2; sy++, sx1+=dx2, sx2+=dx3)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />  }<br />  else<br />  {<br />    for(; sy&lt;=y1; sy++, sx1+=dx1, sx2+=dx2)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />    sx1 = x1*1000;<br />    sy = y1;<br />    for(; sy&lt;=y2; sy++, sx1+=dx3, sx2+=dx2)<br />    {<br />      drawHorizontalLine(sx1/1000, sy, (sx2-sx1)/1000, color);<br />    }<br />  }<br />}<br /><br />uint16_t PP_TFTLCD::Color565(uint8_t r, uint8_t g, uint8_t b) {<br />  uint16_t c;<br />  c = r &gt;&gt; 3;<br />  c &lt;&lt;= 6;<br />  c |= g &gt;&gt; 2;<br />  c &lt;&lt;= 5;<br />  c |= b &gt;&gt; 3;<br /><br />  return c;<br />}<br /><br />// draw a rectangle<br />void PP_TFTLCD::drawRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, <br />      uint16_t color) {<br />  // smarter version<br />  drawHorizontalLine(x, y, w, color);<br />  drawHorizontalLine(x, y+h-1, w, color);<br />  drawVerticalLine(x, y, h, color);<br />  drawVerticalLine(x+w-1, y, h, color);<br />}<br /><br />// draw a rounded rectangle<br />void PP_TFTLCD::drawRoundRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t r,<br />   uint16_t color) {<br />  // smarter version<br />  drawHorizontalLine(x+r, y, w-2*r, color);<br />  drawHorizontalLine(x+r, y+h-1, w-2*r, color);<br />  drawVerticalLine(x, y+r, h-2*r, color);<br />  drawVerticalLine(x+w-1, y+r, h-2*r, color);<br />  // draw four corners<br />  drawCircleHelper(x+r, y+r, r, 1, color);<br />  drawCircleHelper(x+w-r-1, y+r, r, 2, color);<br />  drawCircleHelper(x+w-r-1, y+h-r-1, r, 4, color);<br />  drawCircleHelper(x+r, y+h-r-1, r, 8, color);<br />}<br /><br /><br />// fill a rounded rectangle<br />void PP_TFTLCD::fillRoundRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t r,<br />   uint16_t color) {<br />  // smarter version<br />  fillRect(x+r, y, w-2*r, h, color);<br /><br />  // draw four corners<br />  fillCircleHelper(x+w-r-1, y+r, r, 1, h-2*r-1, color);<br />  fillCircleHelper(x+r, y+r, r, 2, h-2*r-1, color);<br />}<br /><br />// fill a circle<br />void PP_TFTLCD::fillCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color) {<br />  writeRegister(PP_TFTLCD_ENTRY_MOD, 0x1030);<br />  drawVerticalLine(x0, y0-r, 2*r+1, color);<br />  fillCircleHelper(x0, y0, r, 3, 0, color);<br />}<br /><br /><br />// used to do circles and roundrects!<br />void PP_TFTLCD::fillCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t cornername, uint16_t delta,<br />uint16_t color) {<br /><br />  int16_t f = 1 - r;<br />  int16_t ddF_x = 1;<br />  int16_t ddF_y = -2 * r;<br />  int16_t x = 0;<br />  int16_t y = r;<br /><br />  while (x&lt;y) {<br />    if (f &gt;= 0) {<br />      y--;<br />      ddF_y += 2;<br />      f += ddF_y;<br />    }<br />    x++;<br />    ddF_x += 2;<br />    f += ddF_x;<br />  <br />    if (cornername &amp; 0x1) {<br />      drawVerticalLine(x0+x, y0-y, 2*y+1+delta, color);<br />      drawVerticalLine(x0+y, y0-x, 2*x+1+delta, color);<br />    }<br />    if (cornername &amp; 0x2) {<br />      drawVerticalLine(x0-x, y0-y, 2*y+1+delta, color);<br />      drawVerticalLine(x0-y, y0-x, 2*x+1+delta, color);<br />    }<br />  }<br />}<br /><br /><br />// draw a circle outline<br /><br />void PP_TFTLCD::drawCircle(uint16_t x0, uint16_t y0, uint16_t r, <br />uint16_t color) {<br />  drawPixel(x0, y0+r, color);<br />  drawPixel(x0, y0-r, color);<br />  drawPixel(x0+r, y0, color);<br />  drawPixel(x0-r, y0, color);<br /><br />  drawCircleHelper(x0, y0, r, 0xF, color);<br />}<br /><br />void PP_TFTLCD::drawCircleHelper(uint16_t x0, uint16_t y0, uint16_t r, uint8_t cornername,<br />uint16_t color) {<br />  int16_t f = 1 - r;<br />  int16_t ddF_x = 1;<br />  int16_t ddF_y = -2 * r;<br />  int16_t x = 0;<br />  int16_t y = r;<br /><br /><br />  while (x&lt;y) {<br />    if (f &gt;= 0) {<br />      y--;<br />      ddF_y += 2;<br />      f += ddF_y;<br />    }<br />    x++;<br />    ddF_x += 2;<br />    f += ddF_x;<br />    if (cornername &amp; 0x4) {<br />      drawPixel(x0 + x, y0 + y, color);<br />      drawPixel(x0 + y, y0 + x, color);<br />    } <br />    if (cornername &amp; 0x2) {<br />      drawPixel(x0 + x, y0 - y, color);<br />      drawPixel(x0 + y, y0 - x, color);<br />    }<br />    if (cornername &amp; 0x8) {<br />      drawPixel(x0 - y, y0 + x, color);<br />      drawPixel(x0 - x, y0 + y, color);<br />    }<br />    if (cornername &amp; 0x1) {<br />      drawPixel(x0 - y, y0 - x, color);<br />      drawPixel(x0 - x, y0 - y, color);<br />    }<br />  }<br />}<br /><br />// fill a rectangle<br />void PP_TFTLCD::fillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, <br />      uint16_t fillcolor) {<br />  // smarter version<br />  while (h--)<br />    drawHorizontalLine(x, y++, w, fillcolor);<br />}<br /><br /><br />void PP_TFTLCD::drawVerticalLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color)<br />{<br />  if (x &gt;= _width) return;<br /><br />  drawFastLine(x,y,length,color,1);<br />}<br /><br />void PP_TFTLCD::drawHorizontalLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color)<br />{<br />  if (y &gt;= _height) return;<br />  drawFastLine(x,y,length,color,0);<br />}<br /><br />void PP_TFTLCD::drawFastLine(uint16_t x, uint16_t y, uint16_t length, <br />  uint16_t color, uint8_t rotflag)<br />{<br />  uint16_t newentrymod;<br /><br />  switch (rotation) {<br />  case 0:<br />    if (rotflag)<br />      newentrymod = 0x1028;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1030;   // we want a 'horizontal line'<br />    break;<br />  case 1:<br />    swap(x, y);<br />    // first up fix the X<br />    x = TFTWIDTH - x - 1;<br />    if (rotflag)<br />      newentrymod = 0x1000;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1028;   // we want a 'horizontal line'<br />    break;<br />  case 2:<br />    x = TFTWIDTH - x - 1;<br />    y = TFTHEIGHT - y - 1;<br />    if (rotflag)<br />      newentrymod = 0x1008;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1020;   // we want a 'horizontal line'<br />    break;<br />  case 3:<br />    swap(x,y);<br />    y = TFTHEIGHT - y - 1;<br />    if (rotflag)<br />      newentrymod = 0x1030;   // we want a 'vertical line'<br />    else <br />      newentrymod = 0x1008;   // we want a 'horizontal line'<br />    break;<br />  }<br />  <br />  writeRegister(PP_TFTLCD_ENTRY_MOD, newentrymod);<br /><br />  writeRegister(PP_TFTLCD_GRAM_HOR_AD, x); // GRAM Address Set (Horizontal Address) (R20h)<br />  writeRegister(PP_TFTLCD_GRAM_VER_AD, y); // GRAM Address Set (Vertical Address) (R21h)<br />  writeCommand(PP_TFTLCD_RW_GRAM);  // Write Data to GRAM (R22h)<br /><br /><br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(wrport) |= wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  while (length--) {<br />    writeData_unsafe(color); <br />  }<br /><br />  // set back to default<br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />  writeRegister(PP_TFTLCD_ENTRY_MOD, 0x1030);<br />}<br /><br /><br /><br />// bresenham's algorithm - thx wikpedia<br />void PP_TFTLCD::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, <br />      uint16_t color) {<br />  // if you're in rotation 1 or 3, we need to swap the X and Y's<br /><br />  int16_t steep = abs(y1 - y0) &gt; abs(x1 - x0);<br />  if (steep) {<br />    swap(x0, y0);<br />    swap(x1, y1);<br />  }<br /><br />  if (x0 &gt; x1) {<br />    swap(x0, x1);<br />    swap(y0, y1);<br />  }<br /><br />  int16_t dx, dy;<br />  dx = x1 - x0;<br />  //dy = abs(y1 - y0);<br />  dy = abs(y1 - y0);<br /><br />  int16_t err = dx / 2;<br />  int16_t ystep;<br /><br />  if (y0 &lt; y1) {<br />    ystep = 1;<br />  } else {<br />    ystep = -1;}<br /><br />  for (; x0&lt;=x1; x0++) {<br />    if (steep) {<br />      drawPixel(y0, x0, color);<br />    } else {<br />      drawPixel(x0, y0, color);<br />    }<br />    err -= dy;<br />    if (err &lt; 0) {<br />      y0 += ystep;<br />      err += dx;<br />    }<br />  }<br />}<br /><br /><br />void PP_TFTLCD::fillScreen(uint16_t color) {<br />  goHome();<br />  uint32_t i;<br />  <br />  i = 320;<br />  i *= 240;<br />  <br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(wrport) |= wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  while (i--) {<br />    writeData_unsafe(color); <br />  }<br /><br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />}<br /><br />void PP_TFTLCD::drawPixel(uint16_t x, uint16_t y, uint16_t color)<br />{<br />  // check rotation, move pixel around if necessary<br />  switch (rotation) {<br />  case 1:<br />    swap(x, y);<br />    x = TFTWIDTH - x - 1;<br />    break;<br />  case 2:<br />    x = TFTWIDTH - x - 1;<br />    y = TFTHEIGHT - y - 1;<br />    break;<br />  case 3:<br />    swap(x, y);<br />    y = TFTHEIGHT - y - 1;<br />    break;<br />  }<br />    <br />  if ((x &gt;= TFTWIDTH) || (y &gt;= TFTHEIGHT)) return;<br />  writeRegister(PP_TFTLCD_GRAM_HOR_AD, x); // GRAM Address Set (Horizontal Address) (R20h)<br />  writeRegister(PP_TFTLCD_GRAM_VER_AD, y); // GRAM Address Set (Vertical Address) (R21h)<br />  writeCommand(PP_TFTLCD_RW_GRAM);  // Write Data to GRAM (R22h)<br />  writeData(color);<br />}<br /><br />static const uint16_t _regValues&#91;&#93; PROGMEM = {<br /><br />     0x0000,0x0000,<br />0x0000,0x0000,<br />0x0000,0x0000,<br />0x0000,0x0000,<br /><br />0x00a4,0x0001,<br />//delay_ms(20,  <br />0x0060,0x2700,<br />0x0008,0x0202,<br /><br />0x0030,0x0214,<br />0x0031,0x3715,<br />0x0032,0x0604,<br />0x0033,0x0e16,<br />0x0034,0x2211,<br />0x0035,0x1500,<br />0x0036,0x8507,<br />0x0037,0x1407,<br />0x0038,0x1403,<br />0x0039,0x0020,<br /><br />0x0090,0x001a,<br />0x0010,0x0000,<br />0x0011,0x0007,<br />0x0012,0x0000,<br />0x0013,0x0000,<br />//delay_ms(20,<br /><br />0x0010,0x0730,<br />0x0011,0x0137,<br />//delay_ms(20,<br /><br />0x0012,0x01b8,<br />//delay_ms(20,<br /><br />0x0013,0x0f00,<br />0x002a,0x0080,<br />0x0029,0x0048,<br />//delay_ms(20,<br /><br />0x0001,0x0100,<br />0x0002,0x0700,<br />0x0003,0x1230,<br />0x0008,0x0202,<br />0x000a,0x0000,<br />0x000c,0x0000,<br />0x000d,0x01ff,<br />0x000e,0x0000,<br />0x0050,0x0000,<br />0x0051,0x00ef,<br />0x0052,0x0000,<br />0x0053,0x013f,<br />0x0060,0x2700,<br />0x0061,0x0001,<br />0x006a,0x0000,<br />//0x0080,0x0000,<br />//0x0081,0x0000,<br />0x0090,0X0011,<br />0x0092,0x0600,<br />0x0093,0x0402,<br />0x0094,0x0002,<br />//delay_ms(20,<br /><br />0x0007,0x0001,<br />//delay_ms(20,<br />0x0007,0x0061,<br />0x0007,0x0173,<br /><br />0x0020,0x0000,<br />0x0021,0x0000,  <br />0x00,0x22,  <br /><br />};<br /><br />void PP_TFTLCD::initDisplay(void) {<br />  uint16_t a, d;<br /><br />  reset();<br />  <br />  for (uint8_t i = 0; i &lt; sizeof(_regValues) / 4; i++) {<br />    a = pgm_read_word(_regValues + i*2);<br />    d = pgm_read_word(_regValues + i*2 + 1);<br /><br />    if (a == 0xFF) {<br />      delay(d);<br />    } else {<br />      writeRegister(a, d);<br />      //Serial.print(&quot;addr: &quot;); Serial.print(a); <br />      //Serial.print(&quot; data: &quot;); Serial.println(d, HEX);<br />    }<br />  }<br />}<br /><br />uint8_t PP_TFTLCD::getRotation(void) {<br />  return rotation;<br />}<br /><br />void PP_TFTLCD::setRotation(uint8_t x) {<br />  writeRegister(PP_TFTLCD_ENTRY_MOD, 0x1030);<br /><br />  x %= 4;  // cant be higher than 3<br />  rotation = x;<br />  switch (x) {<br />  case 0:<br />    _width = TFTWIDTH; <br />    _height = TFTHEIGHT;<br />    break;<br />  case 1:<br />    _width = TFTHEIGHT; <br />    _height = TFTWIDTH;<br />    break;<br />  case 2:<br />    _width = TFTWIDTH; <br />    _height = TFTHEIGHT;<br />    break;<br />  case 3:<br />    _width = TFTHEIGHT; <br />    _height = TFTWIDTH;<br />    break;<br /> }<br />}<br /><br />/********************************* low level pin initialization */<br /><br />PP_TFTLCD::PP_TFTLCD(uint8_t cs, uint8_t cd, uint8_t wr, uint8_t rd, uint8_t reset) {<br />  _cs = cs;<br />  _cd = cd;<br />  _wr = wr;<br />  _rd = rd;<br />  _reset = reset;<br />  <br />  rotation = 0;<br />  _width = TFTWIDTH;<br />  _height = TFTHEIGHT;<br /><br />  // disable the LCD<br />  digitalWrite(_cs, HIGH);<br />  pinMode(_cs, OUTPUT);  <br />  <br />  digitalWrite(_cd, HIGH);<br />  pinMode(_cd, OUTPUT);  <br />  <br />  digitalWrite(_wr, HIGH);<br />  pinMode(_wr, OUTPUT);  <br />  <br />  digitalWrite(_rd, HIGH);<br />  pinMode(_rd, OUTPUT);  <br /><br />  digitalWrite(_reset, HIGH); <br />  pinMode(_reset, OUTPUT); <br /><br />  csport = digitalPinToPort(_cs);<br />  cdport = digitalPinToPort(_cd);<br />  wrport = digitalPinToPort(_wr);<br />  rdport = digitalPinToPort(_rd);<br /><br />  cspin = digitalPinToBitMask(_cs);<br />  cdpin = digitalPinToBitMask(_cd);<br />  wrpin = digitalPinToBitMask(_wr);<br />  rdpin = digitalPinToBitMask(_rd);<br /><br />  cursor_y = cursor_x = 0;<br />  textsize = 1;<br />  textcolor = 0xFFFF;<br />}<br /><br /><br />/********************************** low level pin interface */<br /><br />void PP_TFTLCD::reset(void) {<br />  if (_reset)<br />    digitalWrite(_reset, LOW);<br />  delay(2); <br />  if (_reset)<br />    digitalWrite(_reset, HIGH);<br /><br />  // resync<br />  writeData(0);<br />  writeData(0);<br />  writeData(0);  <br />  writeData(0);<br />}<br /><br />inline void PP_TFTLCD::setWriteDir(void) {<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br />  DATADDR2 |= DATA2_MASK;<br />  DATADDR1 |= DATA1_MASK;<br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) <br /><br />  #ifdef USE_ADAFRUIT_SHIELD_PINOUT<br />  DDRH |= 0x78;<br />  DDRB |= 0xB0;<br />  DDRG |= _BV(5);<br />  #else<br />  MEGA_DATADDR = 0xFF;<br />  #endif<br />#else<br />  #error &quot;No pins defined!&quot;<br />#endif<br />}<br /><br />inline void PP_TFTLCD::setReadDir(void) {<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br />  DATADDR2 &amp;= ~DATA2_MASK;<br />  DATADDR1 &amp;= ~DATA1_MASK;<br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) <br /><br />  #ifdef USE_ADAFRUIT_SHIELD_PINOUT<br />  DDRH &amp;= ~0x78;<br />  DDRB &amp;= ~0xB0;<br />  DDRG &amp;= ~_BV(5);<br />  #else<br />  MEGA_DATADDR = 0;<br />  #endif<br />#else<br />  #error &quot;No pins defined!&quot;<br />#endif<br />}<br /><br />inline void PP_TFTLCD::write8(uint8_t d) {<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br /><br />  DATAPORT2 = (DATAPORT2 &amp; DATA1_MASK) | <br />    (d &amp; DATA2_MASK);<br />  DATAPORT1 = (DATAPORT1 &amp; DATA2_MASK) | <br />    (d &amp; DATA1_MASK); // top 6 bits<br />  <br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) <br /><br /><br />#ifdef USE_ADAFRUIT_SHIELD_PINOUT<br /><br />  // bit 6/7 (PH3 &amp; 4)<br />  // first two bits 0 &amp; 1 (PH5 &amp; 6)<br />  PORTH &amp;= ~(0x78);<br />  PORTH |= ((d&amp;0xC0) &gt;&gt; 3) | ((d&amp;0x3) &lt;&lt; 5);<br /><br />  // bits 2 &amp; 3 (PB4 &amp; PB5)<br />  // bit 5 (PB7)<br />  PORTB &amp;= ~(0xB0); <br />  PORTB |= ((d &amp; 0x2C) &lt;&lt; 2);<br /><br />  // bit 4  (PG5)<br />  if (d &amp; _BV(4))<br />    PORTG |= _BV(5);<br />  else<br />    PORTG &amp;= ~_BV(5);<br /><br />  #else<br />     MEGA_DATAPORT = d;  <br />  #endif<br /><br />#else<br />  #error &quot;No pins defined!&quot;<br />#endif<br />}<br /><br />inline uint8_t PP_TFTLCD::read8(void) {<br /> uint8_t d;<br />#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328) || (__AVR_ATmega8__)<br /><br /> d = DATAPIN1 &amp; DATA1_MASK; <br /> d |= DATAPIN2 &amp; DATA2_MASK; <br /><br />#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__)  || defined(__AVR_ATmega1280__) <br /><br />#ifdef USE_ADAFRUIT_SHIELD_PINOUT<br /><br />  // bit 6/7 (PH3 &amp; 4)<br />  // first two bits 0 &amp; 1 (PH5 &amp; 6)<br /> d = (PINH &amp; 0x60) &gt;&gt; 5;<br /> d |= (PINH &amp; 0x18) &lt;&lt; 3;<br /><br />  // bits 2 &amp; 3 &amp; 5 (PB4 &amp; PB5, PB7)<br /> d |= (PINB &amp; 0xB0) &gt;&gt; 2;<br /><br />  // bit 4  (PG5)<br />  if (PING &amp; _BV(5))<br />    d |= _BV(4);<br /><br />#else<br /> d = MEGA_DATAPIN;  <br />#endif<br /><br />#else<br /><br />  #error &quot;No pins defined!&quot;<br /><br />#endif<br /><br /> return d;<br />}<br /><br />/********************************** low level readwrite interface */<br /><br />// the C/D pin is high during write<br />void PP_TFTLCD::writeData(uint16_t data) {<br />  volatile uint8_t *wrportreg = portOutputRegister(wrport);<br /><br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  <br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  write8(data &gt;&gt; 8);<br />  <br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  write8(data);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />}<br /><br />// this is a 'sped up' version, with no direction setting, or pin initialization<br />// not for external usage, but it does speed up stuff like a screen fill<br />inline void PP_TFTLCD::writeData_unsafe(uint16_t data) {<br />  volatile uint8_t *wrportreg = portOutputRegister(wrport);<br /><br />  write8(data &gt;&gt; 8);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  write8(data);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br />}<br /><br />// the C/D pin is low during write<br />void PP_TFTLCD::writeCommand(uint16_t cmd) {<br />  volatile uint8_t *wrportreg = portOutputRegister(wrport);<br /><br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) &amp;= ~cdpin;<br />  //digitalWrite(_cd, LOW);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  <br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  setWriteDir();<br />  write8(cmd &gt;&gt; 8);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  write8(cmd);<br /><br />  *wrportreg &amp;= ~wrpin;<br />  //digitalWrite(_wr, LOW);<br />  *wrportreg |=  wrpin;<br />  //digitalWrite(_wr, HIGH);<br /><br />  *portOutputRegister(csport) |= cspin;<br />}<br /><br />uint16_t PP_TFTLCD::readData() {<br /> uint16_t d = 0;<br /> <br />  *portOutputRegister(csport) &amp;= ~cspin;<br />  //digitalWrite(_cs, LOW);<br />  *portOutputRegister(cdport) |= cdpin;<br />  //digitalWrite(_cd, HIGH);<br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(wrport) |= wrpin;<br />  //digitalWrite(_wr, HIGH);<br />  <br />  setReadDir();<br /><br />  *portOutputRegister(rdport) &amp;= ~rdpin;<br />  //digitalWrite(_rd, LOW);<br /><br />  delayMicroseconds(10);<br />  d = read8();<br />  d &lt;&lt;= 8;<br /><br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  *portOutputRegister(rdport) &amp;= ~rdpin;<br />  //digitalWrite(_rd, LOW);<br /><br />  delayMicroseconds(10);<br />  d |= read8();<br /><br />  *portOutputRegister(rdport) |= rdpin;<br />  //digitalWrite(_rd, HIGH);<br />  <br />  *portOutputRegister(csport) |= cspin;<br />  //digitalWrite(_cs, HIGH);<br />   <br />  return d;<br />}<br /><br /><br />/************************************* medium level data reading/writing */<br /><br />uint16_t PP_TFTLCD::readRegister(uint16_t addr) {<br />   writeCommand(addr);<br />   return readData();<br />}<br /><br />void PP_TFTLCD::writeRegister(uint16_t addr, uint16_t data) {<br />   writeCommand(addr);<br />   writeData(data);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 14 sty 2017, o 18:43</p><hr />
]]></content>
</entry>
</feed>