Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: GR-PEACH_TFTLCD_8bit
Fork of TFTLCD_8bit by
Diff: st7735.cpp
- Revision:
- 9:58b328831d0a
- Child:
- 10:69571adcfad5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/st7735.cpp Fri Dec 07 16:14:13 2012 +0000
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C)2010-2012 Henning Karlsen. All right reserved.
+ * Copyright (C)2012 Todor Todorov.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to:
+ *
+ * Free Software Foundation, Inc.
+ * 51 Franklin St, 5th Floor, Boston, MA 02110-1301, USA
+ *
+ *********************************************************************/
+#include "st7735.h"
+#include "helpers.h"
+
+ST7735_LCD::ST7735_LCD( PinName CS, PinName RESET, PinName RS, PinName SCL, PinName SDA, PinName BL )
+ : LCD( 128, 160, CS, RS, RESET ), _lcd_pin_scl( SCL ), _lcd_pin_sda( SDA )
+{
+ if ( BL != NC ) _lcd_pin_bl = new DigitalOut( BL );
+ else _lcd_pin_bl = 0;
+}
+
+void ST7735_LCD::Initialize( orientation_t orientation )
+{
+ _orientation = orientation;
+
+ wait_ms( 100 );
+ _lcd_pin_reset = HIGH;
+ wait_ms( 5 );
+ _lcd_pin_reset = LOW;
+ wait_ms( 15 );
+ _lcd_pin_reset = HIGH;
+ _lcd_pin_cs = HIGH;
+ _lcd_pin_rs = HIGH;
+ _lcd_pin_scl = HIGH;
+ _lcd_pin_sda = HIGH;
+ if ( _lcd_pin_bl != 0 )
+ *_lcd_pin_bl = HIGH;
+ wait_ms( 55 );
+
+ Activate();
+ WriteCmd( 0x01 ); // SW reset
+ wait_ms( 120 );
+
+ WriteCmd( 0x11 ); // sleep out
+ wait_ms( 120 );
+
+ WriteCmd( 0xB1 ); // frame control 1
+ WriteByteData( 0x01 );
+ WriteByteData( 0x2C );
+ WriteByteData( 0x2D );
+ WriteCmd( 0xB2 ); // frame control 2
+ WriteByteData( 0x01 );
+ WriteByteData( 0x2C );
+ WriteByteData( 0x2D );
+ WriteCmd( 0xB3 ); // frame control 3
+ WriteByteData( 0x01 );
+ WriteByteData( 0x2C );
+ WriteByteData( 0x2D );
+ WriteByteData( 0x01 );
+ WriteByteData( 0x2C );
+ WriteByteData( 0x2D );
+
+ WriteCmd( 0xB4 ); // column inversion
+ WriteByteData( 0x07 );
+
+ // ST7735R Power Sequence
+ WriteCmd( 0xC0 ); // power control 1
+ WriteByteData( 0xA2 );
+ WriteByteData( 0x02 );
+ WriteByteData( 0x84 );
+ WriteCmd( 0xC1 ); // power control 2
+ WriteByteData( 0xC5 );
+ WriteCmd( 0xC2 ); // power control 3
+ WriteByteData( 0x0A );
+ WriteByteData( 0x00 );
+ WriteCmd( 0xC3 ); // power control 4
+ WriteByteData( 0x8A );
+ WriteByteData( 0x2A );
+ WriteCmd( 0xC4 ); // power control 5
+ WriteByteData( 0x8A );
+ WriteByteData( 0xEE );
+
+ WriteCmd( 0xC5 ); // voltage control 1
+ WriteByteData( 0x0E );
+
+ WriteCmd( 0x36 ); //MX, MY, RGB mode
+ WriteByteData( 0xC8 );
+
+ // ST7735R Gamma Sequence
+ WriteCmd( 0xE0 ); // gamma positive
+ WriteByteData( 0x0F );
+ WriteByteData( 0x1A );
+ WriteByteData( 0x0F );
+ WriteByteData( 0x18 );
+ WriteByteData( 0x2F );
+ WriteByteData( 0x28 );
+ WriteByteData( 0x20 );
+ WriteByteData( 0x22 );
+ WriteByteData( 0x1F );
+ WriteByteData( 0x1B );
+ WriteByteData( 0x23 );
+ WriteByteData( 0x37 );
+ WriteByteData( 0x00 );
+ WriteByteData( 0x07 );
+ WriteByteData( 0x02 );
+ WriteByteData( 0x10 );
+ WriteCmd( 0xE1 ); // gamma negative
+ WriteByteData( 0x0F );
+ WriteByteData( 0x1B );
+ WriteByteData( 0x0F );
+ WriteByteData( 0x17 );
+ WriteByteData( 0x33 );
+ WriteByteData( 0x2C );
+ WriteByteData( 0x29 );
+ WriteByteData( 0x2E );
+ WriteByteData( 0x30 );
+ WriteByteData( 0x30 );
+ WriteByteData( 0x39 );
+ WriteByteData( 0x3F );
+ WriteByteData( 0x00 );
+ WriteByteData( 0x07 );
+ WriteByteData( 0x03 );
+ WriteByteData( 0x10 );
+
+ WriteCmd( 0x2A ); // set column address
+ WriteByteData( 0x00 );
+ WriteByteData( 0x00 );
+ WriteByteData( 0x00 );
+ WriteByteData( 0x7F );
+ WriteCmd( 0x2B ); // set row address
+ WriteByteData( 0x00 );
+ WriteByteData( 0x00 );
+ WriteByteData( 0x00 );
+ WriteByteData( 0x9F );
+
+ WriteCmd( 0xF0 ); // enable extensions command
+ WriteByteData( 0x01 );
+ WriteCmd( 0xF6 ); // disable ram power save mode
+ WriteByteData( 0x00 );
+
+ WriteCmd( 0x3A ); // interface pixel format (color mode)
+ WriteByteData( 0x05 ); // 65k mode
+ WriteCmd( 0x29 ); // display on
+
+ Deactivate();
+}
+
+void ST7735_LCD::Sleep( void )
+{
+ Activate();
+ WriteCmd( 0x28 );
+ wait_ms( 10 );
+ WriteCmd( 0x10 );
+ wait_ms( 125 );
+ if ( _lcd_pin_bl != 0 )
+ *_lcd_pin_bl = LOW;
+ Deactivate();
+}
+
+void ST7735_LCD::WakeUp( void )
+{
+ Activate();
+ WriteCmd( 0x29 );
+ wait_ms( 10 );
+ WriteCmd( 0x11 );
+ wait_ms( 125 );
+ if ( _lcd_pin_bl != 0 )
+ *_lcd_pin_bl = HIGH;
+ Deactivate();
+}
+
+void ST7735_LCD::WriteCmd( unsigned short cmd )
+{
+ _lcd_pin_rs = LOW;
+ serializeByte( cmd & 0xFF );
+}
+
+void ST7735_LCD::WriteData( unsigned short data )
+{
+ _lcd_pin_rs = HIGH;
+ serializeByte( ( data >> 8 ) & 0xFF );
+ serializeByte( data & 0xFF );
+}
+
+void ST7735_LCD::WriteByteData( unsigned char data )
+{
+ _lcd_pin_rs = HIGH;
+ serializeByte( data );
+}
+
+void ST7735_LCD::SetXY( uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2 )
+{
+ if ( _orientation == LANDSCAPE )
+ {
+ swap( uint16_t, x1, y1 )
+ swap( uint16_t, x2, y2 )
+ y1 = _disp_height - y1;
+ y2 = _disp_height - y2;
+ swap( uint16_t, y1, y2 )
+ }
+
+ WriteCmdData( 0x2a, x1 );
+ WriteData( x2 );
+ WriteCmdData( 0x2b, y1 );
+ WriteData( y2 );
+ WriteCmd( 0x2c );
+}
+
+void ST7735_LCD::serializeByte( unsigned char data )
+{
+ for ( int i = 0; i < 8; i++ )
+ {
+ if ( data & 0x80 ) _lcd_pin_sda = HIGH;
+ else _lcd_pin_sda = LOW;
+ pulseLow( _lcd_pin_scl );
+ data = data << 1;
+ }
+}
