/** * Set your pins here * For 8-bit data bus, pins DB_8 to DB_15 are used. * * Teensy 3.0 pin definitions created by Dawnmist * http://forum.pjrc.com/threads/18002-Teensy-3-0-driving-an-SSD1289-with-utft?p=34719&viewfull=1#post34719 * * There's 3 alternative sets of pin definitions that can be used with the * Teensy 3 using this header file. Which one is used is controlled by setting * the PORTS define to one of "USE_C_D_PORTS", "USE_B_D_PORTS" or * "USE_USER_PORTS". * * For LCDs with 16 bit data busses: * * If PORTS = USE_B_D_PORTS: * - Port B 0-3,16-19 and Port D 0-7 will be used. This is slightly slower * than USE_C_D_PORTS, because we need to do the write to port B in 2 steps * (clear pins 0-3,16-19, then set those pins to match our data). Port D * access is still a single write. This means it takes 3 writes to the pins * instead of the 2 used in USE_C_D_PORTS - but it leaves the SPI port pins * available for use, so gives the fastest result when you need to use an * SD Card/something on the SPI bus as well. * Port D (0-7) = DB_8=2, DB_9=14, DB_10=7, DB_11=8, DB_12=6, DB_13=20, DB_14=21, DB_15=5 * Port B (0-3,16-19) = DB_0=16, DB_1=17, DB_2=19, DB_3=18, DB_4=0, DB_5=1, DB_6=32, DB_7=25 * * If PORTS = USE_C_D_PORTS: * - Port C 0-7 and Port D 0-7 will be used. Because these are the bottom * 8 pins of each port, we can write to them in one write cycle each. This * is the fastest screen data write - but Port C's pins conflict with the * SPI port, so you won't have access to hardware SPI. If you're using an * SD Card, you will *need* the hardware SPI. This setting should only be * used when hardware SPI is *not* needed. * Port D (0-7) = DB_8=2, DB_9=14, DB_10=7, DB_11=8, DB_12=6, DB_13=20, DB_14=21, DB_15=5 * Port C (0-7) = DB_0=15, DB_1=22, DB_2=23, DB_3=9, DB_4=10, DB_5=13, DB_6=11, DB_7=12 * * If PORTS = USE_USER_PORTS * - This allows you to define your own set of pins to use. Since we're not * collating them into groupings that can have their writes optimized, it * will take 16 write cycles to write out the data for one pixel. However, * it also gives you the most flexibility in which pins you use for the * LCD data bus. If high-speed/optimized data writes is not important to you * but simplicity of wiring layout is (or if the above options conflict with * something else you're using on the teensy), you can use this setting to * set the pins where-ever you'd like them to be. By default it's set to * pins DB0-DB15 = 0-15. You should modify the "DB_0" through to "DB_15" * defines to match the pins you wish to use. * * For LCDs with 8 bit data busses: * Use the pin defines for DB_8 to DB_15 to connect to your LCD. This puts them * on Port D in both the USE_C_D_PORTS and USE_B_D_PORTS settings, making those * two settings equivalent (and a single write to set the pins on the bus). */ #define USE_USER_PORTS 0 #define USE_C_D_PORTS 1 #define USE_B_D_PORTS 2 // SET WHICH PIN DEFINITIONS TO USE HERE // (only uncomment 1 of these 3 lines) // #define PORTS USE_B_D_PORTS //#define PORTS USE_C_D_PORTS //#define PORTS USE_USER_PORTS #if (PORTS == USE_USER_PORTS) #pragma message("Using user-defined pins") #define DB_0 0 #define DB_1 1 #define DB_2 2 #define DB_3 3 #define DB_4 4 #define DB_5 5 #define DB_6 6 #define DB_7 7 #define DB_8 8 #define DB_9 9 #define DB_10 10 #define DB_11 11 #define DB_12 12 #define DB_13 13 #define DB_14 14 #define DB_15 15 #elif (PORTS == USE_C_D_PORTS) #pragma message("Using Ports C&D - pins should be connected to:") #pragma message ("DB_0=15, DB_1=22, DB_2=23, DB_3=9, DB_4=10, DB_5=13, DB_6=11, DB_7=12") #pragma message ("DB_8=2, DB_9=14, DB_10=7, DB_11=8, DB_12=6, DB_13=20, DB_14=21, DB_15=5") #pragma message ("If using a display with an 8-bit bus, use connections to DB_8 to DB_15") #define DB_0 15 #define DB_1 22 #define DB_2 23 #define DB_3 9 #define DB_4 10 #define DB_5 13 #define DB_6 11 #define DB_7 12 #define DB_8 2 #define DB_9 14 #define DB_10 7 #define DB_11 8 #define DB_12 6 #define DB_13 20 #define DB_14 21 #define DB_15 5 #elif (PORTS == USE_B_D_PORTS) #pragma message("Using Ports B&D - pins should be connected to:") #if defined(__MK64FX512__) || defined(__MK66FX1M0__) #pragma message ("DB_0=16, DB_1=17, DB_2=19, DB_3=18, DB_4=0, DB_5=1, DB_6=29, DB_7=30") #else #pragma message ("DB_0=16, DB_1=17, DB_2=19, DB_3=18, DB_4=0, DB_5=1, DB_6=32, DB_7=25") #endif #pragma message ("DB_8=2, DB_9=14, DB_10=7, DB_11=8, DB_12=6, DB_13=20, DB_14=21, DB_15=5") #pragma message ("If using a display with an 8-bit bus, use connections to DB_8 to DB_15") #define DB_0 16 #define DB_1 17 #define DB_2 19 #define DB_3 18 #define DB_4 0 #define DB_5 1 #if defined(__MK64FX512__) || defined(__MK66FX1M0__) #define DB_6 29 #define DB_7 30 #else #define DB_6 32 #define DB_7 25 #endif #define DB_8 2 #define DB_9 14 #define DB_10 7 #define DB_11 8 #define DB_12 6 #define DB_13 20 #define DB_14 21 #define DB_15 5 #endif // *** Hardware specific functions *** void UTFT::_hw_special_init() { } void UTFT::LCD_Writ_Bus(char ch,char cl, byte mode) { switch (mode) { case 1: // Not implemented break; case 8: #if (PORTS == USE_C_D_PORTS) || (PORTS == USE_B_D_PORTS) *(volatile uint8_t *)(&GPIOD_PDOR) = ch; pulse_low(P_WR, B_WR); *(volatile uint8_t *)(&GPIOD_PDOR) = cl; pulse_low(P_WR, B_WR); #else ((ch & 0x80) != 0) ? digitalWriteFast(DB_15, HIGH) : digitalWriteFast(DB_15, LOW); ((ch & 0x40) != 0) ? digitalWriteFast(DB_14, HIGH) : digitalWriteFast(DB_14, LOW); ((ch & 0x20) != 0) ? digitalWriteFast(DB_13, HIGH) : digitalWriteFast(DB_13, LOW); ((ch & 0x10) != 0) ? digitalWriteFast(DB_12, HIGH) : digitalWriteFast(DB_12, LOW); ((ch & 0x08) != 0) ? digitalWriteFast(DB_11, HIGH) : digitalWriteFast(DB_11, LOW); ((ch & 0x04) != 0) ? digitalWriteFast(DB_10, HIGH) : digitalWriteFast(DB_10, LOW); ((ch & 0x02) != 0) ? digitalWriteFast(DB_9, HIGH) : digitalWriteFast(DB_9, LOW); ((ch & 0x01) != 0) ? digitalWriteFast(DB_8, HIGH) : digitalWriteFast(DB_8, LOW); pulse_low(P_WR, B_WR); ((cl & 0x80) != 0) ? digitalWriteFast(DB_15, HIGH) : digitalWriteFast(DB_15, LOW); ((cl & 0x40) != 0) ? digitalWriteFast(DB_14, HIGH) : digitalWriteFast(DB_14, LOW); ((cl & 0x20) != 0) ? digitalWriteFast(DB_13, HIGH) : digitalWriteFast(DB_13, LOW); ((cl & 0x10) != 0) ? digitalWriteFast(DB_12, HIGH) : digitalWriteFast(DB_12, LOW); ((cl & 0x08) != 0) ? digitalWriteFast(DB_11, HIGH) : digitalWriteFast(DB_11, LOW); ((cl & 0x04) != 0) ? digitalWriteFast(DB_10, HIGH) : digitalWriteFast(DB_10, LOW); ((cl & 0x02) != 0) ? digitalWriteFast(DB_9, HIGH) : digitalWriteFast(DB_9, LOW); ((cl & 0x01) != 0) ? digitalWriteFast(DB_8, HIGH) : digitalWriteFast(DB_8, LOW); pulse_low(P_WR, B_WR); #endif break; case 16: #if (PORTS == USE_C_D_PORTS) *(volatile uint8_t *)(&GPIOD_PDOR) = ch; *(volatile uint8_t *)(&GPIOC_PDOR) = cl; #elif (PORTS == USE_B_D_PORTS) *(volatile uint8_t *)(&GPIOD_PDOR) = ch; // clear data lines B0-3,B16-19 GPIOB_PCOR = 0x000F000F; // set data lines 0-3,16-19 if set in cl GPIOB_PSOR = (0x0F & cl) | ((cl >> 4) << 16); #else ((ch & 0x80) != 0) ? digitalWriteFast(DB_15, HIGH) : digitalWriteFast(DB_15, LOW); ((ch & 0x40) != 0) ? digitalWriteFast(DB_14, HIGH) : digitalWriteFast(DB_14, LOW); ((ch & 0x20) != 0) ? digitalWriteFast(DB_13, HIGH) : digitalWriteFast(DB_13, LOW); ((ch & 0x10) != 0) ? digitalWriteFast(DB_12, HIGH) : digitalWriteFast(DB_12, LOW); ((ch & 0x08) != 0) ? digitalWriteFast(DB_11, HIGH) : digitalWriteFast(DB_11, LOW); ((ch & 0x04) != 0) ? digitalWriteFast(DB_10, HIGH) : digitalWriteFast(DB_10, LOW); ((ch & 0x02) != 0) ? digitalWriteFast(DB_9, HIGH) : digitalWriteFast(DB_9, LOW); ((ch & 0x01) != 0) ? digitalWriteFast(DB_8, HIGH) : digitalWriteFast(DB_8, LOW); ((cl & 0x80) != 0) ? digitalWriteFast(DB_7, HIGH) : digitalWriteFast(DB_7, LOW); ((cl & 0x40) != 0) ? digitalWriteFast(DB_6, HIGH) : digitalWriteFast(DB_6, LOW); ((cl & 0x20) != 0) ? digitalWriteFast(DB_5, HIGH) : digitalWriteFast(DB_5, LOW); ((cl & 0x10) != 0) ? digitalWriteFast(DB_4, HIGH) : digitalWriteFast(DB_4, LOW); ((cl & 0x08) != 0) ? digitalWriteFast(DB_3, HIGH) : digitalWriteFast(DB_3, LOW); ((cl & 0x04) != 0) ? digitalWriteFast(DB_2, HIGH) : digitalWriteFast(DB_2, LOW); ((cl & 0x02) != 0) ? digitalWriteFast(DB_1, HIGH) : digitalWriteFast(DB_1, LOW); ((cl & 0x01) != 0) ? digitalWriteFast(DB_0, HIGH) : digitalWriteFast(DB_0, LOW); #endif pulse_low(P_WR, B_WR); break; } } void UTFT::_set_direction_registers(byte mode) { pinMode(DB_8, OUTPUT); pinMode(DB_9, OUTPUT); pinMode(DB_10, OUTPUT); pinMode(DB_11, OUTPUT); pinMode(DB_12, OUTPUT); pinMode(DB_13, OUTPUT); pinMode(DB_14, OUTPUT); pinMode(DB_15, OUTPUT); if (mode == 16) { pinMode(DB_0, OUTPUT); pinMode(DB_1, OUTPUT); pinMode(DB_2, OUTPUT); pinMode(DB_3, OUTPUT); pinMode(DB_4, OUTPUT); pinMode(DB_5, OUTPUT); pinMode(DB_6, OUTPUT); pinMode(DB_7, OUTPUT); } } void UTFT::_fast_fill_16(int ch, int cl, long pix) { long blocks; #if (PORTS == USE_C_D_PORTS) *(volatile uint8_t *)(&GPIOD_PDOR) = ch; *(volatile uint8_t *)(&GPIOC_PDOR) = cl; #elif (PORTS == USE_B_D_PORTS) *(volatile uint8_t *)(&GPIOD_PDOR) = ch; // clear data lines B0-3,B16-19 GPIOB_PCOR = 0x000F000F; // set data lines 0-3,16-19 if set in cl GPIOB_PSOR = (0x0F & cl) | ((cl >> 4) << 16); #else ((ch & 0x80) != 0) ? digitalWriteFast(DB_15, HIGH) : digitalWriteFast(DB_15, LOW); ((ch & 0x40) != 0) ? digitalWriteFast(DB_14, HIGH) : digitalWriteFast(DB_14, LOW); ((ch & 0x20) != 0) ? digitalWriteFast(DB_13, HIGH) : digitalWriteFast(DB_13, LOW); ((ch & 0x10) != 0) ? digitalWriteFast(DB_12, HIGH) : digitalWriteFast(DB_12, LOW); ((ch & 0x08) != 0) ? digitalWriteFast(DB_11, HIGH) : digitalWriteFast(DB_11, LOW); ((ch & 0x04) != 0) ? digitalWriteFast(DB_10, HIGH) : digitalWriteFast(DB_10, LOW); ((ch & 0x02) != 0) ? digitalWriteFast(DB_9, HIGH) : digitalWriteFast(DB_9, LOW); ((ch & 0x01) != 0) ? digitalWriteFast(DB_8, HIGH) : digitalWriteFast(DB_8, LOW); ((cl & 0x80) != 0) ? digitalWriteFast(DB_7, HIGH) : digitalWriteFast(DB_7, LOW); ((cl & 0x40) != 0) ? digitalWriteFast(DB_6, HIGH) : digitalWriteFast(DB_6, LOW); ((cl & 0x20) != 0) ? digitalWriteFast(DB_5, HIGH) : digitalWriteFast(DB_5, LOW); ((cl & 0x10) != 0) ? digitalWriteFast(DB_4, HIGH) : digitalWriteFast(DB_4, LOW); ((cl & 0x08) != 0) ? digitalWriteFast(DB_3, HIGH) : digitalWriteFast(DB_3, LOW); ((cl & 0x04) != 0) ? digitalWriteFast(DB_2, HIGH) : digitalWriteFast(DB_2, LOW); ((cl & 0x02) != 0) ? digitalWriteFast(DB_1, HIGH) : digitalWriteFast(DB_1, LOW); ((cl & 0x01) != 0) ? digitalWriteFast(DB_0, HIGH) : digitalWriteFast(DB_0, LOW); #endif blocks = pix/16; for (int i=0; i