TM1668 Led 驱动芯片源程序

#define	P_1668DAT_In	RA0   //数据输入端口

#define	P_1668DAT		LATA0 //数据输出端口

#define	P_1668CLK		LATA1

#define	P_1668CS		LATC0





#define		TM1668_CS_HIGH	P_1668CS = 1

#define		TM1668_CS_LOW	P_1668CS = 0



#define		TM1668_DAT_HIGH	P_1668DAT = 1

#define		TM1668_DAT_LOW	P_1668DAT = 0



#define		TM1668_CLK_HIGH	P_1668CLK = 1

#define		TM1668_CLK_LOW	P_1668CLK = 0





//显示模式设置命令

#define		V_MDSP1		0x00 //4位13段

#define		V_MDSP2		0x01 //5位12段	

#define		V_MDSP3		0x02 //6位11段	

#define		V_MDSP4		0x03 //7位10段



//数据命令设置

#define		V_MDAT1		0x40 //写数据到显示区

#define		V_MDAT2		0x42 //读键扫数据

//#define		V_MDAT3		0x40 //自动地址增加	

#define		V_MDAT4		0x44 //固定地址	



//地址命令设置

#define		V_ADDR0			0xC0 //地址0

#define		V_ADDR1			0xC1 //地址1	

#define		V_ADDR2			0xC2 //地址2

#define		V_ADDR3			0xC3 //地址3

#define		V_ADDR4			0xC4 //地址4

#define		V_ADDR5			0xC5 //地址5

#define		V_ADDR6			0xC6 //地址6	

#define		V_ADDR7			0xC7 //地址7

#define		V_ADDR8			0xC8 //地址8

#define		V_ADDR9			0xC9 //地址9

#define		V_ADDR10		0xCA //地址10

#define		V_ADDR11		0xCB //地址11

#define		V_ADDR12		0xCC //地址12

#define		V_ADDR13		0xCD //地址13



//显示控制 - 亮度调节

#define		V_DIS16_01		0x80 //显示宽度1/16

#define		V_DIS16_02		0x81 //显示宽度2/16

#define		V_DIS16_03		0x82 //显示宽度3/16	

#define		V_DIS16_10		0x83 //显示宽度10/16

#define		V_DIS16_11		0x84 //显示宽度11/16

#define		V_DIS16_12		0x85 //显示宽度12/16

#define		V_DIS16_13		0x86 //显示宽度13/16	

#define		V_DIS16_14		0x87 //显示宽度14/16



#define		V_DIS16_OFF		0x80 //显示宽度14/16

#define		V_DIS16_ON		0x88 //显示宽度14/16



//---------------------------------------------

#define		V_LED_LIGHT		(V_DIS16_10|V_DIS16_ON)  //显示亮度设置





//----------------------------

#define		V_NOP		3//5

//*************************************

// 函数名称:Nop1668

// 函数功能:延时函数

// 入口参数:延时时间

// 出口参数:无

//***************************************

void Nop1668(uint8 T_Dly)

{	

	while(T_Dly--);			

	return ;

}

//**************************************

// 函数名称:TM1668_WriteByteData

// 函数功能:TM1668发送一字节数据

// 入口参数:要发送的数据

// 出口参数:

//***************************************

void TM1668_WriteByteData(uint8 Data)   

{   

 	uint8 i;  



 	Nop1668(V_NOP) ;

	for(i=8;i>0;i--)   

	{   

		TM1668_CLK_LOW ;   

		if((Data & 0x01) == 0) 

		{

			TM1668_DAT_LOW ;

		}   

		else  

		{

			TM1668_DAT_HIGH ;

		}   

		Data >>= 1 ;

		Nop1668(V_NOP) ;



		TM1668_CLK_HIGH ; 

	    Nop1668(V_NOP) ;  

	}   

}

//**************************************

// 函数名称:TM1668_ReadByteData

// 函数功能:读TM1668一字节数据

// 入口参数:无

// 出口参数:

// 返回值 : 所读的数据

//***************************************

uint8 TM1668_ReadByteData(void)   

{   

	uint8 i; 

	uint8 RetValue = 0 ; 



 	TM1668_CLK_LOW ;  

	for(i=0;i<8;i++)   

	{   

		Nop1668(V_NOP) ;

	

		TM1668_CLK_HIGH ; 

		RetValue >>= 1 ;	//先读出的是低位

		if(P_1668DAT_In)

		{

			RetValue |= 0x80 ;

		}

		TM1668_CLK_LOW ;      

	}   



   	return	(RetValue);    

}

//**************************************

// 函数名称:TM1668_WriteCommand

// 函数功能:写设置命令

// 入口参数:设置命令参数

// 出口参数:无

//***************************************

void TM1668_WriteCommand(uint8 Comm)

{

	TM1668_CS_LOW ;  

	Nop1668(V_NOP) ; 	

	TM1668_WriteByteData(Comm);

 	TM1668_CS_HIGH ; 	

}

//**************************************

// 函数名称:TM1668_WriteAddrData

// 函数功能:向固定地址写一个数据	

// 入口参数:地址 数据

// 出口参数:无

//***************************************

void TM1668_WriteAddrData(uint8 Addr,uint8 Data)

{

	TM1668_CS_LOW ;  

	TM1668_WriteByteData(Addr); //写地址

	TM1668_WriteByteData(Data); //写数据

	TM1668_CS_HIGH ; 	

}







//----应用实例---------

//**************************************

// 函数名称:TM1668_ReadKey

// 函数功能:TM1668 读按键值	

// 入口参数:显示数据缓存区

// 出口参数:

// 备注:

//***************************************

void TM1668_WriteDat(uint8 *InDat)

{

	uint8 i ;

	uint8 Addr,Tmp2 ;

	

	TM1668_WriteCommand(V_MDSP4) ;//7位10段

 	TM1668_WriteCommand(V_MDAT1) ; //写数据到1668 固定模式

	//-----

	Addr = V_ADDR2 ;

	for(i=0;i<5;i++)  //刷显数据

	{

		if((*InDat) & 0x01)

		{

			Tmp2 = 0x01 ;

		}

		else

		{

			Tmp2 = 0x00 ;

		}

	 	TM1668_WriteAddrData(Addr,Tmp2) ;

		Addr += 2 ;  //地址加2

		(*InDat) >>= 1 ;	

	}

	//-----

	TM1668_WriteCommand(V_LED_LIGHT) ;	//设置亮度 开启显示

}

//**************************************

// 函数名称:TM1668_ReadKey

// 函数功能:TM1668 读按键值	

// 入口参数:无

// 出口参数:

// 返回值 : 返回按键值

//***************************************

void TM1668_ReadKey(uint8 *OutDat)

{

	uint8  i ;



	TM1668_CS_LOW ;  

	Nop1668(V_NOP) ; 	

	TM1668_WriteByteData(V_MDAT2) ; //读按键值



	Nop1668(V_NOP) ; 

	Nop1668(V_NOP) ; 



	TM1668_DAT_HIGH ; //读前数据置高

	*OutDat = TM1668_ReadByteData() ;//	只读一个字节



/*	for(i=5;i>0;i--) //读所有按键的值

	{

		*OutDat = TM1668_ReadByteData() ;	

		OutDat ++ ;	

	}*/

	TM1668_CS_HIGH ; 

}


你可能感兴趣的:(程序)