Interface for Sharp LS012B7DD01 TFT-LCD

Dependents:   MAX32630FTHR_iButton_uSD_Logger

Revision:
0:a857326491e8
Child:
1:ea88fe2c73ed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Sharp_LS012B7DD01.cpp	Sat Nov 19 20:34:01 2016 -0800
@@ -0,0 +1,312 @@
+/*******************************************************************************
+* The MIT License (MIT)
+*
+* Copyright (c) 2016 j3
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy 
+* of this software and associated documentation files (the "Software"), to deal
+* in the Software without restriction, including without limitation the rights 
+* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
+* copies of the Software, and to permit persons to whom the Software is 
+* furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in 
+* all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
+* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
+* SOFTWARE.
+******************************************************************************/
+
+
+#include "Sharp_LS012B7DD01.h"
+
+extern Serial term;
+
+//5x7 character bit map
+static const uint8_t font_5x7[95][6] = {
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //SPACE
+	{0x00, 0x00, 0x00, 0xf2, 0x00, 0x00}, //!
+	{0x00, 0x00, 0xe0, 0x00, 0xe0, 0x00}, //"
+	{0x00, 0x28, 0xfe, 0x28, 0xfe, 0x28}, //#
+	{0x00, 0x24, 0x54, 0xfe, 0x54, 0x48}, //$
+	{0x00, 0xc4, 0xc8, 0x10, 0x26, 0x46}, //%
+	{0x00, 0x6c, 0x92, 0xaa, 0x44, 0x0a}, //&
+	{0x00, 0x00, 0xa0, 0xc0, 0x00, 0x00}, //'
+	{0x00, 0x00, 0x38, 0x44, 0x82, 0x00}, //(
+	{0x00, 0x00, 0x82, 0x44, 0x38, 0x00}, //)
+	{0x00, 0x28, 0x10, 0x7c, 0x10, 0x28}, //*
+	{0x00, 0x10, 0x10, 0x7c, 0x10, 0x10}, //+
+	{0x00, 0x00, 0x0a, 0x0c, 0x00, 0x00}, //,
+	{0x00, 0x10, 0x10, 0x10, 0x10, 0x10}, //-
+	{0x00, 0x00, 0x06, 0x06, 0x00, 0x00}, //.
+	{0x00, 0x04, 0x08, 0x10, 0x20, 0x40}, ///
+	{0x00, 0x7c, 0x8a, 0x92, 0xa2, 0x7c}, //0
+	{0x00, 0x00, 0x42, 0xfe, 0x02, 0x00}, //1
+	{0x00, 0x42, 0x86, 0x8a, 0x92, 0x62}, //2
+	{0x00, 0x84, 0x82, 0xa2, 0xd2, 0x8c}, //3
+	{0x00, 0x18, 0x28, 0x48, 0xfe, 0x08}, //4
+	{0x00, 0xe4, 0xa2, 0xa2, 0xa2, 0x9c}, //5
+	{0x00, 0x3c, 0x52, 0x92, 0x92, 0x0c}, //6
+	{0x00, 0x80, 0x8e, 0x90, 0xa0, 0xc0}, //7
+	{0x00, 0x6c, 0x92, 0x92, 0x92, 0x6c}, //8
+	{0x00, 0x60, 0x92, 0x92, 0x94, 0x78}, //9
+	{0x00, 0x6c, 0x6c, 0x00, 0x00, 0x00}, //:
+	{0x00, 0x6a, 0x6c, 0x00, 0x00, 0x00}, //;
+	{0x00, 0x10, 0x28, 0x44, 0x82, 0x00}, //<
+	{0x00, 0x28, 0x28, 0x28, 0x28, 0x28}, //=
+	{0x00, 0x00, 0x82, 0x44, 0x28, 0x10}, //>
+	{0x00, 0x40, 0x80, 0x8a, 0x90, 0x60}, //?
+	{0x00, 0x0c, 0x92, 0x9e, 0x82, 0x7c}, //@
+	{0x00, 0x7e, 0x88, 0x88, 0x88, 0x7e}, //A
+	{0x00, 0xfe, 0x92, 0x92, 0x92, 0x6c}, //B
+	{0x00, 0x7c, 0x82, 0x82, 0x82, 0x44}, //C
+	{0x00, 0xfe, 0x82, 0x82, 0x44, 0x38}, //D
+	{0x00, 0xfe, 0x92, 0x92, 0x92, 0x82}, //E
+	{0x00, 0xfe, 0x90, 0x90, 0x90, 0x80}, //F
+	{0x00, 0x7c, 0x82, 0x92, 0x92, 0x5e}, //G
+	{0x00, 0xfe, 0x10, 0x10, 0x10, 0xfe}, //H
+	{0x00, 0x00, 0x82, 0xfe, 0x82, 0x00}, //I
+	{0x00, 0x04, 0x02, 0x82, 0xfc, 0x80}, //J
+	{0x00, 0xfe, 0x10, 0x28, 0x44, 0x82}, //K
+	{0x00, 0xfe, 0x02, 0x02, 0x02, 0x02}, //L
+	{0x00, 0xfe, 0x40, 0x30, 0x40, 0xfe}, //M
+	{0x00, 0xfe, 0x20, 0x10, 0x08, 0xfe}, //N
+	{0x00, 0x7c, 0x82, 0x82, 0x82, 0x7c}, //O
+	{0x00, 0xfe, 0x90, 0x90, 0x90, 0x60}, //P
+	{0x00, 0x7c, 0x82, 0x8a, 0x84, 0x7a}, //Q
+	{0x00, 0xfe, 0x90, 0x98, 0x94, 0x62}, //R
+	{0x00, 0x62, 0x92, 0x92, 0x92, 0x8c}, //S
+	{0x00, 0x80, 0x80, 0xfe, 0x80, 0x80}, //T
+	{0x00, 0xfc, 0x02, 0x02, 0x02, 0xfc}, //U
+	{0x00, 0xf8, 0x04, 0x02, 0x04, 0xf8}, //V
+	{0x00, 0xfc, 0x02, 0x0c, 0x02, 0xfc}, //W
+	{0x00, 0xc6, 0x28, 0x10, 0x28, 0xc6}, //X
+	{0x00, 0xe0, 0x10, 0x0e, 0x10, 0xe0}, //Y
+	{0x00, 0x86, 0x8a, 0x92, 0xa2, 0xc2}, //Z
+	{0x00, 0x00, 0xfe, 0x82, 0x82, 0x00}, //[
+	{0x00, 0x40, 0x20, 0x10, 0x08, 0x04}, //backslash
+	{0x00, 0x00, 0x82, 0x82, 0xfe, 0x00}, //]
+	{0x00, 0x20, 0x40, 0x80, 0x40, 0x20}, //^
+	{0x00, 0x02, 0x02, 0x02, 0x02, 0x02}, //_
+	{0x00, 0x00, 0x80, 0x40, 0x20, 0x00}, //`
+	{0x00, 0x04, 0x2a, 0x2a, 0x2a, 0x1e}, //a
+	{0x00, 0xfe, 0x0a, 0x12, 0x12, 0x0c}, //b
+	{0x00, 0x1c, 0x22, 0x22, 0x22, 0x04}, //c
+	{0x00, 0x1c, 0x22, 0x22, 0x12, 0xfe}, //d
+	{0x00, 0x1c, 0x2a, 0x2a, 0x2a, 0x18}, //e
+	{0x00, 0x10, 0x7e, 0x90, 0x80, 0x40}, //f
+	{0x00, 0x30, 0x4a, 0x4a, 0x4a, 0x7c}, //g
+	{0x00, 0xfe, 0x10, 0x20, 0x20, 0x1e}, //h
+	{0x00, 0x00, 0x22, 0xbe, 0x02, 0x00}, //i
+	{0x00, 0x04, 0x02, 0x22, 0xbc, 0x00}, //j
+	{0x00, 0xfe, 0x08, 0x14, 0x22, 0x00}, //k
+	{0x00, 0x00, 0x82, 0xfe, 0x02, 0x00}, //l
+	{0x00, 0x1e, 0x20, 0x1a, 0x22, 0x1e}, //m
+	{0x00, 0x3e, 0x10, 0x20, 0x20, 0x1e}, //n
+	{0x00, 0x1c, 0x22, 0x22, 0x22, 0x1c}, //o
+	{0x00, 0x3e, 0x28, 0x28, 0x28, 0x10}, //p
+	{0x00, 0x10, 0x28, 0x28, 0x18, 0x3e}, //q
+	{0x00, 0x3e, 0x10, 0x20, 0x20, 0x10}, //r
+	{0x00, 0x12, 0x2a, 0x2a, 0x2a, 0x04}, //s
+	{0x00, 0x20, 0xfc, 0x22, 0x02, 0x04}, //t
+	{0x00, 0x3c, 0x02, 0x02, 0x04, 0x3e}, //u
+	{0x00, 0x38, 0x04, 0x02, 0x04, 0x38}, //v
+	{0x00, 0x3c, 0x02, 0x0c, 0x02, 0x3c}, //w
+	{0x00, 0x22, 0x14, 0x08, 0x14, 0x22}, //x
+	{0x00, 0x30, 0x0a, 0x0a, 0x0a, 0x3c}, //y
+	{0x00, 0x22, 0x26, 0x2a, 0x32, 0x22}, //z
+	{0x00, 0x00, 0x10, 0x6c, 0x82, 0x00}, //{
+	{0x00, 0x00, 0x00, 0xfe, 0x00, 0x00}, //|
+	{0x00, 0x00, 0x82, 0x6c, 0x10, 0x00}, //}
+	{0x00, 0x30, 0x40, 0x30, 0x08, 0x30}  //~
+};
+
+/*****************************************************************************/
+SharpLS012B7DD01::SharpLS012B7DD01(PinName disp, PinName extcomin, PinName cs, PinName mosi, PinName sclk)
+:m_disp(disp, 0), m_extcomin(extcomin, 0), m_cs(cs, 0), m_spi(mosi, NC, sclk)
+{
+	update(SharpLS012B7DD01::ALL_CLEAR_MODE);
+	m_disp = !m_disp;
+	wait_us(30);
+	m_extcominTicker.attach(callback(this, &SharpLS012B7DD01::toggle_extcomin), 0.016);
+}
+
+
+/*****************************************************************************/
+SharpLS012B7DD01::~SharpLS012B7DD01()
+{
+}
+
+/*****************************************************************************/
+SharpLS012B7DD01::SharpCmdResult SharpLS012B7DD01::print_char(uint8_t ln, uint8_t pos, char c)
+{
+	SharpLS012B7DD01::SharpCmdResult rtnVal = SharpLS012B7DD01::Failure;
+	
+	uint8_t char_buff[6];
+	memcpy(char_buff, &(font_5x7[c - 0x20][0]), 6);
+	
+	if((ln < 4) && (pos < 30))
+	{
+		ln = ((ln * 8) + 4);
+		pos = ((pos * 6) + 2);
+		
+		uint8_t temp;
+		for(uint8_t c_bit = 0; c_bit < 8; c_bit++)
+		{
+			temp = 0;
+			for(uint8_t c_byte = 0; c_byte < 6; c_byte++)
+			{
+				if(((1 << (7 - c_bit)) & char_buff[c_byte]))
+				{
+					temp |= (1 << c_byte);
+				}
+			}
+			
+			//display is active low
+			temp = ~temp;
+			
+			if((pos % 8) == 0)
+			{
+				if(pos)
+				{
+					m_data[ln + c_bit][pos/8] &= ~(0x3F);
+					m_data[ln + c_bit][pos/8] |= temp;
+				}
+				else
+				{
+					m_data[ln + c_bit][0] &= ~(0x3F);
+					m_data[ln + c_bit][0] |= temp;
+				}
+			}
+			else
+			{
+				m_data[ln + c_bit][pos/8] &= ~(0x3F << (pos%8));
+				m_data[ln + c_bit][pos/8] |= (temp << (pos%8));
+				if((pos % 8) > 2)
+				{
+					uint8_t temp2 = 0;
+					for(uint8_t idx = 0; idx < ((pos%8) -2); idx++)
+					{
+						temp2 |= (1 << idx);
+					}
+					m_data[ln + c_bit][(pos/8) + 1] &= ~temp2;
+					m_data[ln + c_bit][(pos/8) + 1] |= (temp >> (8 - (pos%8)));
+				}
+			}
+		}
+		
+		rtnVal = write_memory(m_data, 8, ln);
+	}
+	
+	return rtnVal;
+}
+
+
+/*****************************************************************************/
+SharpLS012B7DD01::SharpCmdResult SharpLS012B7DD01::print_str(uint8_t ln, uint8_t pos, const char *s)
+{
+	SharpLS012B7DD01::SharpCmdResult rtnVal = SharpLS012B7DD01::Failure;
+	
+	size_t len = strlen(s);
+	
+	if((ln < 4) && ((pos + len - 1) < 30))
+	{
+		for(size_t idx = 0; idx < len; idx++)
+		{
+			rtnVal = print_char(ln, (pos + idx), s[idx]);
+		}
+	}
+	
+	return rtnVal;
+}
+
+
+/*****************************************************************************/
+void SharpLS012B7DD01::clear_display()
+{
+	update(SharpLS012B7DD01::ALL_CLEAR_MODE);
+}
+
+
+/*****************************************************************************/
+SharpLS012B7DD01::SharpCmdResult SharpLS012B7DD01::write_memory(uint8_t data[][23], uint8_t lines, uint8_t offset)
+{
+	SharpLS012B7DD01::SharpCmdResult rtnVal = Failure;
+	
+	if((lines + offset) <= 38)
+	{
+		m_cs = !m_cs;
+		//send mode
+		m_spi.write(SharpLS012B7DD01::DATA_UPDATE_MODE);
+		for(uint8_t idy = offset; idy < (lines + offset); idy++)
+		{
+			//send line adrs
+			m_spi.write(rev_bit(idy + 1));
+			for(uint8_t idx = 0; idx < 23; idx++)
+			{
+				m_spi.write(rev_bit(data[idy][idx]));
+			}
+			//dummy data required by datasheet
+			m_spi.write(0);
+			m_spi.write(0);
+		}
+		//last line requires 16 xfr clocks too
+		m_spi.write(0);
+		m_cs = !m_cs;
+		
+		rtnVal = Success;
+	}
+	
+	return rtnVal;
+}
+
+
+/*****************************************************************************/
+void SharpLS012B7DD01::update(const uint8_t mode)
+{
+	m_cs = !m_cs;
+	//send mode
+	m_spi.write(mode);
+	m_spi.write(0);
+	m_spi.write(0);
+	m_cs = !m_cs;
+	
+	if(mode == SharpLS012B7DD01::ALL_CLEAR_MODE)
+	{
+		for(uint8_t idy = 0; idy < 38; idy++)
+		{
+			for(uint8_t idx = 0; idx < 23; idx ++)
+			{
+				m_data[idy][idx] = 0xFF;
+			}
+		}
+	}
+}
+
+
+/*****************************************************************************/
+uint8_t SharpLS012B7DD01::rev_bit(uint8_t data)
+{
+	uint8_t temp = 0;
+	for(uint8_t idx = 0; idx < 8; idx++)
+	{
+		if((1 << idx) & data)
+		{
+			temp |= (0x80 >> idx);
+		}
+	}
+	
+	return temp;
+}
+
+
+/*****************************************************************************/
+void SharpLS012B7DD01::toggle_extcomin()
+{
+	m_extcomin = !m_extcomin;
+}
\ No newline at end of file