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.
Diff: LCD/LCD_HX8347/HX8347.cpp
- Revision:
- 0:7f36c2de1de6
diff -r 000000000000 -r 7f36c2de1de6 LCD/LCD_HX8347/HX8347.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/LCD/LCD_HX8347/HX8347.cpp Fri Mar 22 03:47:24 2019 +0000
@@ -0,0 +1,315 @@
+/**********************************************************************************************
+ Copyright (c) 2014 DisplayModule. All rights reserved.
+
+ Redistribution and use of this source code, part of this source code or any compiled binary
+ based on this source code is permitted as long as the above copyright notice and following
+ disclaimer is retained.
+
+ DISCLAIMER:
+ THIS SOFTWARE IS SUPPLIED "AS IS" WITHOUT ANY WARRANTIES AND SUPPORT. DISPLAYMODULE ASSUMES
+ NO RESPONSIBILITY OR LIABILITY FOR THE USE OF THE SOFTWARE.
+ ********************************************************************************************/
+
+//Tested on NUCLEO-F401RE, LPCXpresso11U68, LPCXpresso824-MAX platform.
+
+#include "HX8347.h"
+
+
+
+#define HX8347_DEVICE_ID 0x47
+
+HX8347::HX8347(PinName cs, PinName dc, PinName mosi, PinName miso, PinName clk)
+:GraphicsDisplay("HX8347"), spi(mosi, miso, clk)
+{
+ _cs = cs;
+ _dc = dc;
+}
+
+HX8347::HX8347(PinName cs, PinName dc, PinName mosi, PinName miso, PinName clk,PinName bl)
+:GraphicsDisplay("HX8347"), spi(mosi, miso, clk)
+{
+ _cs = cs;
+ _dc = dc;
+ _bl = bl;
+}
+
+HX8347::~HX8347() {
+delete _pinCS;
+delete _pinDC;
+
+_pinCS = NULL;
+_pinDC = NULL;
+_pinBL = NULL;
+}
+
+
+
+
+uint8_t HX8347::read8BitData(uint8_t address)
+{
+ cbi(_pinDC, _bitmaskDC);
+ spi.write(0x00);
+ sbi(_pinDC, _bitmaskDC);
+ return spi.write(address) & 0xff;
+}
+
+bool HX8347::isConnect()
+{
+ if(getDeviceID() == HX8347_DEVICE_ID)
+ return true;
+ return false;
+}
+
+uint8_t HX8347::getDeviceID()
+{
+ uint8_t temp;
+ cbi(_pinCS, _bitmaskCS);
+ temp = read8BitData(0x00);
+ sbi(_pinCS, _bitmaskCS);
+ return temp;
+}
+
+void HX8347::writeBus(uint8_t data) {
+ spi.write(data);
+}
+
+void HX8347::sendCommand(uint8_t index) {
+ cbi(_pinDC, _bitmaskDC);
+ writeBus(index);
+}
+
+void HX8347::send8BitData(uint8_t data) {
+ sbi(_pinDC, _bitmaskDC);
+ writeBus(data);
+}
+
+void HX8347::sendData(uint16_t data) {
+ uint8_t dh = data>>8;
+ uint8_t dl = data&0xff;
+
+ sbi(_pinDC, _bitmaskDC);
+ writeBus(dh);
+ writeBus(dl);
+}
+
+void HX8347::setAddress(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
+ wr_reg(0x03, x0 );
+ wr_reg(0x02, (x0 >> 8));
+ wr_reg(0x05, x0+x1-1 );
+ wr_reg(0x04, ((x0+x1-1) >> 8));
+ wr_reg(0x07, y0 );
+ wr_reg(0x06, ( y0 >> 8));
+ wr_reg(0x09, ( y0+y1-1 ));
+ wr_reg(0x08, ( (y0+y1-1) >> 8));
+ sendCommand(0x22);
+}
+
+void HX8347::wr_reg(uint8_t address,uint8_t value)
+{
+ sendCommand(address);
+ sendData(value);
+}
+
+int HX8347::width()
+{
+ return 240;
+}
+
+int HX8347::height()
+{
+ return 320;
+}
+
+void HX8347::drawChar(uint16_t x, uint16_t y, char c, uint16_t color, uint8_t size)
+{
+ cbi(_pinCS, _bitmaskCS);
+ // for (uint8_t i =0; i<5; i++ ) {
+ // //uint8_t line = pgm_read_byte(font_+(c*5)+i);
+ // for (uint8_t j = 0; j<8; j++) {
+ // if (line & 0x1) {
+ // pixel(x+i, y+j, color);
+ // }
+ // line >>= 1;
+ // }
+ // }
+ sbi(_pinCS, _bitmaskCS);
+}
+
+void HX8347::drawchar(int x,int y,int value,int color)
+{
+ cbi(_pinCS, _bitmaskCS);
+ character_(x,y,value - 32,color);
+ sbi(_pinCS, _bitmaskCS);
+}
+
+void HX8347::drawString(uint16_t x, uint16_t y, const char *p,int color)
+{
+ //cbi(_pinCS, _bitmaskCS);
+ while(*p!='\0')
+ {
+ if(x > (width() - FONT_CHAR_WIDTH)) {
+ x = 0;
+ y += FONT_CHAR_HEIGHT;
+ }
+ if(y > (height() - FONT_CHAR_HEIGHT)) {
+ y = x = 0;
+ }
+ //drawChar(x, y, *p, false);
+ drawchar(x,y,*p,color);
+
+ x += FONT_CHAR_WIDTH;
+ //drawchar(x,y,'j');
+ p++;
+ }
+ //sbi(_pinCS, _bitmaskCS);
+}
+
+void HX8347::pixel(int x, int y, int colour)
+{
+ wr_reg(0x03, (x >> 0));
+ wr_reg(0x02, (x >> 8));
+ wr_reg(0x07, (y >> 0));
+ wr_reg(0x06, (y >> 8));
+ sendCommand(0x22);
+ sendData(colour);
+}
+
+void HX8347::clearScreenArea(int x,int y,int color)
+{
+ int pos,t;
+ cbi(_pinCS, _bitmaskCS);
+ for(x ;x < width();x+= FONT_CHAR_WIDTH)
+ {
+ for(pos=0;pos<FONT_CHAR_HEIGHT;pos++) {
+ for(t=0;t<FONT_CHAR_WIDTH;t++) {
+ pixel(x + t,y + pos,color);
+ }
+ }
+ }
+ sbi(_pinCS, _bitmaskCS);
+}
+
+void HX8347::window(unsigned int x,unsigned int y,unsigned int w,unsigned int h)
+{
+ setAddress(x,y,w,h);
+}
+
+void HX8347::clearScreen(uint16_t color)
+{
+ cbi(_pinCS, _bitmaskCS);
+ setAddress(0,0,width(), height());
+ for(uint16_t i=0; i<height(); i++) {
+ for(uint16_t j=0; j<width(); j++) {
+ sendData(color);
+ }
+ }
+ sbi(_pinCS, _bitmaskCS);
+}
+
+void HX8347::init(void) {
+ //setTextColor(BLACK, WHITE);
+ //
+ _pinBL = new DigitalOut(_bl);
+ _pinCS = new DigitalOut(_cs);
+ _pinDC = new DigitalOut(_dc);
+
+ sbi(_pinCS, _bitmaskCS);
+ //light on
+ sbi(_pinBL,_bitmaskCS);
+ spi.format(8,0);
+ spi.frequency(8000000); // Max SPI speed for display is 10 and for 17 for LPC15xx
+
+ cbi(_pinCS, _bitmaskCS);
+ delay(135); // This much delay needed??
+
+ // ILI9341 init
+ wr_reg(0xEA, 0x00); /* Reset Power Control 1 */
+ wr_reg(0xEB, 0x20); /* Power Control 2 */
+ wr_reg(0xEC, 0x0C); /* Power Control 3 */
+ wr_reg(0xED, 0xC4); /* Power Control 4 */
+ wr_reg(0xE8, 0x40); /* Source OPON_N */
+ wr_reg(0xE9, 0x38); /* Source OPON_I */
+ wr_reg(0xF1, 0x01); /* */
+ wr_reg(0xF2, 0x10); /* */
+ wr_reg(0x27, 0xA3); /* Display Control 2 */
+
+ /* Power On sequence ---------------------------------------------------------*/
+ wr_reg(0x1B, 0x1B); /* Power Control 2 */
+ wr_reg(0x1A, 0x01); /* Power Control 1 */
+ wr_reg(0x24, 0x2F); /* Vcom Control 2 */
+ wr_reg(0x25, 0x57); /* Vcom Control 3 */
+ wr_reg(0x23, 0x8D); /* Vcom Control 1 */
+
+ /* Gamma settings -----------------------------------------------------------*/
+ wr_reg(0x40,0x00); // default setup
+ wr_reg(0x41,0x00); //
+ wr_reg(0x42,0x01); //
+ wr_reg(0x43,0x13); //
+ wr_reg(0x44,0x10); //
+ wr_reg(0x45,0x26); //
+ wr_reg(0x46,0x08); //
+ wr_reg(0x47,0x51); //
+ wr_reg(0x48,0x02); //
+ wr_reg(0x49,0x12); //
+ wr_reg(0x4A,0x18); //
+ wr_reg(0x4B,0x19); //
+ wr_reg(0x4C,0x14); //
+ wr_reg(0x50,0x19); //
+ wr_reg(0x51,0x2F); //
+ wr_reg(0x52,0x2C); //
+ wr_reg(0x53,0x3E); //
+ wr_reg(0x54,0x3F); //
+ wr_reg(0x55,0x3F); //
+ wr_reg(0x56,0x2E); //
+ wr_reg(0x57,0x77); //
+ wr_reg(0x58,0x0B); //
+ wr_reg(0x59,0x06); //
+ wr_reg(0x5A,0x07); //
+ wr_reg(0x5B,0x0D); //
+ wr_reg(0x5C,0x1D); //
+ wr_reg(0x5D,0xCC); //
+
+ /* Power + Osc ---------------------------------------------------------------*/
+ wr_reg(0x18, 0x36); /* OSC Control 1 */
+ wr_reg(0x19, 0x01); /* OSC Control 2 */
+ wr_reg(0x01, 0x00); /* Display Mode Control */
+ wr_reg(0x1F, 0x88); /* Power Control 6 */
+ wait_ms(5); /* Delay 5 ms */
+ wr_reg(0x1F, 0x80); /* Power Control 6 */
+ wait_ms(5); /* Delay 5 ms */
+ wr_reg(0x1F, 0x90); /* Power Control 6 */
+ wait_ms(5); /* Delay 5 ms */
+ wr_reg(0x1F, 0xD0); /* Power Control 6 */
+ wait_ms(5); /* Delay 5 ms */
+
+ wr_reg(0x17, 0x05); /* Colmod 16Bit/Pixel */
+
+ wr_reg(0x36, 0x00); /* Panel Characteristic */
+ wr_reg(0x28, 0x38); /* Display Control 3 */
+ wait_ms(40);
+ wr_reg(0x28, 0x3C); /* Display Control 3 */
+ delay(50);
+
+ /*Set Display area*/
+ wr_reg(0x02,0x00);
+ wr_reg(0x03,0x00); //Column Start
+ wr_reg(0x04,0x00);
+ wr_reg(0x05,0xEF); //Column End
+ wr_reg(0x06,0x00);
+ wr_reg(0x07,0x00); //Row Start
+ wr_reg(0x08,0x01);
+ wr_reg(0x09,0x3F); //Row End
+
+ sbi(_pinCS, _bitmaskCS);
+ clearScreen(WHITE);
+}
+
+
+
+
+/*********************************************************************************************************
+ END FILE
+*********************************************************************************************************/
+
+
+