Arducam_UTFT_SPI_Library

Dependents:   DigitalCamera_OV5642_WIZwiki-W7500 Prelude_OV5642_dev

Committer:
justinkim
Date:
Thu Oct 29 06:26:48 2015 +0000
Revision:
0:53f8d6b23687
spi test failed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
justinkim 0:53f8d6b23687 1 /*
justinkim 0:53f8d6b23687 2 UTFT.cpp - Arduino library support for Color TFT LCD Boards
justinkim 0:53f8d6b23687 3 This is special porting for ArduCAM shield LCD screen.
justinkim 0:53f8d6b23687 4 Use SPI bus interface and SSD1289 controller. Only work on
justinkim 0:53f8d6b23687 5 ArduCAM shield Rev.C.
justinkim 0:53f8d6b23687 6 For more information about ArduCAM shield please visit
justinkim 0:53f8d6b23687 7 www.arducam.com
justinkim 0:53f8d6b23687 8 Copyright (C)2010-2014 Henning Karlsen. All right reserved
justinkim 0:53f8d6b23687 9
justinkim 0:53f8d6b23687 10 This library is the continuation of my ITDB02_Graph, ITDB02_Graph16
justinkim 0:53f8d6b23687 11 and RGB_GLCD libraries for Arduino and chipKit. As the number of
justinkim 0:53f8d6b23687 12 supported display modules and controllers started to increase I felt
justinkim 0:53f8d6b23687 13 it was time to make a single, universal library as it will be much
justinkim 0:53f8d6b23687 14 easier to maintain in the future.
justinkim 0:53f8d6b23687 15
justinkim 0:53f8d6b23687 16 Basic functionality of this library was origianlly based on the
justinkim 0:53f8d6b23687 17 demo-code provided by ITead studio (for the ITDB02 modules) and
justinkim 0:53f8d6b23687 18 NKC Electronics (for the RGB GLCD module/shield).
justinkim 0:53f8d6b23687 19
justinkim 0:53f8d6b23687 20 This library supports a number of 8bit, 16bit and serial graphic
justinkim 0:53f8d6b23687 21 displays, and will work with both Arduino and chipKit boards. For a
justinkim 0:53f8d6b23687 22 full list of tested display modules and controllers, see the
justinkim 0:53f8d6b23687 23 document UTFT_Supported_display_modules_&_controllers.pdf.
justinkim 0:53f8d6b23687 24
justinkim 0:53f8d6b23687 25 When using 8bit and 16bit display modules there are some
justinkim 0:53f8d6b23687 26 requirements you must adhere to. These requirements can be found
justinkim 0:53f8d6b23687 27 in the document UTFT_Requirements.pdf.
justinkim 0:53f8d6b23687 28 There are no special requirements when using serial displays.
justinkim 0:53f8d6b23687 29
justinkim 0:53f8d6b23687 30 You can always find the latest version of the library at
justinkim 0:53f8d6b23687 31 http://electronics.henningkarlsen.com/
justinkim 0:53f8d6b23687 32
justinkim 0:53f8d6b23687 33 If you make any modifications or improvements to the code, I would
justinkim 0:53f8d6b23687 34 appreciate that you share the code with me so that I might include
justinkim 0:53f8d6b23687 35 it in the next release. I can be contacted through
justinkim 0:53f8d6b23687 36 http://electronics.henningkarlsen.com/contact.php.
justinkim 0:53f8d6b23687 37
justinkim 0:53f8d6b23687 38 This library is free software; you can redistribute it and/or
justinkim 0:53f8d6b23687 39 modify it under the terms of the GNU Lesser General Public
justinkim 0:53f8d6b23687 40 License as published by the Free Software Foundation; either
justinkim 0:53f8d6b23687 41 version 2.1 of the License, or (at your option) any later version.
justinkim 0:53f8d6b23687 42
justinkim 0:53f8d6b23687 43 This library is distributed in the hope that it will be useful,
justinkim 0:53f8d6b23687 44 but WITHOUT ANY WARRANTY; without even the implied warranty of
justinkim 0:53f8d6b23687 45 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
justinkim 0:53f8d6b23687 46 Lesser General Public License for more details.
justinkim 0:53f8d6b23687 47
justinkim 0:53f8d6b23687 48 You should have received a copy of the GNU Lesser General Public
justinkim 0:53f8d6b23687 49 License along with this library; if not, write to the Free Software
justinkim 0:53f8d6b23687 50 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
justinkim 0:53f8d6b23687 51 */
justinkim 0:53f8d6b23687 52
justinkim 0:53f8d6b23687 53 #include "mbed.h"
justinkim 0:53f8d6b23687 54 #include "UTFT_SPI.h"
justinkim 0:53f8d6b23687 55
justinkim 0:53f8d6b23687 56 ArduLCD::ArduLCD(PinName mosi, PinName miso, PinName sck, PinName cs)
justinkim 0:53f8d6b23687 57 : spi(mosi,miso,sck), _cs(cs)
justinkim 0:53f8d6b23687 58 {
justinkim 0:53f8d6b23687 59 //Must initialize the Bus default status
justinkim 0:53f8d6b23687 60 _cs = 1;
justinkim 0:53f8d6b23687 61 model = SSD1289;
justinkim 0:53f8d6b23687 62 disp_x_size=239;
justinkim 0:53f8d6b23687 63 disp_y_size=319;
justinkim 0:53f8d6b23687 64 display_transfer_mode=8;
justinkim 0:53f8d6b23687 65
justinkim 0:53f8d6b23687 66 display_model=model;
justinkim 0:53f8d6b23687 67
justinkim 0:53f8d6b23687 68 //_set_direction_registers(display_transfer_mode);
justinkim 0:53f8d6b23687 69 //P_CS = portOutputRegister(digitalPinToPort(CS));
justinkim 0:53f8d6b23687 70 //B_CS = digitalPinToBitMask(CS);
justinkim 0:53f8d6b23687 71 //pinMode(CS,OUTPUT);
justinkim 0:53f8d6b23687 72 }
justinkim 0:53f8d6b23687 73
justinkim 0:53f8d6b23687 74 int ArduLCD::bus_write(int address, int value)
justinkim 0:53f8d6b23687 75 {
justinkim 0:53f8d6b23687 76 _cs = 0;
justinkim 0:53f8d6b23687 77 spi.write(address);
justinkim 0:53f8d6b23687 78 spi.write(value);
justinkim 0:53f8d6b23687 79 _cs = 1;
justinkim 0:53f8d6b23687 80 return value;
justinkim 0:53f8d6b23687 81 }
justinkim 0:53f8d6b23687 82
justinkim 0:53f8d6b23687 83 uint8_t ArduLCD::bus_read(int address)
justinkim 0:53f8d6b23687 84 {
justinkim 0:53f8d6b23687 85 uint8_t value = 0;
justinkim 0:53f8d6b23687 86 _cs = 0;
justinkim 0:53f8d6b23687 87 spi.write(address);
justinkim 0:53f8d6b23687 88 value = spi.write(0x00);
justinkim 0:53f8d6b23687 89 _cs = 1;
justinkim 0:53f8d6b23687 90 return value;
justinkim 0:53f8d6b23687 91 }
justinkim 0:53f8d6b23687 92
justinkim 0:53f8d6b23687 93 void ArduLCD::LCD_Write_COM(char VL)
justinkim 0:53f8d6b23687 94 {
justinkim 0:53f8d6b23687 95 bus_write(0xBE, VL);
justinkim 0:53f8d6b23687 96 }
justinkim 0:53f8d6b23687 97
justinkim 0:53f8d6b23687 98 void ArduLCD::LCD_Write_DATA(char VH,char VL)
justinkim 0:53f8d6b23687 99 {
justinkim 0:53f8d6b23687 100 bus_write(0xBF, VH);
justinkim 0:53f8d6b23687 101 bus_write(0xBF, VL);
justinkim 0:53f8d6b23687 102 }
justinkim 0:53f8d6b23687 103
justinkim 0:53f8d6b23687 104 void ArduLCD::LCD_Write_COM_DATA(char com1,int dat1)
justinkim 0:53f8d6b23687 105 {
justinkim 0:53f8d6b23687 106 LCD_Write_COM(com1);
justinkim 0:53f8d6b23687 107 LCD_Write_DATA(dat1>>8,dat1);
justinkim 0:53f8d6b23687 108
justinkim 0:53f8d6b23687 109 }
justinkim 0:53f8d6b23687 110
justinkim 0:53f8d6b23687 111 void ArduLCD::LCD_Writ_Bus(char VH,char VL)
justinkim 0:53f8d6b23687 112 {
justinkim 0:53f8d6b23687 113 LCD_Write_DATA(VH,VL);
justinkim 0:53f8d6b23687 114 }
justinkim 0:53f8d6b23687 115
justinkim 0:53f8d6b23687 116 void ArduLCD::InitLCD(uint8_t orientation)
justinkim 0:53f8d6b23687 117 {
justinkim 0:53f8d6b23687 118 orient=orientation;
justinkim 0:53f8d6b23687 119
justinkim 0:53f8d6b23687 120 LCD_Write_COM_DATA(0x00,0x0001);
justinkim 0:53f8d6b23687 121 LCD_Write_COM_DATA(0x03,0xA8A4);
justinkim 0:53f8d6b23687 122 LCD_Write_COM_DATA(0x0C,0x0000);
justinkim 0:53f8d6b23687 123 LCD_Write_COM_DATA(0x0D,0x080C);
justinkim 0:53f8d6b23687 124 LCD_Write_COM_DATA(0x0E,0x2B00);
justinkim 0:53f8d6b23687 125 LCD_Write_COM_DATA(0x1E,0x00B7);
justinkim 0:53f8d6b23687 126 LCD_Write_COM_DATA(0x01,0x693F);
justinkim 0:53f8d6b23687 127 LCD_Write_COM_DATA(0x02,0x0600);
justinkim 0:53f8d6b23687 128 LCD_Write_COM_DATA(0x10,0x0000);
justinkim 0:53f8d6b23687 129 LCD_Write_COM_DATA(0x11,0x6078);
justinkim 0:53f8d6b23687 130 LCD_Write_COM_DATA(0x05,0x0000);
justinkim 0:53f8d6b23687 131 LCD_Write_COM_DATA(0x06,0x0000);
justinkim 0:53f8d6b23687 132 LCD_Write_COM_DATA(0x16,0xEF1C);
justinkim 0:53f8d6b23687 133 LCD_Write_COM_DATA(0x17,0x0003);
justinkim 0:53f8d6b23687 134 LCD_Write_COM_DATA(0x07,0x0233);
justinkim 0:53f8d6b23687 135 LCD_Write_COM_DATA(0x0B,0x0000);
justinkim 0:53f8d6b23687 136 LCD_Write_COM_DATA(0x0F,0x0000);
justinkim 0:53f8d6b23687 137 LCD_Write_COM_DATA(0x41,0x0000);
justinkim 0:53f8d6b23687 138 LCD_Write_COM_DATA(0x42,0x0000);
justinkim 0:53f8d6b23687 139 LCD_Write_COM_DATA(0x48,0x0000);
justinkim 0:53f8d6b23687 140 LCD_Write_COM_DATA(0x49,0x013F);
justinkim 0:53f8d6b23687 141 LCD_Write_COM_DATA(0x4A,0x0000);
justinkim 0:53f8d6b23687 142 LCD_Write_COM_DATA(0x4B,0x0000);
justinkim 0:53f8d6b23687 143 LCD_Write_COM_DATA(0x44,0xEF00);
justinkim 0:53f8d6b23687 144 LCD_Write_COM_DATA(0x45,0x0000);
justinkim 0:53f8d6b23687 145 LCD_Write_COM_DATA(0x46,0x013F);
justinkim 0:53f8d6b23687 146 LCD_Write_COM_DATA(0x30,0x0707);
justinkim 0:53f8d6b23687 147 LCD_Write_COM_DATA(0x31,0x0204);
justinkim 0:53f8d6b23687 148 LCD_Write_COM_DATA(0x32,0x0204);
justinkim 0:53f8d6b23687 149 LCD_Write_COM_DATA(0x33,0x0502);
justinkim 0:53f8d6b23687 150 LCD_Write_COM_DATA(0x34,0x0507);
justinkim 0:53f8d6b23687 151 LCD_Write_COM_DATA(0x35,0x0204);
justinkim 0:53f8d6b23687 152 LCD_Write_COM_DATA(0x36,0x0204);
justinkim 0:53f8d6b23687 153 LCD_Write_COM_DATA(0x37,0x0502);
justinkim 0:53f8d6b23687 154 LCD_Write_COM_DATA(0x3A,0x0302);
justinkim 0:53f8d6b23687 155 LCD_Write_COM_DATA(0x3B,0x0302);
justinkim 0:53f8d6b23687 156 LCD_Write_COM_DATA(0x23,0x0000);
justinkim 0:53f8d6b23687 157 LCD_Write_COM_DATA(0x24,0x0000);
justinkim 0:53f8d6b23687 158 LCD_Write_COM_DATA(0x25,0x8000);
justinkim 0:53f8d6b23687 159 LCD_Write_COM_DATA(0x4f,0x0000);
justinkim 0:53f8d6b23687 160 LCD_Write_COM_DATA(0x4e,0x0000);
justinkim 0:53f8d6b23687 161 LCD_Write_COM(0x22);
justinkim 0:53f8d6b23687 162
justinkim 0:53f8d6b23687 163 //setColor(255, 255, 255);
justinkim 0:53f8d6b23687 164 //setBackColor(0, 0, 0);
justinkim 0:53f8d6b23687 165 cfont.font=0;
justinkim 0:53f8d6b23687 166 clrScr();
justinkim 0:53f8d6b23687 167 }
justinkim 0:53f8d6b23687 168
justinkim 0:53f8d6b23687 169 void ArduLCD::setXY(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
justinkim 0:53f8d6b23687 170 {
justinkim 0:53f8d6b23687 171 if (orient==LANDSCAPE)
justinkim 0:53f8d6b23687 172 {
justinkim 0:53f8d6b23687 173 swap(uint16_t, x1, y1);
justinkim 0:53f8d6b23687 174 swap(uint16_t, x2, y2)
justinkim 0:53f8d6b23687 175 y1=disp_y_size-y1;
justinkim 0:53f8d6b23687 176 y2=disp_y_size-y2;
justinkim 0:53f8d6b23687 177 swap(uint16_t, y1, y2)
justinkim 0:53f8d6b23687 178 }
justinkim 0:53f8d6b23687 179
justinkim 0:53f8d6b23687 180 LCD_Write_COM_DATA(0x44,(x2<<8)+x1);
justinkim 0:53f8d6b23687 181 LCD_Write_COM_DATA(0x45,y1);
justinkim 0:53f8d6b23687 182 LCD_Write_COM_DATA(0x46,y2);
justinkim 0:53f8d6b23687 183 LCD_Write_COM_DATA(0x4e,x1);
justinkim 0:53f8d6b23687 184 LCD_Write_COM_DATA(0x4f,y1);
justinkim 0:53f8d6b23687 185 LCD_Write_COM(0x22);
justinkim 0:53f8d6b23687 186 }
justinkim 0:53f8d6b23687 187
justinkim 0:53f8d6b23687 188 void ArduLCD::clrXY()
justinkim 0:53f8d6b23687 189 {
justinkim 0:53f8d6b23687 190 if (orient==PORTRAIT)
justinkim 0:53f8d6b23687 191 setXY(0,0,disp_x_size,disp_y_size);
justinkim 0:53f8d6b23687 192 else
justinkim 0:53f8d6b23687 193 setXY(0,0,disp_y_size,disp_x_size);
justinkim 0:53f8d6b23687 194 }
justinkim 0:53f8d6b23687 195
justinkim 0:53f8d6b23687 196 void ArduLCD::resetXY()
justinkim 0:53f8d6b23687 197 {
justinkim 0:53f8d6b23687 198 clrXY();
justinkim 0:53f8d6b23687 199 }
justinkim 0:53f8d6b23687 200
justinkim 0:53f8d6b23687 201 void ArduLCD::drawRect(int x1, int y1, int x2, int y2)
justinkim 0:53f8d6b23687 202 {
justinkim 0:53f8d6b23687 203 if (x1>x2)
justinkim 0:53f8d6b23687 204 {
justinkim 0:53f8d6b23687 205 swap(int, x1, x2);
justinkim 0:53f8d6b23687 206 }
justinkim 0:53f8d6b23687 207 if (y1>y2)
justinkim 0:53f8d6b23687 208 {
justinkim 0:53f8d6b23687 209 swap(int, y1, y2);
justinkim 0:53f8d6b23687 210 }
justinkim 0:53f8d6b23687 211
justinkim 0:53f8d6b23687 212 drawHLine(x1, y1, x2-x1);
justinkim 0:53f8d6b23687 213 drawHLine(x1, y2, x2-x1);
justinkim 0:53f8d6b23687 214 drawVLine(x1, y1, y2-y1);
justinkim 0:53f8d6b23687 215 drawVLine(x2, y1, y2-y1);
justinkim 0:53f8d6b23687 216 }
justinkim 0:53f8d6b23687 217
justinkim 0:53f8d6b23687 218 void ArduLCD::drawRoundRect(int x1, int y1, int x2, int y2)
justinkim 0:53f8d6b23687 219 {
justinkim 0:53f8d6b23687 220 if (x1>x2)
justinkim 0:53f8d6b23687 221 {
justinkim 0:53f8d6b23687 222 swap(int, x1, x2);
justinkim 0:53f8d6b23687 223 }
justinkim 0:53f8d6b23687 224 if (y1>y2)
justinkim 0:53f8d6b23687 225 {
justinkim 0:53f8d6b23687 226 swap(int, y1, y2);
justinkim 0:53f8d6b23687 227 }
justinkim 0:53f8d6b23687 228 if ((x2-x1)>4 && (y2-y1)>4)
justinkim 0:53f8d6b23687 229 {
justinkim 0:53f8d6b23687 230 drawPixel(x1+1,y1+1);
justinkim 0:53f8d6b23687 231 drawPixel(x2-1,y1+1);
justinkim 0:53f8d6b23687 232 drawPixel(x1+1,y2-1);
justinkim 0:53f8d6b23687 233 drawPixel(x2-1,y2-1);
justinkim 0:53f8d6b23687 234 drawHLine(x1+2, y1, x2-x1-4);
justinkim 0:53f8d6b23687 235 drawHLine(x1+2, y2, x2-x1-4);
justinkim 0:53f8d6b23687 236 drawVLine(x1, y1+2, y2-y1-4);
justinkim 0:53f8d6b23687 237 drawVLine(x2, y1+2, y2-y1-4);
justinkim 0:53f8d6b23687 238 }
justinkim 0:53f8d6b23687 239 }
justinkim 0:53f8d6b23687 240
justinkim 0:53f8d6b23687 241 void ArduLCD::fillRect(int x1, int y1, int x2, int y2)
justinkim 0:53f8d6b23687 242 {
justinkim 0:53f8d6b23687 243 if (x1>x2)
justinkim 0:53f8d6b23687 244 {
justinkim 0:53f8d6b23687 245 swap(int, x1, x2);
justinkim 0:53f8d6b23687 246 }
justinkim 0:53f8d6b23687 247 if (y1>y2)
justinkim 0:53f8d6b23687 248 {
justinkim 0:53f8d6b23687 249 swap(int, y1, y2);
justinkim 0:53f8d6b23687 250 }
justinkim 0:53f8d6b23687 251
justinkim 0:53f8d6b23687 252 if (orient==PORTRAIT)
justinkim 0:53f8d6b23687 253 {
justinkim 0:53f8d6b23687 254 for (int i=0; i<((y2-y1)/2)+1; i++)
justinkim 0:53f8d6b23687 255 {
justinkim 0:53f8d6b23687 256 drawHLine(x1, y1+i, x2-x1);
justinkim 0:53f8d6b23687 257 drawHLine(x1, y2-i, x2-x1);
justinkim 0:53f8d6b23687 258 }
justinkim 0:53f8d6b23687 259 }
justinkim 0:53f8d6b23687 260 else
justinkim 0:53f8d6b23687 261 {
justinkim 0:53f8d6b23687 262 for (int i=0; i<((x2-x1)/2)+1; i++)
justinkim 0:53f8d6b23687 263 {
justinkim 0:53f8d6b23687 264 drawVLine(x1+i, y1, y2-y1);
justinkim 0:53f8d6b23687 265 drawVLine(x2-i, y1, y2-y1);
justinkim 0:53f8d6b23687 266 }
justinkim 0:53f8d6b23687 267 }
justinkim 0:53f8d6b23687 268 }
justinkim 0:53f8d6b23687 269
justinkim 0:53f8d6b23687 270 void ArduLCD::fillRoundRect(int x1, int y1, int x2, int y2)
justinkim 0:53f8d6b23687 271 {
justinkim 0:53f8d6b23687 272 if (x1>x2)
justinkim 0:53f8d6b23687 273 {
justinkim 0:53f8d6b23687 274 swap(int, x1, x2);
justinkim 0:53f8d6b23687 275 }
justinkim 0:53f8d6b23687 276 if (y1>y2)
justinkim 0:53f8d6b23687 277 {
justinkim 0:53f8d6b23687 278 swap(int, y1, y2);
justinkim 0:53f8d6b23687 279 }
justinkim 0:53f8d6b23687 280
justinkim 0:53f8d6b23687 281 if ((x2-x1)>4 && (y2-y1)>4)
justinkim 0:53f8d6b23687 282 {
justinkim 0:53f8d6b23687 283 for (int i=0; i<((y2-y1)/2)+1; i++)
justinkim 0:53f8d6b23687 284 {
justinkim 0:53f8d6b23687 285 switch(i)
justinkim 0:53f8d6b23687 286 {
justinkim 0:53f8d6b23687 287 case 0:
justinkim 0:53f8d6b23687 288 drawHLine(x1+2, y1+i, x2-x1-4);
justinkim 0:53f8d6b23687 289 drawHLine(x1+2, y2-i, x2-x1-4);
justinkim 0:53f8d6b23687 290 break;
justinkim 0:53f8d6b23687 291 case 1:
justinkim 0:53f8d6b23687 292 drawHLine(x1+1, y1+i, x2-x1-2);
justinkim 0:53f8d6b23687 293 drawHLine(x1+1, y2-i, x2-x1-2);
justinkim 0:53f8d6b23687 294 break;
justinkim 0:53f8d6b23687 295 default:
justinkim 0:53f8d6b23687 296 drawHLine(x1, y1+i, x2-x1);
justinkim 0:53f8d6b23687 297 drawHLine(x1, y2-i, x2-x1);
justinkim 0:53f8d6b23687 298 }
justinkim 0:53f8d6b23687 299 }
justinkim 0:53f8d6b23687 300 }
justinkim 0:53f8d6b23687 301 }
justinkim 0:53f8d6b23687 302
justinkim 0:53f8d6b23687 303 void ArduLCD::drawCircle(int x, int y, int radius)
justinkim 0:53f8d6b23687 304 {
justinkim 0:53f8d6b23687 305 int f = 1 - radius;
justinkim 0:53f8d6b23687 306 int ddF_x = 1;
justinkim 0:53f8d6b23687 307 int ddF_y = -2 * radius;
justinkim 0:53f8d6b23687 308 int x1 = 0;
justinkim 0:53f8d6b23687 309 int y1 = radius;
justinkim 0:53f8d6b23687 310
justinkim 0:53f8d6b23687 311 _cs = 0;
justinkim 0:53f8d6b23687 312 setXY(x, y + radius, x, y + radius);
justinkim 0:53f8d6b23687 313 LCD_Write_DATA(fch,fcl);
justinkim 0:53f8d6b23687 314 setXY(x, y - radius, x, y - radius);
justinkim 0:53f8d6b23687 315 LCD_Write_DATA(fch,fcl);
justinkim 0:53f8d6b23687 316 setXY(x + radius, y, x + radius, y);
justinkim 0:53f8d6b23687 317 LCD_Write_DATA(fch,fcl);
justinkim 0:53f8d6b23687 318 setXY(x - radius, y, x - radius, y);
justinkim 0:53f8d6b23687 319 LCD_Write_DATA(fch,fcl);
justinkim 0:53f8d6b23687 320
justinkim 0:53f8d6b23687 321 while(x1 < y1)
justinkim 0:53f8d6b23687 322 {
justinkim 0:53f8d6b23687 323 if(f >= 0)
justinkim 0:53f8d6b23687 324 {
justinkim 0:53f8d6b23687 325 y1--;
justinkim 0:53f8d6b23687 326 ddF_y += 2;
justinkim 0:53f8d6b23687 327 f += ddF_y;
justinkim 0:53f8d6b23687 328 }
justinkim 0:53f8d6b23687 329 x1++;
justinkim 0:53f8d6b23687 330 ddF_x += 2;
justinkim 0:53f8d6b23687 331 f += ddF_x;
justinkim 0:53f8d6b23687 332 setXY(x + x1, y + y1, x + x1, y + y1);
justinkim 0:53f8d6b23687 333 LCD_Write_DATA(fch,fcl);
justinkim 0:53f8d6b23687 334 setXY(x - x1, y + y1, x - x1, y + y1);
justinkim 0:53f8d6b23687 335 LCD_Write_DATA(fch,fcl);
justinkim 0:53f8d6b23687 336 setXY(x + x1, y - y1, x + x1, y - y1);
justinkim 0:53f8d6b23687 337 LCD_Write_DATA(fch,fcl);
justinkim 0:53f8d6b23687 338 setXY(x - x1, y - y1, x - x1, y - y1);
justinkim 0:53f8d6b23687 339 LCD_Write_DATA(fch,fcl);
justinkim 0:53f8d6b23687 340 setXY(x + y1, y + x1, x + y1, y + x1);
justinkim 0:53f8d6b23687 341 LCD_Write_DATA(fch,fcl);
justinkim 0:53f8d6b23687 342 setXY(x - y1, y + x1, x - y1, y + x1);
justinkim 0:53f8d6b23687 343 LCD_Write_DATA(fch,fcl);
justinkim 0:53f8d6b23687 344 setXY(x + y1, y - x1, x + y1, y - x1);
justinkim 0:53f8d6b23687 345 LCD_Write_DATA(fch,fcl);
justinkim 0:53f8d6b23687 346 setXY(x - y1, y - x1, x - y1, y - x1);
justinkim 0:53f8d6b23687 347 LCD_Write_DATA(fch,fcl);
justinkim 0:53f8d6b23687 348 }
justinkim 0:53f8d6b23687 349 _cs = 1;
justinkim 0:53f8d6b23687 350 clrXY();
justinkim 0:53f8d6b23687 351 }
justinkim 0:53f8d6b23687 352
justinkim 0:53f8d6b23687 353 void ArduLCD::fillCircle(int x, int y, int radius)
justinkim 0:53f8d6b23687 354 {
justinkim 0:53f8d6b23687 355 for(int y1=-radius; y1<=0; y1++)
justinkim 0:53f8d6b23687 356 for(int x1=-radius; x1<=0; x1++)
justinkim 0:53f8d6b23687 357 if(x1*x1+y1*y1 <= radius*radius)
justinkim 0:53f8d6b23687 358 {
justinkim 0:53f8d6b23687 359 drawHLine(x+x1, y+y1, 2*(-x1));
justinkim 0:53f8d6b23687 360 drawHLine(x+x1, y-y1, 2*(-x1));
justinkim 0:53f8d6b23687 361 break;
justinkim 0:53f8d6b23687 362 }
justinkim 0:53f8d6b23687 363 }
justinkim 0:53f8d6b23687 364
justinkim 0:53f8d6b23687 365 void ArduLCD::clrScr()
justinkim 0:53f8d6b23687 366 {
justinkim 0:53f8d6b23687 367 long i;
justinkim 0:53f8d6b23687 368
justinkim 0:53f8d6b23687 369 clrXY();
justinkim 0:53f8d6b23687 370
justinkim 0:53f8d6b23687 371 for (i=0; i<((disp_x_size+1)*(disp_y_size+1)); i++)
justinkim 0:53f8d6b23687 372 {
justinkim 0:53f8d6b23687 373 if (display_transfer_mode!=1)
justinkim 0:53f8d6b23687 374 LCD_Writ_Bus(0x00,0x00);
justinkim 0:53f8d6b23687 375 else
justinkim 0:53f8d6b23687 376 {
justinkim 0:53f8d6b23687 377 LCD_Writ_Bus(1,0);
justinkim 0:53f8d6b23687 378 LCD_Writ_Bus(1,0);
justinkim 0:53f8d6b23687 379
justinkim 0:53f8d6b23687 380 //LCD_Writ_Bus(00,0x55);
justinkim 0:53f8d6b23687 381 }
justinkim 0:53f8d6b23687 382 //delay(1);
justinkim 0:53f8d6b23687 383 #if defined(ESP8266)
justinkim 0:53f8d6b23687 384 yield();
justinkim 0:53f8d6b23687 385 #endif
justinkim 0:53f8d6b23687 386 }
justinkim 0:53f8d6b23687 387 }
justinkim 0:53f8d6b23687 388
justinkim 0:53f8d6b23687 389 void ArduLCD::fillScr(uint8_t r, uint8_t g, uint8_t b)
justinkim 0:53f8d6b23687 390 {
justinkim 0:53f8d6b23687 391 uint16_t color = ((r&248)<<8 | (g&252)<<3 | (b&248)>>3);
justinkim 0:53f8d6b23687 392 fillScr(color);
justinkim 0:53f8d6b23687 393 }
justinkim 0:53f8d6b23687 394
justinkim 0:53f8d6b23687 395 void ArduLCD::fillScr(uint16_t color)
justinkim 0:53f8d6b23687 396 {
justinkim 0:53f8d6b23687 397 long i;
justinkim 0:53f8d6b23687 398 char ch, cl;
justinkim 0:53f8d6b23687 399
justinkim 0:53f8d6b23687 400 ch=uint8_t(color>>8);
justinkim 0:53f8d6b23687 401 cl=uint8_t(color & 0xFF);
justinkim 0:53f8d6b23687 402
justinkim 0:53f8d6b23687 403 clrXY();
justinkim 0:53f8d6b23687 404
justinkim 0:53f8d6b23687 405 for (i=0; i<((disp_x_size+1)*(disp_y_size+1)); i++)
justinkim 0:53f8d6b23687 406 {
justinkim 0:53f8d6b23687 407 if (display_transfer_mode!=1)
justinkim 0:53f8d6b23687 408 LCD_Writ_Bus(ch,cl);
justinkim 0:53f8d6b23687 409 else
justinkim 0:53f8d6b23687 410 {
justinkim 0:53f8d6b23687 411 LCD_Writ_Bus(1,ch);
justinkim 0:53f8d6b23687 412 LCD_Writ_Bus(1,cl);
justinkim 0:53f8d6b23687 413 }
justinkim 0:53f8d6b23687 414 #if defined(ESP8266)
justinkim 0:53f8d6b23687 415 yield();
justinkim 0:53f8d6b23687 416 #endif
justinkim 0:53f8d6b23687 417 }
justinkim 0:53f8d6b23687 418
justinkim 0:53f8d6b23687 419 }
justinkim 0:53f8d6b23687 420
justinkim 0:53f8d6b23687 421 void ArduLCD::setColor(uint8_t r, uint8_t g, uint8_t b)
justinkim 0:53f8d6b23687 422 {
justinkim 0:53f8d6b23687 423 fch=((r&248)|g>>5);
justinkim 0:53f8d6b23687 424 fcl=((g&28)<<3|b>>3);
justinkim 0:53f8d6b23687 425 }
justinkim 0:53f8d6b23687 426
justinkim 0:53f8d6b23687 427 void ArduLCD::setColor(uint16_t color)
justinkim 0:53f8d6b23687 428 {
justinkim 0:53f8d6b23687 429 fch=uint8_t(color>>8);
justinkim 0:53f8d6b23687 430 fcl=uint8_t(color & 0xFF);
justinkim 0:53f8d6b23687 431 }
justinkim 0:53f8d6b23687 432
justinkim 0:53f8d6b23687 433 uint16_t ArduLCD::getColor()
justinkim 0:53f8d6b23687 434 {
justinkim 0:53f8d6b23687 435 return (fch<<8) | fcl;
justinkim 0:53f8d6b23687 436 }
justinkim 0:53f8d6b23687 437
justinkim 0:53f8d6b23687 438 void ArduLCD::setBackColor(uint8_t r, uint8_t g, uint8_t b)
justinkim 0:53f8d6b23687 439 {
justinkim 0:53f8d6b23687 440 bch=((r&248)|g>>5);
justinkim 0:53f8d6b23687 441 bcl=((g&28)<<3|b>>3);
justinkim 0:53f8d6b23687 442 _transparent=false;
justinkim 0:53f8d6b23687 443 }
justinkim 0:53f8d6b23687 444
justinkim 0:53f8d6b23687 445 void ArduLCD::setBackColor(uint32_t color)
justinkim 0:53f8d6b23687 446 {
justinkim 0:53f8d6b23687 447 if (color==VGA_TRANSPARENT)
justinkim 0:53f8d6b23687 448 _transparent=true;
justinkim 0:53f8d6b23687 449 else
justinkim 0:53f8d6b23687 450 {
justinkim 0:53f8d6b23687 451 bch=uint8_t(color>>8);
justinkim 0:53f8d6b23687 452 bcl=uint8_t(color & 0xFF);
justinkim 0:53f8d6b23687 453 _transparent=false;
justinkim 0:53f8d6b23687 454 }
justinkim 0:53f8d6b23687 455 }
justinkim 0:53f8d6b23687 456
justinkim 0:53f8d6b23687 457 uint16_t ArduLCD::getBackColor()
justinkim 0:53f8d6b23687 458 {
justinkim 0:53f8d6b23687 459 return (bch<<8) | bcl;
justinkim 0:53f8d6b23687 460 }
justinkim 0:53f8d6b23687 461
justinkim 0:53f8d6b23687 462 void ArduLCD::setPixel(uint16_t color)
justinkim 0:53f8d6b23687 463 {
justinkim 0:53f8d6b23687 464 LCD_Write_DATA((color>>8),(color&0xFF)); // rrrrrggggggbbbbb
justinkim 0:53f8d6b23687 465 }
justinkim 0:53f8d6b23687 466
justinkim 0:53f8d6b23687 467 void ArduLCD::drawPixel(int x, int y)
justinkim 0:53f8d6b23687 468 {
justinkim 0:53f8d6b23687 469 setXY(x, y, x, y);
justinkim 0:53f8d6b23687 470 setPixel((fch<<8)|fcl);
justinkim 0:53f8d6b23687 471 clrXY();
justinkim 0:53f8d6b23687 472 }
justinkim 0:53f8d6b23687 473
justinkim 0:53f8d6b23687 474 void ArduLCD::drawLine(int x1, int y1, int x2, int y2)
justinkim 0:53f8d6b23687 475 {
justinkim 0:53f8d6b23687 476 if (y1==y2)
justinkim 0:53f8d6b23687 477 drawHLine(x1, y1, x2-x1);
justinkim 0:53f8d6b23687 478 else if (x1==x2)
justinkim 0:53f8d6b23687 479 drawVLine(x1, y1, y2-y1);
justinkim 0:53f8d6b23687 480 else
justinkim 0:53f8d6b23687 481 {
justinkim 0:53f8d6b23687 482 unsigned int dx = (x2 > x1 ? x2 - x1 : x1 - x2);
justinkim 0:53f8d6b23687 483 short xstep = x2 > x1 ? 1 : -1;
justinkim 0:53f8d6b23687 484 unsigned int dy = (y2 > y1 ? y2 - y1 : y1 - y2);
justinkim 0:53f8d6b23687 485 short ystep = y2 > y1 ? 1 : -1;
justinkim 0:53f8d6b23687 486 int col = x1, row = y1;
justinkim 0:53f8d6b23687 487
justinkim 0:53f8d6b23687 488 if (dx < dy)
justinkim 0:53f8d6b23687 489 {
justinkim 0:53f8d6b23687 490 int t = - (dy >> 1);
justinkim 0:53f8d6b23687 491 while (true)
justinkim 0:53f8d6b23687 492 {
justinkim 0:53f8d6b23687 493 setXY (col, row, col, row);
justinkim 0:53f8d6b23687 494 LCD_Write_DATA (fch, fcl);
justinkim 0:53f8d6b23687 495 if (row == y2)
justinkim 0:53f8d6b23687 496 return;
justinkim 0:53f8d6b23687 497 row += ystep;
justinkim 0:53f8d6b23687 498 t += dx;
justinkim 0:53f8d6b23687 499 if (t >= 0)
justinkim 0:53f8d6b23687 500 {
justinkim 0:53f8d6b23687 501 col += xstep;
justinkim 0:53f8d6b23687 502 t -= dy;
justinkim 0:53f8d6b23687 503 }
justinkim 0:53f8d6b23687 504 }
justinkim 0:53f8d6b23687 505 }
justinkim 0:53f8d6b23687 506 else
justinkim 0:53f8d6b23687 507 {
justinkim 0:53f8d6b23687 508 int t = - (dx >> 1);
justinkim 0:53f8d6b23687 509 while (true)
justinkim 0:53f8d6b23687 510 {
justinkim 0:53f8d6b23687 511 setXY (col, row, col, row);
justinkim 0:53f8d6b23687 512 LCD_Write_DATA (fch, fcl);
justinkim 0:53f8d6b23687 513 if (col == x2)
justinkim 0:53f8d6b23687 514 return;
justinkim 0:53f8d6b23687 515 col += xstep;
justinkim 0:53f8d6b23687 516 t += dy;
justinkim 0:53f8d6b23687 517 if (t >= 0)
justinkim 0:53f8d6b23687 518 {
justinkim 0:53f8d6b23687 519 row += ystep;
justinkim 0:53f8d6b23687 520 t -= dx;
justinkim 0:53f8d6b23687 521 }
justinkim 0:53f8d6b23687 522 }
justinkim 0:53f8d6b23687 523 }
justinkim 0:53f8d6b23687 524 }
justinkim 0:53f8d6b23687 525 clrXY();
justinkim 0:53f8d6b23687 526 }
justinkim 0:53f8d6b23687 527
justinkim 0:53f8d6b23687 528 void ArduLCD::drawHLine(int x, int y, int l)
justinkim 0:53f8d6b23687 529 {
justinkim 0:53f8d6b23687 530 if (l<0)
justinkim 0:53f8d6b23687 531 {
justinkim 0:53f8d6b23687 532 l = -l;
justinkim 0:53f8d6b23687 533 x -= l;
justinkim 0:53f8d6b23687 534 }
justinkim 0:53f8d6b23687 535 setXY(x, y, x+l, y);
justinkim 0:53f8d6b23687 536 if (display_transfer_mode == 16)
justinkim 0:53f8d6b23687 537 {
justinkim 0:53f8d6b23687 538 _fast_fill_16(fch,fcl,l);
justinkim 0:53f8d6b23687 539 }
justinkim 0:53f8d6b23687 540 else if ((display_transfer_mode==8) and (fch==fcl))
justinkim 0:53f8d6b23687 541 {
justinkim 0:53f8d6b23687 542 _fast_fill_8(fch,l);
justinkim 0:53f8d6b23687 543 }
justinkim 0:53f8d6b23687 544 else
justinkim 0:53f8d6b23687 545 {
justinkim 0:53f8d6b23687 546 for (int i=0; i<l+1; i++)
justinkim 0:53f8d6b23687 547 {
justinkim 0:53f8d6b23687 548 LCD_Write_DATA(fch, fcl);
justinkim 0:53f8d6b23687 549 }
justinkim 0:53f8d6b23687 550 }
justinkim 0:53f8d6b23687 551 clrXY();
justinkim 0:53f8d6b23687 552 }
justinkim 0:53f8d6b23687 553
justinkim 0:53f8d6b23687 554 void ArduLCD::drawVLine(int x, int y, int l)
justinkim 0:53f8d6b23687 555 {
justinkim 0:53f8d6b23687 556 if (l<0)
justinkim 0:53f8d6b23687 557 {
justinkim 0:53f8d6b23687 558 l = -l;
justinkim 0:53f8d6b23687 559 y -= l;
justinkim 0:53f8d6b23687 560 }
justinkim 0:53f8d6b23687 561 setXY(x, y, x, y+l);
justinkim 0:53f8d6b23687 562 if (display_transfer_mode == 16)
justinkim 0:53f8d6b23687 563 {
justinkim 0:53f8d6b23687 564 _fast_fill_16(fch,fcl,l);
justinkim 0:53f8d6b23687 565 }
justinkim 0:53f8d6b23687 566 else if ((display_transfer_mode==8) and (fch==fcl))
justinkim 0:53f8d6b23687 567 {
justinkim 0:53f8d6b23687 568 _fast_fill_8(fch,l);
justinkim 0:53f8d6b23687 569 }
justinkim 0:53f8d6b23687 570 else
justinkim 0:53f8d6b23687 571 {
justinkim 0:53f8d6b23687 572 for (int i=0; i<l+1; i++)
justinkim 0:53f8d6b23687 573 {
justinkim 0:53f8d6b23687 574 LCD_Write_DATA(fch, fcl);
justinkim 0:53f8d6b23687 575 }
justinkim 0:53f8d6b23687 576 }
justinkim 0:53f8d6b23687 577 clrXY();
justinkim 0:53f8d6b23687 578 }
justinkim 0:53f8d6b23687 579 /*
justinkim 0:53f8d6b23687 580 void ArduLCD::printChar(uint8_t c, int x, int y)
justinkim 0:53f8d6b23687 581 {
justinkim 0:53f8d6b23687 582 uint8_t i,ch;
justinkim 0:53f8d6b23687 583 uint16_t j;
justinkim 0:53f8d6b23687 584 uint16_t temp;
justinkim 0:53f8d6b23687 585
justinkim 0:53f8d6b23687 586 if (!_transparent)
justinkim 0:53f8d6b23687 587 {
justinkim 0:53f8d6b23687 588 if (orient==PORTRAIT)
justinkim 0:53f8d6b23687 589 {
justinkim 0:53f8d6b23687 590 setXY(x,y,x+cfont.x_size-1,y+cfont.y_size-1);
justinkim 0:53f8d6b23687 591
justinkim 0:53f8d6b23687 592 temp=((c-cfont.offset)*((cfont.x_size/8)*cfont.y_size))+4;
justinkim 0:53f8d6b23687 593 for(j=0;j<((cfont.x_size/8)*cfont.y_size);j++)
justinkim 0:53f8d6b23687 594 {
justinkim 0:53f8d6b23687 595 ch=pgm_read_byte(&cfont.font[temp]);
justinkim 0:53f8d6b23687 596 for(i=0;i<8;i++)
justinkim 0:53f8d6b23687 597 {
justinkim 0:53f8d6b23687 598 if((ch&(1<<(7-i)))!=0)
justinkim 0:53f8d6b23687 599 {
justinkim 0:53f8d6b23687 600 setPixel((fch<<8)|fcl);
justinkim 0:53f8d6b23687 601 }
justinkim 0:53f8d6b23687 602 else
justinkim 0:53f8d6b23687 603 {
justinkim 0:53f8d6b23687 604 setPixel((bch<<8)|bcl);
justinkim 0:53f8d6b23687 605 }
justinkim 0:53f8d6b23687 606 }
justinkim 0:53f8d6b23687 607 temp++;
justinkim 0:53f8d6b23687 608 }
justinkim 0:53f8d6b23687 609 }
justinkim 0:53f8d6b23687 610 else
justinkim 0:53f8d6b23687 611 {
justinkim 0:53f8d6b23687 612 temp=((c-cfont.offset)*((cfont.x_size/8)*cfont.y_size))+4;
justinkim 0:53f8d6b23687 613
justinkim 0:53f8d6b23687 614 for(j=0;j<((cfont.x_size/8)*cfont.y_size);j+=(cfont.x_size/8))
justinkim 0:53f8d6b23687 615 {
justinkim 0:53f8d6b23687 616 setXY(x,y+(j/(cfont.x_size/8)),x+cfont.x_size-1,y+(j/(cfont.x_size/8)));
justinkim 0:53f8d6b23687 617 for (int zz=(cfont.x_size/8)-1; zz>=0; zz--)
justinkim 0:53f8d6b23687 618 {
justinkim 0:53f8d6b23687 619 ch=pgm_read_byte(&cfont.font[temp+zz]);
justinkim 0:53f8d6b23687 620 for(i=0;i<8;i++)
justinkim 0:53f8d6b23687 621 {
justinkim 0:53f8d6b23687 622 if((ch&(1<<i))!=0)
justinkim 0:53f8d6b23687 623 {
justinkim 0:53f8d6b23687 624 setPixel((fch<<8)|fcl);
justinkim 0:53f8d6b23687 625 }
justinkim 0:53f8d6b23687 626 else
justinkim 0:53f8d6b23687 627 {
justinkim 0:53f8d6b23687 628 setPixel((bch<<8)|bcl);
justinkim 0:53f8d6b23687 629 }
justinkim 0:53f8d6b23687 630 }
justinkim 0:53f8d6b23687 631 }
justinkim 0:53f8d6b23687 632 temp+=(cfont.x_size/8);
justinkim 0:53f8d6b23687 633 }
justinkim 0:53f8d6b23687 634 }
justinkim 0:53f8d6b23687 635 }
justinkim 0:53f8d6b23687 636 else
justinkim 0:53f8d6b23687 637 {
justinkim 0:53f8d6b23687 638 temp=((c-cfont.offset)*((cfont.x_size/8)*cfont.y_size))+4;
justinkim 0:53f8d6b23687 639 for(j=0;j<cfont.y_size;j++)
justinkim 0:53f8d6b23687 640 {
justinkim 0:53f8d6b23687 641 for (int zz=0; zz<(cfont.x_size/8); zz++)
justinkim 0:53f8d6b23687 642 {
justinkim 0:53f8d6b23687 643 ch=pgm_read_byte(&cfont.font[temp+zz]);
justinkim 0:53f8d6b23687 644 for(i=0;i<8;i++)
justinkim 0:53f8d6b23687 645 {
justinkim 0:53f8d6b23687 646 setXY(x+i+(zz*8),y+j,x+i+(zz*8)+1,y+j+1);
justinkim 0:53f8d6b23687 647
justinkim 0:53f8d6b23687 648 if((ch&(1<<(7-i)))!=0)
justinkim 0:53f8d6b23687 649 {
justinkim 0:53f8d6b23687 650 setPixel((fch<<8)|fcl);
justinkim 0:53f8d6b23687 651 }
justinkim 0:53f8d6b23687 652 }
justinkim 0:53f8d6b23687 653 }
justinkim 0:53f8d6b23687 654 temp+=(cfont.x_size/8);
justinkim 0:53f8d6b23687 655 }
justinkim 0:53f8d6b23687 656 }
justinkim 0:53f8d6b23687 657 clrXY();
justinkim 0:53f8d6b23687 658 }
justinkim 0:53f8d6b23687 659
justinkim 0:53f8d6b23687 660 void ArduLCD::rotateChar(uint8_t c, int x, int y, int pos, int deg)
justinkim 0:53f8d6b23687 661 {
justinkim 0:53f8d6b23687 662 uint8_t i,j,ch;
justinkim 0:53f8d6b23687 663 uint16_t temp;
justinkim 0:53f8d6b23687 664 int newx,newy;
justinkim 0:53f8d6b23687 665 double radian;
justinkim 0:53f8d6b23687 666 radian=deg*0.0175;
justinkim 0:53f8d6b23687 667
justinkim 0:53f8d6b23687 668 temp=((c-cfont.offset)*((cfont.x_size/8)*cfont.y_size))+4;
justinkim 0:53f8d6b23687 669 for(j=0;j<cfont.y_size;j++)
justinkim 0:53f8d6b23687 670 {
justinkim 0:53f8d6b23687 671 for (int zz=0; zz<(cfont.x_size/8); zz++)
justinkim 0:53f8d6b23687 672 {
justinkim 0:53f8d6b23687 673 ch=pgm_read_byte(&cfont.font[temp+zz]);
justinkim 0:53f8d6b23687 674 for(i=0;i<8;i++)
justinkim 0:53f8d6b23687 675 {
justinkim 0:53f8d6b23687 676 newx=x+(((i+(zz*8)+(pos*cfont.x_size))*cos(radian))-((j)*sin(radian)));
justinkim 0:53f8d6b23687 677 newy=y+(((j)*cos(radian))+((i+(zz*8)+(pos*cfont.x_size))*sin(radian)));
justinkim 0:53f8d6b23687 678
justinkim 0:53f8d6b23687 679 setXY(newx,newy,newx+1,newy+1);
justinkim 0:53f8d6b23687 680
justinkim 0:53f8d6b23687 681 if((ch&(1<<(7-i)))!=0)
justinkim 0:53f8d6b23687 682 {
justinkim 0:53f8d6b23687 683 setPixel((fch<<8)|fcl);
justinkim 0:53f8d6b23687 684 }
justinkim 0:53f8d6b23687 685 else
justinkim 0:53f8d6b23687 686 {
justinkim 0:53f8d6b23687 687 if (!_transparent)
justinkim 0:53f8d6b23687 688 setPixel((bch<<8)|bcl);
justinkim 0:53f8d6b23687 689 }
justinkim 0:53f8d6b23687 690 }
justinkim 0:53f8d6b23687 691 }
justinkim 0:53f8d6b23687 692 temp+=(cfont.x_size/8);
justinkim 0:53f8d6b23687 693 }
justinkim 0:53f8d6b23687 694 clrXY();
justinkim 0:53f8d6b23687 695 }
justinkim 0:53f8d6b23687 696
justinkim 0:53f8d6b23687 697 void ArduLCD::print(char *st, int x, int y, int deg)
justinkim 0:53f8d6b23687 698 {
justinkim 0:53f8d6b23687 699 int stl, i;
justinkim 0:53f8d6b23687 700
justinkim 0:53f8d6b23687 701 stl = strlen(st);
justinkim 0:53f8d6b23687 702
justinkim 0:53f8d6b23687 703 if (orient==PORTRAIT)
justinkim 0:53f8d6b23687 704 {
justinkim 0:53f8d6b23687 705 if (x==RIGHT)
justinkim 0:53f8d6b23687 706 x=(disp_x_size+1)-(stl*cfont.x_size);
justinkim 0:53f8d6b23687 707 if (x==CENTER)
justinkim 0:53f8d6b23687 708 x=((disp_x_size+1)-(stl*cfont.x_size))/2;
justinkim 0:53f8d6b23687 709 }
justinkim 0:53f8d6b23687 710 else
justinkim 0:53f8d6b23687 711 {
justinkim 0:53f8d6b23687 712 if (x==RIGHT)
justinkim 0:53f8d6b23687 713 x=(disp_y_size+1)-(stl*cfont.x_size);
justinkim 0:53f8d6b23687 714 if (x==CENTER)
justinkim 0:53f8d6b23687 715 x=((disp_y_size+1)-(stl*cfont.x_size))/2;
justinkim 0:53f8d6b23687 716 }
justinkim 0:53f8d6b23687 717
justinkim 0:53f8d6b23687 718 for (i=0; i<stl; i++)
justinkim 0:53f8d6b23687 719 if (deg==0)
justinkim 0:53f8d6b23687 720 printChar(*st++, x + (i*(cfont.x_size)), y);
justinkim 0:53f8d6b23687 721 else
justinkim 0:53f8d6b23687 722 rotateChar(*st++, x, y, i, deg);
justinkim 0:53f8d6b23687 723 }
justinkim 0:53f8d6b23687 724
justinkim 0:53f8d6b23687 725 void ArduLCD::print(string st, int x, int y, int deg)
justinkim 0:53f8d6b23687 726 {
justinkim 0:53f8d6b23687 727 char buf[st.length()+1];
justinkim 0:53f8d6b23687 728
justinkim 0:53f8d6b23687 729 st.toCharArray(buf, st.length()+1);
justinkim 0:53f8d6b23687 730 print(buf, x, y, deg);
justinkim 0:53f8d6b23687 731 }
justinkim 0:53f8d6b23687 732
justinkim 0:53f8d6b23687 733 void ArduLCD::printNumI(long num, int x, int y, int length, char filler)
justinkim 0:53f8d6b23687 734 {
justinkim 0:53f8d6b23687 735 char buf[25];
justinkim 0:53f8d6b23687 736 char st[27];
justinkim 0:53f8d6b23687 737 bool neg=false;
justinkim 0:53f8d6b23687 738 int c=0, f=0;
justinkim 0:53f8d6b23687 739
justinkim 0:53f8d6b23687 740 if (num==0)
justinkim 0:53f8d6b23687 741 {
justinkim 0:53f8d6b23687 742 if (length!=0)
justinkim 0:53f8d6b23687 743 {
justinkim 0:53f8d6b23687 744 for (c=0; c<(length-1); c++)
justinkim 0:53f8d6b23687 745 st[c]=filler;
justinkim 0:53f8d6b23687 746 st[c]=48;
justinkim 0:53f8d6b23687 747 st[c+1]=0;
justinkim 0:53f8d6b23687 748 }
justinkim 0:53f8d6b23687 749 else
justinkim 0:53f8d6b23687 750 {
justinkim 0:53f8d6b23687 751 st[0]=48;
justinkim 0:53f8d6b23687 752 st[1]=0;
justinkim 0:53f8d6b23687 753 }
justinkim 0:53f8d6b23687 754 }
justinkim 0:53f8d6b23687 755 else
justinkim 0:53f8d6b23687 756 {
justinkim 0:53f8d6b23687 757 if (num<0)
justinkim 0:53f8d6b23687 758 {
justinkim 0:53f8d6b23687 759 neg=true;
justinkim 0:53f8d6b23687 760 num=-num;
justinkim 0:53f8d6b23687 761 }
justinkim 0:53f8d6b23687 762
justinkim 0:53f8d6b23687 763 while (num>0)
justinkim 0:53f8d6b23687 764 {
justinkim 0:53f8d6b23687 765 buf[c]=48+(num % 10);
justinkim 0:53f8d6b23687 766 c++;
justinkim 0:53f8d6b23687 767 num=(num-(num % 10))/10;
justinkim 0:53f8d6b23687 768 }
justinkim 0:53f8d6b23687 769 buf[c]=0;
justinkim 0:53f8d6b23687 770
justinkim 0:53f8d6b23687 771 if (neg)
justinkim 0:53f8d6b23687 772 {
justinkim 0:53f8d6b23687 773 st[0]=45;
justinkim 0:53f8d6b23687 774 }
justinkim 0:53f8d6b23687 775
justinkim 0:53f8d6b23687 776 if (length>(c+neg))
justinkim 0:53f8d6b23687 777 {
justinkim 0:53f8d6b23687 778 for (int i=0; i<(length-c-neg); i++)
justinkim 0:53f8d6b23687 779 {
justinkim 0:53f8d6b23687 780 st[i+neg]=filler;
justinkim 0:53f8d6b23687 781 f++;
justinkim 0:53f8d6b23687 782 }
justinkim 0:53f8d6b23687 783 }
justinkim 0:53f8d6b23687 784
justinkim 0:53f8d6b23687 785 for (int i=0; i<c; i++)
justinkim 0:53f8d6b23687 786 {
justinkim 0:53f8d6b23687 787 st[i+neg+f]=buf[c-i-1];
justinkim 0:53f8d6b23687 788 }
justinkim 0:53f8d6b23687 789 st[c+neg+f]=0;
justinkim 0:53f8d6b23687 790
justinkim 0:53f8d6b23687 791 }
justinkim 0:53f8d6b23687 792
justinkim 0:53f8d6b23687 793 print(st,x,y);
justinkim 0:53f8d6b23687 794 }
justinkim 0:53f8d6b23687 795
justinkim 0:53f8d6b23687 796 void ArduLCD::printNumF(double num, uint8_t dec, int x, int y, char divider, int length, char filler)
justinkim 0:53f8d6b23687 797 {
justinkim 0:53f8d6b23687 798 char st[27];
justinkim 0:53f8d6b23687 799 bool neg=false;
justinkim 0:53f8d6b23687 800
justinkim 0:53f8d6b23687 801 if (dec<1)
justinkim 0:53f8d6b23687 802 dec=1;
justinkim 0:53f8d6b23687 803 else if (dec>5)
justinkim 0:53f8d6b23687 804 dec=5;
justinkim 0:53f8d6b23687 805
justinkim 0:53f8d6b23687 806 if (num<0)
justinkim 0:53f8d6b23687 807 neg = true;
justinkim 0:53f8d6b23687 808
justinkim 0:53f8d6b23687 809 _convert_float(st, num, length, dec);
justinkim 0:53f8d6b23687 810
justinkim 0:53f8d6b23687 811 if (divider != '.')
justinkim 0:53f8d6b23687 812 {
justinkim 0:53f8d6b23687 813 for (int i=0; i<sizeof(st); i++)
justinkim 0:53f8d6b23687 814 if (st[i]=='.')
justinkim 0:53f8d6b23687 815 st[i]=divider;
justinkim 0:53f8d6b23687 816 }
justinkim 0:53f8d6b23687 817
justinkim 0:53f8d6b23687 818 if (filler != ' ')
justinkim 0:53f8d6b23687 819 {
justinkim 0:53f8d6b23687 820 if (neg)
justinkim 0:53f8d6b23687 821 {
justinkim 0:53f8d6b23687 822 st[0]='-';
justinkim 0:53f8d6b23687 823 for (int i=1; i<sizeof(st); i++)
justinkim 0:53f8d6b23687 824 if ((st[i]==' ') || (st[i]=='-'))
justinkim 0:53f8d6b23687 825 st[i]=filler;
justinkim 0:53f8d6b23687 826 }
justinkim 0:53f8d6b23687 827 else
justinkim 0:53f8d6b23687 828 {
justinkim 0:53f8d6b23687 829 for (int i=0; i<sizeof(st); i++)
justinkim 0:53f8d6b23687 830 if (st[i]==' ')
justinkim 0:53f8d6b23687 831 st[i]=filler;
justinkim 0:53f8d6b23687 832 }
justinkim 0:53f8d6b23687 833 }
justinkim 0:53f8d6b23687 834
justinkim 0:53f8d6b23687 835 print(st,x,y);
justinkim 0:53f8d6b23687 836 }
justinkim 0:53f8d6b23687 837
justinkim 0:53f8d6b23687 838 void ArduLCD::setFont(uint8_t* font)
justinkim 0:53f8d6b23687 839 {
justinkim 0:53f8d6b23687 840 cfont.font=font;
justinkim 0:53f8d6b23687 841 cfont.x_size=fontbyte(0);
justinkim 0:53f8d6b23687 842 cfont.y_size=fontbyte(1);
justinkim 0:53f8d6b23687 843 cfont.offset=fontbyte(2);
justinkim 0:53f8d6b23687 844 cfont.numchars=fontbyte(3);
justinkim 0:53f8d6b23687 845 }
justinkim 0:53f8d6b23687 846
justinkim 0:53f8d6b23687 847 uint8_t* ArduLCD::getFont()
justinkim 0:53f8d6b23687 848 {
justinkim 0:53f8d6b23687 849 return cfont.font;
justinkim 0:53f8d6b23687 850 }
justinkim 0:53f8d6b23687 851
justinkim 0:53f8d6b23687 852 uint8_t ArduLCD::getFontXsize()
justinkim 0:53f8d6b23687 853 {
justinkim 0:53f8d6b23687 854 return cfont.x_size;
justinkim 0:53f8d6b23687 855 }
justinkim 0:53f8d6b23687 856
justinkim 0:53f8d6b23687 857 uint8_t ArduLCD::getFontYsize()
justinkim 0:53f8d6b23687 858 {
justinkim 0:53f8d6b23687 859 return cfont.y_size;
justinkim 0:53f8d6b23687 860 }*/
justinkim 0:53f8d6b23687 861
justinkim 0:53f8d6b23687 862 void ArduLCD::drawBitmap(int x, int y, int sx, int sy, bitmapdatatype data, int scale)
justinkim 0:53f8d6b23687 863 {
justinkim 0:53f8d6b23687 864 unsigned int col;
justinkim 0:53f8d6b23687 865 int tx, ty, tc, tsx, tsy;
justinkim 0:53f8d6b23687 866
justinkim 0:53f8d6b23687 867 if (scale==1)
justinkim 0:53f8d6b23687 868 {
justinkim 0:53f8d6b23687 869 if (orient==PORTRAIT)
justinkim 0:53f8d6b23687 870 {
justinkim 0:53f8d6b23687 871 setXY(x, y, x+sx-1, y+sy-1);
justinkim 0:53f8d6b23687 872 for (tc=0; tc<(sx*sy); tc++)
justinkim 0:53f8d6b23687 873 {
justinkim 0:53f8d6b23687 874 col=pgm_read_word(&data[tc]);
justinkim 0:53f8d6b23687 875 LCD_Write_DATA(col>>8,col & 0xff);
justinkim 0:53f8d6b23687 876 }
justinkim 0:53f8d6b23687 877 }
justinkim 0:53f8d6b23687 878 else
justinkim 0:53f8d6b23687 879 {
justinkim 0:53f8d6b23687 880 for (ty=0; ty<sy; ty++)
justinkim 0:53f8d6b23687 881 {
justinkim 0:53f8d6b23687 882 setXY(x, y+ty, x+sx-1, y+ty);
justinkim 0:53f8d6b23687 883 for (tx=sx-1; tx>=0; tx--)
justinkim 0:53f8d6b23687 884 {
justinkim 0:53f8d6b23687 885 col=pgm_read_word(&data[(ty*sx)+tx]);
justinkim 0:53f8d6b23687 886 LCD_Write_DATA(col>>8,col & 0xff);
justinkim 0:53f8d6b23687 887 }
justinkim 0:53f8d6b23687 888 }
justinkim 0:53f8d6b23687 889 }
justinkim 0:53f8d6b23687 890 }
justinkim 0:53f8d6b23687 891 else
justinkim 0:53f8d6b23687 892 {
justinkim 0:53f8d6b23687 893 if (orient==PORTRAIT)
justinkim 0:53f8d6b23687 894 {
justinkim 0:53f8d6b23687 895 for (ty=0; ty<sy; ty++)
justinkim 0:53f8d6b23687 896 {
justinkim 0:53f8d6b23687 897 setXY(x, y+(ty*scale), x+((sx*scale)-1), y+(ty*scale)+scale);
justinkim 0:53f8d6b23687 898 for (tsy=0; tsy<scale; tsy++)
justinkim 0:53f8d6b23687 899 for (tx=0; tx<sx; tx++)
justinkim 0:53f8d6b23687 900 {
justinkim 0:53f8d6b23687 901 col=pgm_read_word(&data[(ty*sx)+tx]);
justinkim 0:53f8d6b23687 902 for (tsx=0; tsx<scale; tsx++)
justinkim 0:53f8d6b23687 903 LCD_Write_DATA(col>>8,col & 0xff);
justinkim 0:53f8d6b23687 904 }
justinkim 0:53f8d6b23687 905 }
justinkim 0:53f8d6b23687 906 }
justinkim 0:53f8d6b23687 907 else
justinkim 0:53f8d6b23687 908 {
justinkim 0:53f8d6b23687 909 for (ty=0; ty<sy; ty++)
justinkim 0:53f8d6b23687 910 {
justinkim 0:53f8d6b23687 911 for (tsy=0; tsy<scale; tsy++)
justinkim 0:53f8d6b23687 912 {
justinkim 0:53f8d6b23687 913 setXY(x, y+(ty*scale)+tsy, x+((sx*scale)-1), y+(ty*scale)+tsy);
justinkim 0:53f8d6b23687 914 for (tx=sx-1; tx>=0; tx--)
justinkim 0:53f8d6b23687 915 {
justinkim 0:53f8d6b23687 916 col=pgm_read_word(&data[(ty*sx)+tx]);
justinkim 0:53f8d6b23687 917 for (tsx=0; tsx<scale; tsx++)
justinkim 0:53f8d6b23687 918 LCD_Write_DATA(col>>8,col & 0xff);
justinkim 0:53f8d6b23687 919 }
justinkim 0:53f8d6b23687 920 }
justinkim 0:53f8d6b23687 921 }
justinkim 0:53f8d6b23687 922 }
justinkim 0:53f8d6b23687 923 }
justinkim 0:53f8d6b23687 924 clrXY();
justinkim 0:53f8d6b23687 925 }
justinkim 0:53f8d6b23687 926
justinkim 0:53f8d6b23687 927 void ArduLCD::drawBitmap(int x, int y, int sx, int sy, bitmapdatatype data, int deg, int rox, int roy)
justinkim 0:53f8d6b23687 928 {
justinkim 0:53f8d6b23687 929 unsigned int col;
justinkim 0:53f8d6b23687 930 int tx, ty, newx, newy;
justinkim 0:53f8d6b23687 931 double radian;
justinkim 0:53f8d6b23687 932 radian=deg*0.0175;
justinkim 0:53f8d6b23687 933
justinkim 0:53f8d6b23687 934 if (deg==0)
justinkim 0:53f8d6b23687 935 drawBitmap(x, y, sx, sy, data);
justinkim 0:53f8d6b23687 936 else
justinkim 0:53f8d6b23687 937 {
justinkim 0:53f8d6b23687 938 for (ty=0; ty<sy; ty++)
justinkim 0:53f8d6b23687 939 for (tx=0; tx<sx; tx++)
justinkim 0:53f8d6b23687 940 {
justinkim 0:53f8d6b23687 941 col=pgm_read_word(&data[(ty*sx)+tx]);
justinkim 0:53f8d6b23687 942
justinkim 0:53f8d6b23687 943 newx=x+rox+(((tx-rox)*cos(radian))-((ty-roy)*sin(radian)));
justinkim 0:53f8d6b23687 944 newy=y+roy+(((ty-roy)*cos(radian))+((tx-rox)*sin(radian)));
justinkim 0:53f8d6b23687 945
justinkim 0:53f8d6b23687 946 setXY(newx, newy, newx, newy);
justinkim 0:53f8d6b23687 947 LCD_Write_DATA(col>>8,col & 0xff);
justinkim 0:53f8d6b23687 948 }
justinkim 0:53f8d6b23687 949 }
justinkim 0:53f8d6b23687 950 clrXY();
justinkim 0:53f8d6b23687 951 }
justinkim 0:53f8d6b23687 952
justinkim 0:53f8d6b23687 953 void ArduLCD::lcdOff()
justinkim 0:53f8d6b23687 954 {
justinkim 0:53f8d6b23687 955
justinkim 0:53f8d6b23687 956 }
justinkim 0:53f8d6b23687 957
justinkim 0:53f8d6b23687 958 void ArduLCD::lcdOn()
justinkim 0:53f8d6b23687 959 {
justinkim 0:53f8d6b23687 960
justinkim 0:53f8d6b23687 961 }
justinkim 0:53f8d6b23687 962
justinkim 0:53f8d6b23687 963 void ArduLCD::setContrast(char c)
justinkim 0:53f8d6b23687 964 {
justinkim 0:53f8d6b23687 965
justinkim 0:53f8d6b23687 966 }
justinkim 0:53f8d6b23687 967
justinkim 0:53f8d6b23687 968 int ArduLCD::getDisplayXSize()
justinkim 0:53f8d6b23687 969 {
justinkim 0:53f8d6b23687 970 if (orient==PORTRAIT)
justinkim 0:53f8d6b23687 971 return disp_x_size+1;
justinkim 0:53f8d6b23687 972 else
justinkim 0:53f8d6b23687 973 return disp_y_size+1;
justinkim 0:53f8d6b23687 974 }
justinkim 0:53f8d6b23687 975
justinkim 0:53f8d6b23687 976 int ArduLCD::getDisplayYSize()
justinkim 0:53f8d6b23687 977 {
justinkim 0:53f8d6b23687 978 if (orient==PORTRAIT)
justinkim 0:53f8d6b23687 979 return disp_y_size+1;
justinkim 0:53f8d6b23687 980 else
justinkim 0:53f8d6b23687 981 return disp_x_size+1;
justinkim 0:53f8d6b23687 982 }
justinkim 0:53f8d6b23687 983
justinkim 0:53f8d6b23687 984 void ArduLCD::_fast_fill_16(int ch, int cl, long pix)
justinkim 0:53f8d6b23687 985 {
justinkim 0:53f8d6b23687 986
justinkim 0:53f8d6b23687 987 }
justinkim 0:53f8d6b23687 988
justinkim 0:53f8d6b23687 989 void ArduLCD::_fast_fill_8(int ch, long pix)
justinkim 0:53f8d6b23687 990 {
justinkim 0:53f8d6b23687 991
justinkim 0:53f8d6b23687 992 }
justinkim 0:53f8d6b23687 993
justinkim 0:53f8d6b23687 994 void ArduLCD::setBrightness(uint8_t br)
justinkim 0:53f8d6b23687 995 {
justinkim 0:53f8d6b23687 996
justinkim 0:53f8d6b23687 997 }
justinkim 0:53f8d6b23687 998
justinkim 0:53f8d6b23687 999 void ArduLCD::setDisplayPage(uint8_t page)
justinkim 0:53f8d6b23687 1000 {
justinkim 0:53f8d6b23687 1001
justinkim 0:53f8d6b23687 1002 }
justinkim 0:53f8d6b23687 1003
justinkim 0:53f8d6b23687 1004 void ArduLCD::setWritePage(uint8_t page)
justinkim 0:53f8d6b23687 1005 {
justinkim 0:53f8d6b23687 1006
justinkim 0:53f8d6b23687 1007 }
justinkim 0:53f8d6b23687 1008
justinkim 0:53f8d6b23687 1009 void ArduLCD::_convert_float(char *buf, double num, int width, uint8_t prec)
justinkim 0:53f8d6b23687 1010 {
justinkim 0:53f8d6b23687 1011
justinkim 0:53f8d6b23687 1012 }
justinkim 0:53f8d6b23687 1013