diff options
Diffstat (limited to 'libraries/MultiLCD/UTFT.cpp')
-rw-r--r-- | libraries/MultiLCD/UTFT.cpp | 985 |
1 files changed, 985 insertions, 0 deletions
diff --git a/libraries/MultiLCD/UTFT.cpp b/libraries/MultiLCD/UTFT.cpp new file mode 100644 index 0000000..59710e9 --- /dev/null +++ b/libraries/MultiLCD/UTFT.cpp @@ -0,0 +1,985 @@ +/* + UTFT.cpp - Arduino/chipKit library support for Color TFT LCD Boards + Copyright (C)2010-2014 Henning Karlsen. All right reserved + + This library is the continuation of my ITDB02_Graph, ITDB02_Graph16 + and RGB_GLCD libraries for Arduino and chipKit. As the number of + supported display modules and controllers started to increase I felt + it was time to make a single, universal library as it will be much + easier to maintain in the future. + + Basic functionality of this library was origianlly based on the + demo-code provided by ITead studio (for the ITDB02 modules) and + NKC Electronics (for the RGB GLCD module/shield). + + This library supports a number of 8bit, 16bit and serial graphic + displays, and will work with both Arduino and chipKit boards. For a + full list of tested display modules and controllers, see the + document UTFT_Supported_display_modules_&_controllers.pdf. + + When using 8bit and 16bit display modules there are some + requirements you must adhere to. These requirements can be found + in the document UTFT_Requirements.pdf. + There are no special requirements when using serial displays. + + You can always find the latest version of the library at + http://electronics.henningkarlsen.com/ + + If you make any modifications or improvements to the code, I would + appreciate that you share the code with me so that I might include + it in the next release. I can be contacted through + http://electronics.henningkarlsen.com/contact.php. + + This library is free software; you can redistribute it and/or + modify it under the terms of the CC BY-NC-SA 3.0 license. + Please see the included documents for further information. + + Commercial use of this library requires you to buy a license that + will allow commercial use. This includes using the library, + modified or not, as a tool to sell products. + + The license applies to all part of the library including the + examples and tools supplied with the library. +*/ + +#include "UTFT.h" +#include <pins_arduino.h> + +// Include hardware-specific functions for the correct MCU +#if defined(__AVR__) + #include <avr/pgmspace.h> + #include "hardware/avr/HW_AVR.h" + #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + #include "hardware/avr/HW_ATmega1280.h" + #elif defined(__AVR_ATmega328P__) + #include "hardware/avr/HW_ATmega328P.h" + #elif defined(__AVR_ATmega32U4__) + #include "hardware/avr/HW_ATmega32U4.h" + #elif defined(__AVR_ATmega168__) + #error "ATmega168 MCUs are not supported because they have too little flash memory!" + #elif defined(__AVR_ATmega1284P__) + #include "hardware/avr/HW_ATmega1284P.h" + #else + #error "Unsupported AVR MCU!" + #endif +#elif defined(__PIC32MX__) + #include "hardware/pic32/HW_PIC32.h" + #if defined(__32MX320F128H__) + #pragma message("Compiling for chipKIT UNO32 (PIC32MX320F128H)") + #include "hardware/pic32/HW_PIC32MX320F128H.h" + #elif defined(__32MX340F512H__) + #pragma message("Compiling for chipKIT uC32 (PIC32MX340F512H)") + #include "hardware/pic32/HW_PIC32MX340F512H.h" + #elif defined(__32MX795F512L__) + #pragma message("Compiling for chipKIT MAX32 (PIC32MX795F512L)") + #include "hardware/pic32/HW_PIC32MX795F512L.h" + #else + #error "Unsupported PIC32 MCU!" + #endif +#elif defined(__arm__) + #include "hardware/arm/HW_ARM.h" + #if defined(__SAM3X8E__) + #pragma message("Compiling for Arduino Due (AT91SAM3X8E)...") + #include "hardware/arm/HW_SAM3X8E.h" + #elif defined(__MK20DX128__) || defined(__MK20DX256__) + #pragma message("Compiling for Teensy 3.x (MK20DX128VLH7 / MK20DX256VLH7)...") + #include "hardware/arm/HW_MX20DX256.h" + #else + #error "Unsupported ARM MCU!" + #endif +#endif +#include "memorysaver.h" + +UTFT::UTFT() +{ +} + +UTFT::UTFT(byte model, int RS, int WR, int CS, int RST, int SER) +{ + word dsx[] = {239, 239, 239, 239, 239, 239, 175, 175, 239, 127, 127, 239, 271, 479, 239, 239, 239, 239, 239, 239, 479, 319, 239, 175, 127, 239, 239, 319, 319, 799, 127}; + word dsy[] = {319, 399, 319, 319, 319, 319, 219, 219, 399, 159, 127, 319, 479, 799, 319, 319, 319, 319, 319, 319, 799, 479, 319, 219, 159, 319, 319, 479, 479, 479, 159}; + byte dtm[] = {16, 16, 16, 8, 8, 16, 8, SERIAL_4PIN, 16, SERIAL_5PIN, SERIAL_5PIN, 16, 16, 16, 8, 16, LATCHED_16, 8, 16, 8, 16, 16, 16, 8, SERIAL_5PIN, SERIAL_5PIN, SERIAL_4PIN, 16, 16, 16, SERIAL_5PIN}; + + disp_x_size = dsx[model]; + disp_y_size = dsy[model]; + display_transfer_mode = dtm[model]; + display_model = model; + + __p1 = RS; + __p2 = WR; + __p3 = CS; + __p4 = RST; + __p5 = SER; + + if (display_transfer_mode == SERIAL_4PIN) + { + display_transfer_mode=1; + display_serial_mode=SERIAL_4PIN; + } + if (display_transfer_mode == SERIAL_5PIN) + { + display_transfer_mode=1; + display_serial_mode=SERIAL_5PIN; + } + + if (display_transfer_mode!=1) + { + P_RS = portOutputRegister(digitalPinToPort(RS)); + B_RS = digitalPinToBitMask(RS); + P_WR = portOutputRegister(digitalPinToPort(WR)); + B_WR = digitalPinToBitMask(WR); + P_CS = portOutputRegister(digitalPinToPort(CS)); + B_CS = digitalPinToBitMask(CS); + P_RST = portOutputRegister(digitalPinToPort(RST)); + B_RST = digitalPinToBitMask(RST); + if (display_transfer_mode==LATCHED_16) + { + P_ALE = portOutputRegister(digitalPinToPort(SER)); + B_ALE = digitalPinToBitMask(SER); + cbi(P_ALE, B_ALE); + pinMode(8,OUTPUT); + digitalWrite(8, LOW); + } + } + else + { + P_SDA = portOutputRegister(digitalPinToPort(RS)); + B_SDA = digitalPinToBitMask(RS); + P_SCL = portOutputRegister(digitalPinToPort(WR)); + B_SCL = digitalPinToBitMask(WR); + P_CS = portOutputRegister(digitalPinToPort(CS)); + B_CS = digitalPinToBitMask(CS); + if (RST != NOTINUSE) + { + P_RST = portOutputRegister(digitalPinToPort(RST)); + B_RST = digitalPinToBitMask(RST); + } + if (display_serial_mode!=SERIAL_4PIN) + { + P_RS = portOutputRegister(digitalPinToPort(SER)); + B_RS = digitalPinToBitMask(SER); + } + } +} + +void UTFT::LCD_Write_COM(char VL) +{ + if (display_transfer_mode!=1) + { + cbi(P_RS, B_RS); + LCD_Writ_Bus(0x00,VL,display_transfer_mode); + } + else + LCD_Writ_Bus(0x00,VL,display_transfer_mode); +} + +void UTFT::LCD_Write_DATA(char VH,char VL) +{ + if (display_transfer_mode!=1) + { + sbi(P_RS, B_RS); + LCD_Writ_Bus(VH,VL,display_transfer_mode); + } + else + { + LCD_Writ_Bus(0x01,VH,display_transfer_mode); + LCD_Writ_Bus(0x01,VL,display_transfer_mode); + } +} + +void UTFT::LCD_Write_DATA(char VL) +{ + if (display_transfer_mode!=1) + { + sbi(P_RS, B_RS); + LCD_Writ_Bus(0x00,VL,display_transfer_mode); + } + else + LCD_Writ_Bus(0x01,VL,display_transfer_mode); +} + +void UTFT::LCD_Write_COM_DATA(char com1,int dat1) +{ + LCD_Write_COM(com1); + LCD_Write_DATA(dat1>>8,dat1); +} + +void UTFT::InitLCD() +{ + pinMode(__p1,OUTPUT); + pinMode(__p2,OUTPUT); + pinMode(__p3,OUTPUT); + if (__p4 != NOTINUSE) + pinMode(__p4,OUTPUT); + if ((display_transfer_mode==LATCHED_16) or ((display_transfer_mode==1) and (display_serial_mode==SERIAL_5PIN))) + pinMode(__p5,OUTPUT); + if (display_transfer_mode!=1) + _set_direction_registers(display_transfer_mode); + + _hw_special_init(); + + sbi(P_RST, B_RST); + delay(5); + cbi(P_RST, B_RST); + delay(15); + sbi(P_RST, B_RST); + delay(15); + + cbi(P_CS, B_CS); + + switch(display_model) + { +#ifndef DISABLE_HX8347A + #include "tft_drivers/hx8347a/initlcd.h" +#endif +#ifndef DISABLE_ILI9327 + #include "tft_drivers/ili9327/initlcd.h" +#endif +#ifndef DISABLE_SSD1289 + #include "tft_drivers/ssd1289/initlcd.h" +#endif +#ifndef DISABLE_ILI9325C + #include "tft_drivers/ili9325c/initlcd.h" +#endif +#ifndef DISABLE_ILI9325D + #include "tft_drivers/ili9325d/default/initlcd.h" +#endif +#ifndef DISABLE_ILI9325D_ALT + #include "tft_drivers/ili9325d/alt/initlcd.h" +#endif +#ifndef DISABLE_HX8340B_8 + #include "tft_drivers/hx8340b/8/initlcd.h" +#endif +#ifndef DISABLE_HX8340B_S + #include "tft_drivers/hx8340b/s/initlcd.h" +#endif +#ifndef DISABLE_ST7735 + #include "tft_drivers/st7735/initlcd.h" +#endif +#ifndef DISABLE_PCF8833 + #include "tft_drivers/pcf8833/initlcd.h" +#endif +#ifndef DISABLE_S1D19122 + #include "tft_drivers/s1d19122/initlcd.h" +#endif +#ifndef DISABLE_HX8352A + #include "tft_drivers/hx8352a/initlcd.h" +#endif +#ifndef DISABLE_SSD1963_480 + #include "tft_drivers/ssd1963/480/initlcd.h" +#endif +#ifndef DISABLE_SSD1963_800 + #include "tft_drivers/ssd1963/800/initlcd.h" +#endif +#ifndef DISABLE_SSD1963_800_ALT + #include "tft_drivers/ssd1963/800alt/initlcd.h" +#endif +#ifndef DISABLE_S6D1121 + #include "tft_drivers/s6d1121/initlcd.h" +#endif +#ifndef DISABLE_ILI9320 + #include "tft_drivers/ili9320/initlcd.h" +#endif +#ifndef DISABLE_ILI9481 + #include "tft_drivers/ili9481/initlcd.h" +#endif +#ifndef DISABLE_S6D0164 + #include "tft_drivers/s6d0164/initlcd.h" +#endif +#ifndef DISABLE_ST7735S + #include "tft_drivers/st7735s/initlcd.h" +#endif +#ifndef DISABLE_ILI9341_S4P + #include "tft_drivers/ili9341/s4p/initlcd.h" +#endif +#ifndef DISABLE_ILI9341_S5P + #include "tft_drivers/ili9341/s5p/initlcd.h" +#endif +#ifndef DISABLE_R61581 + #include "tft_drivers/r61581/initlcd.h" +#endif +#ifndef DISABLE_ILI9486 + #include "tft_drivers/ili9486/initlcd.h" +#endif +#ifndef DISABLE_CPLD + #include "tft_drivers/cpld/initlcd.h" +#endif +#ifndef DISABLE_HX8353C + #include "tft_drivers/hx8353c/initlcd.h" +#endif + } + + sbi (P_CS, B_CS); + + setColor(0xffff); + setBackColor(0); + cfont.font=0; + _transparent = false; +} + +void UTFT::setXY(word x1, word y1, word x2, word y2) +{ + swap(word, x1, y1); + swap(word, x2, y2) + y1=disp_y_size-y1; + y2=disp_y_size-y2; + swap(word, y1, y2) + + switch(display_model) + { +#ifndef DISABLE_HX8347A + #include "tft_drivers/hx8347a/setxy.h" +#endif +#ifndef DISABLE_HX8352A + #include "tft_drivers/hx8352a/setxy.h" +#endif +#ifndef DISABLE_ILI9327 + #include "tft_drivers/ili9327/setxy.h" +#endif +#ifndef DISABLE_SSD1289 + #include "tft_drivers/ssd1289/setxy.h" +#endif +#ifndef DISABLE_ILI9325C + #include "tft_drivers/ili9325c/setxy.h" +#endif +#ifndef DISABLE_ILI9325D + #include "tft_drivers/ili9325d/default/setxy.h" +#endif +#ifndef DISABLE_ILI9325D_ALT + #include "tft_drivers/ili9325d/alt/setxy.h" +#endif +#ifndef DISABLE_HX8340B_8 + #include "tft_drivers/hx8340b/8/setxy.h" +#endif +#ifndef DISABLE_HX8340B_S + #include "tft_drivers/hx8340b/s/setxy.h" +#endif +#ifndef DISABLE_ST7735 + #include "tft_drivers/st7735/setxy.h" +#endif +#ifndef DISABLE_S1D19122 + #include "tft_drivers/s1d19122/setxy.h" +#endif +#ifndef DISABLE_PCF8833 + #include "tft_drivers/pcf8833/setxy.h" +#endif +#ifndef DISABLE_SSD1963_480 + #include "tft_drivers/ssd1963/480/setxy.h" +#endif +#ifndef DISABLE_SSD1963_800 + #include "tft_drivers/ssd1963/800/setxy.h" +#endif +#ifndef DISABLE_SSD1963_800_ALT + #include "tft_drivers/ssd1963/800alt/setxy.h" +#endif +#ifndef DISABLE_S6D1121 + #include "tft_drivers/s6d1121/setxy.h" +#endif +#ifndef DISABLE_ILI9320 + #include "tft_drivers/ili9320/setxy.h" +#endif +#ifndef DISABLE_ILI9481 + #include "tft_drivers/ili9481/setxy.h" +#endif +#ifndef DISABLE_S6D0164 + #include "tft_drivers/s6d0164/setxy.h" +#endif +#ifndef DISABLE_ST7735S + #include "tft_drivers/st7735s/setxy.h" +#endif +#ifndef DISABLE_ILI9341_S4P + #include "tft_drivers/ili9341/s4p/setxy.h" +#endif +#ifndef DISABLE_ILI9341_S5P + #include "tft_drivers/ili9341/s5p/setxy.h" +#endif +#ifndef DISABLE_R61581 + #include "tft_drivers/r61581/setxy.h" +#endif +#ifndef DISABLE_ILI9486 + #include "tft_drivers/ili9486/setxy.h" +#endif +#ifndef DISABLE_CPLD + #include "tft_drivers/cpld/setxy.h" +#endif +#ifndef DISABLE_HX8353C + #include "tft_drivers/hx8353c/setxy.h" +#endif + } +} + +void UTFT::clrXY() +{ + setXY(0,0,disp_y_size,disp_x_size); +} + +void UTFT::drawRect(int x1, int y1, int x2, int y2) +{ + if (x1>x2) + { + swap(int, x1, x2); + } + if (y1>y2) + { + swap(int, y1, y2); + } + + drawHLine(x1, y1, x2-x1); + drawHLine(x1, y2, x2-x1); + drawVLine(x1, y1, y2-y1); + drawVLine(x2, y1, y2-y1); +} + +void UTFT::drawRoundRect(int x1, int y1, int x2, int y2) +{ + if (x1>x2) + { + swap(int, x1, x2); + } + if (y1>y2) + { + swap(int, y1, y2); + } + if ((x2-x1)>4 && (y2-y1)>4) + { + drawPixel(x1+1,y1+1); + drawPixel(x2-1,y1+1); + drawPixel(x1+1,y2-1); + drawPixel(x2-1,y2-1); + drawHLine(x1+2, y1, x2-x1-4); + drawHLine(x1+2, y2, x2-x1-4); + drawVLine(x1, y1+2, y2-y1-4); + drawVLine(x2, y1+2, y2-y1-4); + } +} + +void UTFT::fillRect(int x1, int y1, int x2, int y2) +{ + if (x1>x2) + { + swap(int, x1, x2); + } + if (y1>y2) + { + swap(int, y1, y2); + } + if (display_transfer_mode==16) + { + cbi(P_CS, B_CS); + setXY(x1, y1, x2, y2); + sbi(P_RS, B_RS); + _fast_fill_16(fch,fcl,((long(x2-x1)+1)*(long(y2-y1)+1))); + sbi(P_CS, B_CS); + } + else if ((display_transfer_mode==8) and (fch==fcl)) + { + cbi(P_CS, B_CS); + setXY(x1, y1, x2, y2); + sbi(P_RS, B_RS); + _fast_fill_8(fch,((long(x2-x1)+1)*(long(y2-y1)+1))); + sbi(P_CS, B_CS); + } + else + { + + for (int i=0; i<((x2-x1)/2)+1; i++) + { + drawVLine(x1+i, y1, y2-y1); + drawVLine(x2-i, y1, y2-y1); + } + } +} + +void UTFT::fillRoundRect(int x1, int y1, int x2, int y2) +{ + if (x1>x2) + { + swap(int, x1, x2); + } + if (y1>y2) + { + swap(int, y1, y2); + } + + if ((x2-x1)>4 && (y2-y1)>4) + { + for (int i=0; i<((y2-y1)/2)+1; i++) + { + switch(i) + { + case 0: + drawHLine(x1+2, y1+i, x2-x1-4); + drawHLine(x1+2, y2-i, x2-x1-4); + break; + case 1: + drawHLine(x1+1, y1+i, x2-x1-2); + drawHLine(x1+1, y2-i, x2-x1-2); + break; + default: + drawHLine(x1, y1+i, x2-x1); + drawHLine(x1, y2-i, x2-x1); + } + } + } +} + +void UTFT::drawCircle(int x, int y, int radius) +{ + int f = 1 - radius; + int ddF_x = 1; + int ddF_y = -2 * radius; + int x1 = 0; + int y1 = radius; + + cbi(P_CS, B_CS); + setXY(x, y + radius, x, y + radius); + LCD_Write_DATA(fch,fcl); + setXY(x, y - radius, x, y - radius); + LCD_Write_DATA(fch,fcl); + setXY(x + radius, y, x + radius, y); + LCD_Write_DATA(fch,fcl); + setXY(x - radius, y, x - radius, y); + LCD_Write_DATA(fch,fcl); + + while(x1 < y1) + { + if(f >= 0) + { + y1--; + ddF_y += 2; + f += ddF_y; + } + x1++; + ddF_x += 2; + f += ddF_x; + setXY(x + x1, y + y1, x + x1, y + y1); + LCD_Write_DATA(fch,fcl); + setXY(x - x1, y + y1, x - x1, y + y1); + LCD_Write_DATA(fch,fcl); + setXY(x + x1, y - y1, x + x1, y - y1); + LCD_Write_DATA(fch,fcl); + setXY(x - x1, y - y1, x - x1, y - y1); + LCD_Write_DATA(fch,fcl); + setXY(x + y1, y + x1, x + y1, y + x1); + LCD_Write_DATA(fch,fcl); + setXY(x - y1, y + x1, x - y1, y + x1); + LCD_Write_DATA(fch,fcl); + setXY(x + y1, y - x1, x + y1, y - x1); + LCD_Write_DATA(fch,fcl); + setXY(x - y1, y - x1, x - y1, y - x1); + LCD_Write_DATA(fch,fcl); + } + sbi(P_CS, B_CS); + clrXY(); +} + +void UTFT::fillCircle(int x, int y, int radius) +{ + for(int y1=-radius; y1<=0; y1++) + for(int x1=-radius; x1<=0; x1++) + if(x1*x1+y1*y1 <= radius*radius) + { + drawHLine(x+x1, y+y1, 2*(-x1)); + drawHLine(x+x1, y-y1, 2*(-x1)); + break; + } +} + +void UTFT::clrScr() +{ + long i; + + cbi(P_CS, B_CS); + clrXY(); + if (display_transfer_mode!=1) + sbi(P_RS, B_RS); + if (display_transfer_mode==16) + _fast_fill_16(0,0,((disp_x_size+1)*(disp_y_size+1))); + else if (display_transfer_mode==8) + _fast_fill_8(0,((disp_x_size+1)*(disp_y_size+1))); + else + { + for (i=0; i<((disp_x_size+1)*(disp_y_size+1)); i++) + { + if (display_transfer_mode!=1) + LCD_Writ_Bus(0,0,display_transfer_mode); + else + { + LCD_Writ_Bus(1,0,display_transfer_mode); + LCD_Writ_Bus(1,0,display_transfer_mode); + } + } + } + sbi(P_CS, B_CS); +} + +void UTFT::fillScr(byte r, byte g, byte b) +{ + word color = ((r&248)<<8 | (g&252)<<3 | (b&248)>>3); + fillScr(color); +} + +void UTFT::fillScr(word color) +{ + long i; + char ch, cl; + + ch=byte(color>>8); + cl=byte(color & 0xFF); + + cbi(P_CS, B_CS); + clrXY(); + if (display_transfer_mode!=1) + sbi(P_RS, B_RS); + if (display_transfer_mode==16) + _fast_fill_16(ch,cl,((disp_x_size+1)*(disp_y_size+1))); + else if ((display_transfer_mode==8) and (ch==cl)) + _fast_fill_8(ch,((disp_x_size+1)*(disp_y_size+1))); + else + { + for (i=0; i<((disp_x_size+1)*(disp_y_size+1)); i++) + { + if (display_transfer_mode!=1) + LCD_Writ_Bus(ch,cl,display_transfer_mode); + else + { + LCD_Writ_Bus(1,ch,display_transfer_mode); + LCD_Writ_Bus(1,cl,display_transfer_mode); + } + } + } + sbi(P_CS, B_CS); +} + +void UTFT::setColor(byte r, byte g, byte b) +{ + fch=((r&248)|g>>5); + fcl=((g&28)<<3|b>>3); +} + +void UTFT::setColor(word color) +{ + fch=byte(color>>8); + fcl=byte(color & 0xFF); +} + +word UTFT::getColor() +{ + return (fch<<8) | fcl; +} + +void UTFT::setBackColor(byte r, byte g, byte b) +{ + bch=((r&248)|g>>5); + bcl=((g&28)<<3|b>>3); + _transparent=false; +} + +void UTFT::setBackColor(word color) +{ + bch=byte(color>>8); + bcl=byte(color & 0xFF); + _transparent=false; +} + +word UTFT::getBackColor() +{ + return (bch<<8) | bcl; +} + +void UTFT::setPixel(word color) +{ + LCD_Write_DATA((color>>8),(color&0xFF)); // rrrrrggggggbbbbb +} + +void UTFT::setPixel(char ch, char cl) +{ + LCD_Write_DATA(ch,cl); // rrrrrggggggbbbbb +} + +void UTFT::drawPixel(int x, int y) +{ + cbi(P_CS, B_CS); + setXY(x, y, x, y); + setPixel(fch, fcl); + sbi(P_CS, B_CS); + //clrXY(); +} + +void UTFT::drawLine(int x1, int y1, int x2, int y2) +{ + if (y1==y2) + drawHLine(x1, y1, x2-x1); + else if (x1==x2) + drawVLine(x1, y1, y2-y1); + else + { + unsigned int dx = (x2 > x1 ? x2 - x1 : x1 - x2); + short xstep = x2 > x1 ? 1 : -1; + unsigned int dy = (y2 > y1 ? y2 - y1 : y1 - y2); + short ystep = y2 > y1 ? 1 : -1; + int col = x1, row = y1; + + cbi(P_CS, B_CS); + if (dx < dy) + { + int t = - (dy >> 1); + while (true) + { + setXY (col, row, col, row); + LCD_Write_DATA (fch, fcl); + if (row == y2) + return; + row += ystep; + t += dx; + if (t >= 0) + { + col += xstep; + t -= dy; + } + } + } + else + { + int t = - (dx >> 1); + while (true) + { + setXY (col, row, col, row); + LCD_Write_DATA (fch, fcl); + if (col == x2) + return; + col += xstep; + t += dy; + if (t >= 0) + { + row += ystep; + t -= dx; + } + } + } + sbi(P_CS, B_CS); + } + clrXY(); +} + +void UTFT::drawHLine(int x, int y, int l) +{ + if (l<0) + { + l = -l; + x -= l; + } + cbi(P_CS, B_CS); + setXY(x, y, x+l, y); + if (display_transfer_mode == 16) + { + sbi(P_RS, B_RS); + _fast_fill_16(fch,fcl,l); + } + else if ((display_transfer_mode==8) and (fch==fcl)) + { + sbi(P_RS, B_RS); + _fast_fill_8(fch,l); + } + else + { + for (int i=0; i<l+1; i++) + { + LCD_Write_DATA(fch, fcl); + } + } + sbi(P_CS, B_CS); + clrXY(); +} + +void UTFT::drawVLine(int x, int y, int l) +{ + if (l<0) + { + l = -l; + y -= l; + } + cbi(P_CS, B_CS); + setXY(x, y, x, y+l); + if (display_transfer_mode == 16) + { + sbi(P_RS, B_RS); + _fast_fill_16(fch,fcl,l); + } + else if ((display_transfer_mode==8) and (fch==fcl)) + { + sbi(P_RS, B_RS); + _fast_fill_8(fch,l); + } + else + { + for (int i=0; i<l+1; i++) + { + LCD_Write_DATA(fch, fcl); + } + } + sbi(P_CS, B_CS); + clrXY(); +} + +size_t UTFT::write(byte c) +{ + byte i,ch; + word j; + word temp; + + if (c < ' ') { + if (c == '\r') { + m_x = 0; + } else if (c == '\n') { + m_y += cfont.y_size; + } + return 1; + } + + cbi(P_CS, B_CS); + + if (!_transparent) + { + temp=((c-cfont.offset)*((cfont.x_size/8)*cfont.y_size))+4; + + for(j=0;j<((cfont.x_size/8)*cfont.y_size);j+=(cfont.x_size/8)) + { + setXY(m_x,m_y+(j/(cfont.x_size/8)),m_x+cfont.x_size-1,m_y+(j/(cfont.x_size/8))); + for (int zz=(cfont.x_size/8)-1; zz>=0; zz--) + { + ch=pgm_read_byte(&cfont.font[temp+zz]); + for(i=0;i<8;i++) + { + if((ch&(1<<i))!=0) + { + setPixel(fch, fcl); + } + else + { + setPixel(bch, bcl); + } + } + } + temp+=(cfont.x_size/8); + } + } + else + { + temp=((c-cfont.offset)*((cfont.x_size/8)*cfont.y_size))+4; + for(j=0;j<cfont.y_size;j++) + { + for (int zz=0; zz<(cfont.x_size/8); zz++) + { + ch=pgm_read_byte(&cfont.font[temp+zz]); + for(i=0;i<8;i++) + { + setXY(m_x+i+(zz*8),m_y+j,m_x+i+(zz*8)+1,m_y+j+1); + + if((ch&(1<<(7-i)))!=0) + { + setPixel(fch, fcl); + } + } + } + temp+=(cfont.x_size/8); + } + } + + sbi(P_CS, B_CS); + clrXY(); + m_x += cfont.x_size; + return 1; +} + +void UTFT::setFont(uint8_t* font) +{ + cfont.font=font; + cfont.x_size=fontbyte(0); + cfont.y_size=fontbyte(1); + cfont.offset=fontbyte(2); + cfont.numchars=fontbyte(3); +} + +uint8_t* UTFT::getFont() +{ + return cfont.font; +} + +uint8_t UTFT::getFontXsize() +{ + return cfont.x_size; +} + +uint8_t UTFT::getFontYsize() +{ + return cfont.y_size; +} + +void UTFT::drawBitmap(int x, int y, int sx, int sy, bitmapdatatype data, int scale) +{ + unsigned int col; + int tx, ty, tc, tsx, tsy; + + if (scale==1) + { + cbi(P_CS, B_CS); + for (ty=0; ty<sy; ty++) + { + setXY(x, y+ty, x+sx-1, y+ty); + for (tx=sx-1; tx>=0; tx--) + { + col=pgm_read_word(&data[(ty*sx)+tx]); + LCD_Write_DATA(col>>8,col & 0xff); + } + } + sbi(P_CS, B_CS); + } + else + { + cbi(P_CS, B_CS); + for (ty=0; ty<sy; ty++) + { + for (tsy=0; tsy<scale; tsy++) + { + setXY(x, y+(ty*scale)+tsy, x+((sx*scale)-1), y+(ty*scale)+tsy); + for (tx=sx-1; tx>=0; tx--) + { + col=pgm_read_word(&data[(ty*sx)+tx]); + for (tsx=0; tsx<scale; tsx++) + LCD_Write_DATA(col>>8,col & 0xff); + } + } + } + sbi(P_CS, B_CS); + } + clrXY(); +} + +void UTFT::drawBitmap(int x, int y, int sx, int sy, bitmapdatatype data, int deg, int rox, int roy) +{ + unsigned int col; + int tx, ty, newx, newy; + double radian; + radian=deg*0.0175; + + if (deg==0) + drawBitmap(x, y, sx, sy, data); + else + { + cbi(P_CS, B_CS); + for (ty=0; ty<sy; ty++) + for (tx=0; tx<sx; tx++) + { + col=pgm_read_word(&data[(ty*sx)+tx]); + + newx=x+rox+(((tx-rox)*cos(radian))-((ty-roy)*sin(radian))); + newy=y+roy+(((ty-roy)*cos(radian))+((tx-rox)*sin(radian))); + + setXY(newx, newy, newx, newy); + LCD_Write_DATA(col>>8,col & 0xff); + } + sbi(P_CS, B_CS); + } + clrXY(); +} |