This is a library for the JY-LKM1638 Display

Revision:
0:c05022d4f68c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LKM1638.cpp	Mon Aug 19 17:09:38 2013 +0000
@@ -0,0 +1,345 @@
+
+#include "mbed.h"
+#include "LKM1638.h"
+
+
+const char READMODE = 0x42;
+const char INTENSITY = 0x00;  //Intensity of LED and Seven Segment Displays (0-7)
+const int WAIT = 1;
+
+	
+	//MPL3115A2 Class Constructor
+	LKM1636::LKM1636(PinName pin1, PinName pin2, PinName pin3) :_Strobe(pin1),_CLK(pin2),_Data(pin3)
+	{
+	  _Data.mode(PullUp);
+		
+	}
+
+	
+//Driver Function that is used to write any printable char to the seven segment displays 0-7
+void LKM1636::displaychar (unsigned char value, unsigned char Seg_num, bool decimal)	 //Seg_num 0-7 ____,____
+{
+
+	unsigned char address;
+	unsigned char Seg_value=0;
+	address = 0xC0 + Seg_num * 2;		  //Base Address for Segments is 0xC0 Each segment uses to Bytes of Mem.
+	Seg_value = getchar(value);
+	if(decimal)
+	Seg_value = Seg_value | 0x80;
+	if(Seg_value<0xff)					  // If Seg_value == 0xFF then character was not recognized
+	{
+	 	_Strobe = 0;
+		SendChar(address);
+		SendChar(Seg_value);
+		_Strobe = 1;
+		Delay(WAIT);
+		_Strobe = 0;
+		SendChar(INTENSITY | 0x88);
+	  _Strobe = 1;
+	}
+
+
+
+}
+
+
+//Prints a Long int to the 8 Seven Segment displays
+void LKM1636::Clear()	 //bank is either Seven Segs 0-3 Bank==0 or Segs 4-7 Bank==1
+	{
+		unsigned long temp1=0;
+		
+    for(temp1=0;temp1<8;temp1++)
+		{
+					displaychar (' ',temp1,0);
+		}
+
+	}
+
+
+
+///Writes an 8bool number to either the first or second bank of 4 seven segment displays
+
+void LKM1636::Write_Short(unsigned char value, bool bank)	 //bank is either Seven Segs 0-3 Bank==0 or Segs 4-7 Bank==1
+	{
+		unsigned char temp=0;
+		unsigned char Seg_number = 0; 
+		if(bank)
+		Seg_number = 5;
+		temp = value/100;
+		temp = temp%10;
+		displaychar (temp, Seg_number,0);
+		temp = value/10;
+		temp = temp%10;
+		displaychar (temp, Seg_number+1,0);
+		temp = value%10;
+		displaychar (temp, Seg_number+2,0);
+	}
+//Prints a Long int to the 8 Seven Segment displays
+void LKM1636::Write_Long(unsigned long int value)	 //bank is either Seven Segs 0-3 Bank==0 or Segs 4-7 Bank==1
+	{
+		unsigned long temp1=0;
+		
+		temp1 = (value/10000000);
+		temp1 = temp1%10;
+		displaychar ((unsigned char)temp1,0,0);
+
+		temp1 = (value/1000000);
+		temp1 = temp1%10;
+		displaychar ((unsigned char)temp1,1,0);
+
+		temp1 = (value/100000);
+		temp1 = temp1%10;
+		displaychar ((unsigned char)temp1,2,0);
+
+		temp1 = (value/10000);
+		temp1 = temp1%10;
+		displaychar ((unsigned char)temp1,3,0);
+
+		temp1 = (value/1000);
+		temp1 = temp1%10;
+		displaychar ((unsigned char)temp1,4,0);
+
+		temp1 =(value/100);
+		temp1 = temp1%10;
+		displaychar ((unsigned char)temp1,5,0);
+
+		temp1 = (value/10);
+		temp1 = temp1%10;
+		displaychar ((unsigned char)temp1,6,0);
+
+		temp1 = (value%10);
+		displaychar ((unsigned char)temp1,7,0);
+	}
+
+// Serializes the Value passed into the character variable and send out using the data pin
+void LKM1636::SendChar(unsigned char Character)
+{
+ 	    unsigned char t;
+		_CLK =1;
+	  _Data.output();
+		Delay(WAIT);
+		for (t=0;t<8;t++)				  //Serialize Address and put out on Data Pin
+		{
+
+  		 _Data = (Character & 0x01);
+		   Character = Character>>1;
+		   ToggleClock (); 		
+		}
+		_Data.input();
+
+}
+///  Toggles the Clock pin low to high with a minimal delay between the toggle
+void LKM1636::ToggleClock ()
+{
+		   _CLK = 0;
+		   Delay(WAIT);
+		   _CLK = 1;	
+		   Delay(WAIT);
+}
+/// Delay for Tick * Tocks of system clock
+///
+void LKM1636::Delay(unsigned int Tick)
+{
+ 	unsigned int tock=0,t=0;
+	for(t=0;t<Tick;t++)
+	{
+	  for(tock=0;tock<10;tock++);
+	}
+
+}
+
+/// Getchar takes a integer value 0-15 or ascii value '0' - 'F'
+/// and returns the Seven Segment value needed to display the value
+
+unsigned char LKM1636::getchar(unsigned char value)
+{
+	int seg_value = 0;
+
+ 	switch(value)
+	{
+	 	case ('0'):
+		case (0):
+			seg_value = 0x3f;
+			break;			
+		case ('1'):
+		case (1):
+			seg_value = 0x6;
+			break;
+		case ('2'):
+		case (2):
+			seg_value = 0x5b;
+			break;
+		case ('3'):
+		case (3):
+			seg_value = 0x4f;
+			break;
+		case ('4'):
+		case (4):
+			seg_value = 0x66;
+			break;
+		case ('5'):
+		case (5):
+			seg_value = 0x6d;
+			break;
+		case ('6'):
+		case (6):
+			seg_value = 0x7d;
+			break;
+		case ('7'):
+		case (7):
+			seg_value = 0x7;
+			break;
+		case ('8'):
+		case (8):
+			seg_value = 0x7f;
+			break;
+		case ('9'):
+		case (9):
+			seg_value = 0x6f;
+			break;
+		case ('A'):
+		case ('a'):
+		case (10):
+			seg_value = 0x77;
+			break;
+		case ('B'):
+		case ('b'):
+		case (11):
+			seg_value = 0x7c;
+			break;
+		case ('C'):
+		case ('c'):
+		case (12):
+			seg_value = 0x39;
+			break;
+		case ('D'):
+		case ('d'):
+		case (13):
+			seg_value = 0x5e;
+			break;
+		case ('E'):
+		case ('e'):
+		case (14):
+			seg_value = 0x79;
+			break;
+		case ('F'):
+		case ('f'):
+		case (15):
+			seg_value = 0x71;
+			break;
+		case ('.'):
+			seg_value = 0x80;
+			break;
+		case ('-'):
+			seg_value = 0x40;
+			break;
+		case (' '):
+			seg_value =0x0;
+			break;
+		default :
+			seg_value = 0xff;
+			break;
+			
+	}
+	return (seg_value);
+}
+
+//Reads the current state of all 8 input buttons.  The state of each button is returned as an 8bool value
+//the bool to Sw map:
+//Switch bool order   bool# 7 6 5 4 3 2 1 0  //0x80 0x20 0x08 0x02 || 0x40 0x10 0x04 0x01
+//					 Sw#  1 5 2 6 3 7 4 8
+
+unsigned char LKM1636::read_buttons ()
+{
+    unsigned char temp=0;
+	char d=0;
+    _Strobe = 0;
+	SendChar(READMODE);
+	//_Data = 1;
+	_CLK = 1;
+	Delay(WAIT);
+	for(d=0;d<32;d++)
+	{
+	   if(!((d-1)%4))
+	   {
+			temp=temp<<1;
+			if(_Data)
+	   		temp+=1;	   	
+	   }
+	   ToggleClock ();
+	}
+	_Strobe = 1;
+	return temp;	
+}					 
+					 
+//Takes the 8bool number returned from the read_buttons function and lights the corsponing LED to current switch posistion
+void LKM1636::Switch_To_LED(unsigned char Switch_Values)
+{
+    unsigned char t=0;
+	bool temp_state=0;
+    for(t=0; t<8; t++)
+	{
+	 	temp_state = (Switch_Values & 0x01);
+	 	Switch_Values= Switch_Values>>1;
+	 	switch (t)
+		{
+		    case (0):
+		    LED (7, temp_state);		
+			break;
+		   	case (1):
+		    LED (3, temp_state);		
+			break;
+		   	case (2):
+		    LED (6, temp_state);		
+			break;
+		   	case (3):
+		    LED (2, temp_state);		
+			break;
+		   	case (4):
+		    LED (5, temp_state);		
+			break;
+		   	case (5):
+		    LED (1, temp_state);		
+			break;
+		   	case (6):
+		    LED (4, temp_state);		
+			break;
+		   	case (7):
+		    LED (0, temp_state);		
+			break;
+			default:
+			break;
+		}
+
+	}
+}
+
+//LED_Num (0-7)) corsponds to the LED that is to be written to state(1=led on, 0 = led off)
+void LKM1636::LED (unsigned char LED_Num, bool state)//intensity can range from 0-7
+{
+ 	unsigned char LED_Address;
+	LED_Address = 0xC0 + (LED_Num*2) + 1;   //LED are at odd address 1 to 15;
+	_Strobe = 0;
+	SendChar(LED_Address);
+	if(state)
+	SendChar(0x01);
+	else
+	SendChar(0x00);
+	_Strobe = 1;
+	Delay(WAIT);
+	_Strobe = 0;
+	SendChar(INTENSITY | 0x88);
+	_Strobe = 1;
+}
+//Takes a 8bool number and writes out the value to the 8 leds (0-7)
+void LKM1636::LEDS (unsigned char LED_Values)
+{
+   unsigned char temp;
+   bool temp_state = 0 ;
+   for(temp=0; temp<8; temp++)
+   {
+   	 temp_state = (LED_Values & 0x01);
+	 LED (temp, temp_state);
+	 LED_Values= LED_Values>>1;
+   }
+}