Demo Clock with Nucleo-F303RE and Starter Shield

Dependents:   Nucleo_StarterShileld_Clock mojo main job ... more

TM1636.cpp

Committer:
rogerzuber
Date:
2017-05-18
Revision:
0:864e710889fa
Child:
1:e4450fb0849a

File content as of revision 0:864e710889fa:

//  Author:Frankie.Chu
//  Date:9 April,2012
//
//  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 the Free Software
//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
//
//  Modified record:
//
/*******************************************************************************/
#include "TM1636.h"
#include "mbed.h"

static int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4f,
                           0x66,0x6d,0x7d,0x07,
                           0x7f,0x6f,0x77,0x7c,
                           0x39,0x5e,0x79,0x71,
                           0x40,0x00};				//0~9,A,b,C,d,E,F,"-"," "
                                                 
TM1636::TM1636(PinName Clk, PinName Data) 
	: Clkpin(Clk), Datapin(Data)
{
  	Datapin.output();
  	Clkpin.output();    
}

/*Set the default brightness is BRIGHT_TYPICAL and clear the display*/
void TM1636::init(void)
{
	set(BRIGHTEST);
	clearDisplay();
}

void TM1636::writeByte(int8_t wr_data)
{
	uint8_t i,count1;   
	for(i=0;i<8;i++)        								// sent 8bit data
	{
		Clkpin = LOW;     
		if(wr_data & 0x01) Datapin = HIGH;					// LSB first
		else Datapin = LOW;
		wr_data >>= 1;      
		Clkpin = HIGH;
	}  
	Clkpin = LOW; 											//wait for the ACK
	Datapin = HIGH;
	Clkpin = HIGH;
	Datapin.input();   
	while(Datapin)    
	{ 
		count1 +=1;
		if(count1 == 200)
		{
			Datapin.output();
			Datapin = LOW;
			count1 =0;
		}
		Datapin.input();  
	}
	Datapin.output();
}

//send start signal to TM1636
void TM1636::start(void)
{
	Clkpin = HIGH;											//send start signal to TM1637
	Datapin = HIGH;
	Datapin = LOW; 
	Clkpin = LOW;
}

//End of transmission
void TM1636::stop(void)
{
	Clkpin = LOW;
	Datapin = LOW;
	Clkpin = HIGH;
	Datapin = HIGH;
}

//display function.Write to full-screen.
void TM1636::display(int8_t DispData[])
{
	int8_t SegData[4];
	uint8_t i;
	for(i = 0;i < 4;i ++)
	{
		SegData[i] = DispData[i];
	}
	coding(SegData);
	start();          										//start signal sent to TM1637 from MCU
	writeByte(ADDR_AUTO);
	stop();
	start();          
	writeByte(Cmd_SetAddr);
	for(i=0;i < 4;i ++)
	{
		writeByte(SegData[i]);
	}
	stop();           
	start();          
	writeByte(Cmd_DispCtrl);
	stop();           
}

//******************************************
void TM1636::display(uint8_t BitAddr,int8_t DispData)
{
	int8_t SegData;
	SegData = coding(DispData);
	start();          										//start signal sent to TM1637 from MCU
	writeByte(ADDR_FIXED);
	stop();
	start();
	writeByte(BitAddr|0xc0);
	writeByte(SegData);
	stop();
	start();
	writeByte(Cmd_DispCtrl);
	stop();
}

void TM1636::clearDisplay(void)
{
	display(0x00,0x7f);
	display(0x01,0x7f);
	display(0x02,0x7f);
	display(0x03,0x7f);  
}

//To take effect the next time it displays.
void TM1636::set(uint8_t brightness,uint8_t SetData,uint8_t SetAddr)
{
	_brightness = brightness;
	Cmd_SetData = SetData;
	Cmd_SetAddr = SetAddr;
	Cmd_DispCtrl = 0x88 + brightness;						//Set the brightness and it takes effect the next time it displays.
}

//Whether to light the clock point ":".
//To take effect the next time it displays.
void TM1636::point(bool PointFlag)
{
	_PointFlag = PointFlag;
}

void TM1636::coding(int8_t DispData[])
{
	uint8_t PointData;
	if(_PointFlag == POINT_ON)PointData = 0x80;
	else PointData = 0; 
	for(uint8_t i = 0;i < 4;i ++)
	{
		if(DispData[i] == 0x7f)DispData[i] = 0x00;
		else DispData[i] = TubeTab[DispData[i]] + PointData;
	}
}

int8_t TM1636::coding(int8_t DispData)
{
	uint8_t PointData;
	if(_PointFlag == POINT_ON)PointData = 0x80;
	else PointData = 0; 
if(DispData == 0x7f) DispData = 0x00 + PointData;			//The bit digital tube off
	else DispData = TubeTab[DispData] + PointData;
	return DispData;
}