This is a port of Henning Kralsen's UTFT library for Arduino/chipKIT to mbed, refactored to make full use of C inheritance and access control, in order to reduce work when implementing new drivers and at the same time make the code more readable and easier to maintain. As of now supported are SSD1289 (16-bit interface), HX8340-B (serial interface) and ST7735 (serial interface). Drivers for other controllers will be added as time and resources to acquire the displays to test the code permit.

Dependents:   UTFT_SSD1289

Fork of TFTLCD by Todor Todorov

Committer:
ttodorov
Date:
Sat Dec 01 19:38:53 2012 +0000
Revision:
0:881ff0b71102
Child:
1:14bef43daf6f
- first version of a standardized TFT library, which is to provide support for multiple LCD controllers and different data buses.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ttodorov 0:881ff0b71102 1 /*
ttodorov 0:881ff0b71102 2 * Copyright (C)2010-2012 Henning Karlsen. All right reserved.
ttodorov 0:881ff0b71102 3 * Copyright (C)2012 Todor Todorov.
ttodorov 0:881ff0b71102 4 *
ttodorov 0:881ff0b71102 5 * This library is free software; you can redistribute it and/or
ttodorov 0:881ff0b71102 6 * modify it under the terms of the GNU Lesser General Public
ttodorov 0:881ff0b71102 7 * License as published by the Free Software Foundation; either
ttodorov 0:881ff0b71102 8 * version 2.1 of the License, or (at your option) any later version.
ttodorov 0:881ff0b71102 9 *
ttodorov 0:881ff0b71102 10 * This library is distributed in the hope that it will be useful,
ttodorov 0:881ff0b71102 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ttodorov 0:881ff0b71102 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
ttodorov 0:881ff0b71102 13 * Lesser General Public License for more details.
ttodorov 0:881ff0b71102 14 *
ttodorov 0:881ff0b71102 15 * You should have received a copy of the GNU Lesser General Public
ttodorov 0:881ff0b71102 16 * License along with this library; if not, write to:
ttodorov 0:881ff0b71102 17 *
ttodorov 0:881ff0b71102 18 * Free Software Foundation, Inc.
ttodorov 0:881ff0b71102 19 * 51 Franklin St, 5th Floor, Boston, MA 02110-1301, USA
ttodorov 0:881ff0b71102 20 *
ttodorov 0:881ff0b71102 21 *********************************************************************/
ttodorov 0:881ff0b71102 22 #include "ssd.h"
ttodorov 0:881ff0b71102 23
ttodorov 0:881ff0b71102 24 #define pulseLow( pin ) pin = LOW; pin = HIGH
ttodorov 0:881ff0b71102 25 #define pulseHigh( pin ) pin = HIGH; pin = LOW
ttodorov 0:881ff0b71102 26
ttodorov 0:881ff0b71102 27 SSD1289LCD::SSD1289LCD( PinName CS, PinName RESET, PinName RS, PinName WR, BusOut* DATA_PORT, PinName RD )
ttodorov 0:881ff0b71102 28 : LCD( 239, 319, CS, RS ), _lcd_pin_reset( RESET ), _lcd_pin_wr( WR )
ttodorov 0:881ff0b71102 29 {
ttodorov 0:881ff0b71102 30 _lcd_port = DATA_PORT;
ttodorov 0:881ff0b71102 31 if ( RD != NC )
ttodorov 0:881ff0b71102 32 _lcd_pin_rd = new DigitalOut( RD );
ttodorov 0:881ff0b71102 33 else
ttodorov 0:881ff0b71102 34 _lcd_pin_rd = 0;
ttodorov 0:881ff0b71102 35
ttodorov 0:881ff0b71102 36 SetForeground();
ttodorov 0:881ff0b71102 37 SetBackground();
ttodorov 0:881ff0b71102 38 _font.font = 0;
ttodorov 0:881ff0b71102 39 }
ttodorov 0:881ff0b71102 40
ttodorov 0:881ff0b71102 41 void SSD1289LCD::Initialize( orientation_t orientation )
ttodorov 0:881ff0b71102 42 {
ttodorov 0:881ff0b71102 43 _orientation = orientation;
ttodorov 0:881ff0b71102 44
ttodorov 0:881ff0b71102 45 _lcd_pin_reset = HIGH;
ttodorov 0:881ff0b71102 46 wait_ms( 5 );
ttodorov 0:881ff0b71102 47 _lcd_pin_reset = LOW;
ttodorov 0:881ff0b71102 48 wait_ms( 15 );
ttodorov 0:881ff0b71102 49 _lcd_pin_reset = HIGH;
ttodorov 0:881ff0b71102 50 _lcd_pin_cs = HIGH;
ttodorov 0:881ff0b71102 51 if ( _lcd_pin_rd != 0 )
ttodorov 0:881ff0b71102 52 *_lcd_pin_rd = HIGH;
ttodorov 0:881ff0b71102 53 _lcd_pin_wr = HIGH;
ttodorov 0:881ff0b71102 54 wait_ms( 15 );
ttodorov 0:881ff0b71102 55
ttodorov 0:881ff0b71102 56
ttodorov 0:881ff0b71102 57 writeCmdData( 0x00, 0x0001 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 58 writeCmdData( 0x03, 0xA8A4 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 59 writeCmdData( 0x0C, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 60 writeCmdData( 0x0D, 0x080C ); wait_ms( 1 );
ttodorov 0:881ff0b71102 61 writeCmdData( 0x0E, 0x2B00 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 62 writeCmdData( 0x1E, 0x00B7 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 63 writeCmdData( 0x01, 0x2B3F ); wait_ms( 1 );
ttodorov 0:881ff0b71102 64 writeCmdData( 0x02, 0x0600 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 65 writeCmdData( 0x10, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 66 writeCmdData( 0x11, 0x6070 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 67 writeCmdData( 0x05, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 68 writeCmdData( 0x06, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 69 writeCmdData( 0x16, 0xEF1C ); wait_ms( 1 );
ttodorov 0:881ff0b71102 70 writeCmdData( 0x17, 0x0003 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 71 writeCmdData( 0x07, 0x0233 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 72 writeCmdData( 0x0B, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 73 writeCmdData( 0x0F, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 74 writeCmdData( 0x41, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 75 writeCmdData( 0x42, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 76 writeCmdData( 0x48, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 77 writeCmdData( 0x49, 0x013F ); wait_ms( 1 );
ttodorov 0:881ff0b71102 78 writeCmdData( 0x4A, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 79 writeCmdData( 0x4B, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 80 writeCmdData( 0x44, 0xEF00 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 81 writeCmdData( 0x45, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 82 writeCmdData( 0x46, 0x013F ); wait_ms( 1 );
ttodorov 0:881ff0b71102 83 writeCmdData( 0x30, 0x0707 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 84 writeCmdData( 0x31, 0x0204 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 85 writeCmdData( 0x32, 0x0204 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 86 writeCmdData( 0x33, 0x0502 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 87 writeCmdData( 0x34, 0x0507 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 88 writeCmdData( 0x35, 0x0204 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 89 writeCmdData( 0x36, 0x0204 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 90 writeCmdData( 0x37, 0x0502 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 91 writeCmdData( 0x3A, 0x0302 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 92 writeCmdData( 0x3B, 0x0302 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 93 writeCmdData( 0x23, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 94 writeCmdData( 0x24, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 95 writeCmdData( 0x25, 0x8000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 96 writeCmdData( 0x4f, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 97 writeCmdData( 0x4e, 0x0000 ); wait_ms( 1 );
ttodorov 0:881ff0b71102 98 writeCmd( 0x22 );
ttodorov 0:881ff0b71102 99 }
ttodorov 0:881ff0b71102 100
ttodorov 0:881ff0b71102 101 void SSD1289LCD::writeCmd( unsigned short cmd )
ttodorov 0:881ff0b71102 102 {
ttodorov 0:881ff0b71102 103 _lcd_pin_rs = LOW;
ttodorov 0:881ff0b71102 104 _lcd_pin_cs = LOW;
ttodorov 0:881ff0b71102 105 _lcd_port->write( cmd );
ttodorov 0:881ff0b71102 106 pulseLow( _lcd_pin_wr );
ttodorov 0:881ff0b71102 107 _lcd_pin_cs = HIGH;
ttodorov 0:881ff0b71102 108 }
ttodorov 0:881ff0b71102 109
ttodorov 0:881ff0b71102 110 void SSD1289LCD::writeData( unsigned short data )
ttodorov 0:881ff0b71102 111 {
ttodorov 0:881ff0b71102 112 _lcd_pin_rs = HIGH;
ttodorov 0:881ff0b71102 113 _lcd_pin_cs = LOW;
ttodorov 0:881ff0b71102 114 _lcd_port->write( data );
ttodorov 0:881ff0b71102 115 pulseLow( _lcd_pin_wr );
ttodorov 0:881ff0b71102 116 _lcd_pin_cs = HIGH;
ttodorov 0:881ff0b71102 117 }
ttodorov 0:881ff0b71102 118
ttodorov 0:881ff0b71102 119 void SSD1289LCD::setXY( uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2 )
ttodorov 0:881ff0b71102 120 {
ttodorov 0:881ff0b71102 121 if ( _orientation == LANDSCAPE )
ttodorov 0:881ff0b71102 122 {
ttodorov 0:881ff0b71102 123 swap( uint16_t, x1, y1 )
ttodorov 0:881ff0b71102 124 swap( uint16_t, x2, y2 )
ttodorov 0:881ff0b71102 125 y1 = _disp_height - y1;
ttodorov 0:881ff0b71102 126 y2 = _disp_height - y2;
ttodorov 0:881ff0b71102 127 swap( uint16_t, y1, y2 )
ttodorov 0:881ff0b71102 128 }
ttodorov 0:881ff0b71102 129
ttodorov 0:881ff0b71102 130 writeCmdData( 0x44, ( x2 << 8 ) + x1 );
ttodorov 0:881ff0b71102 131 writeCmdData( 0x45, y1 );
ttodorov 0:881ff0b71102 132 writeCmdData( 0x46, y2 );
ttodorov 0:881ff0b71102 133 writeCmdData( 0x4e, x1 );
ttodorov 0:881ff0b71102 134 writeCmdData( 0x4f, y1 );
ttodorov 0:881ff0b71102 135 writeCmd( 0x22 );
ttodorov 0:881ff0b71102 136 }