TM1650芯片示例代码

特性描述

TM1650 是一种带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用电路。内部集成有 MCU
输入输出控制数字接口、数据锁存器、LED 驱动、键盘扫描、辉度调节等电路。TM1650 性能稳定、质
量可靠、抗干扰能力强,可适用于 24 小时长期连续工作的应用场合。
功能特点
  • 两种显示模式:8段×4位和7段×4位
  • 段驱动电流大于25mA,位驱动电流大于150mA
  • 提供8级亮度控制
  • 键盘扫描:7×4bit内部集成三极管驱动
  • 高速两线式串行接口
  • 内置时钟振荡电路
  • 内置上电复位电路
  • 支持2.8V-5.5V电源电压
  • 提供DIP16及SOP16封装
适用领域:  
  • 家用电器产品如机顶盒、空调、DVD/VCD等显示的驱动。

通讯协议
TM1650 采用 2 线串行传输协议通讯。
1:开始信号(START)/结束信号(STOP)
开始信号:保持 SCL 为“1”电平,SDA 从“1”跳“0”,认为是开始信号,
如(图 3)A 段;
结束信号:保持 SCL 为“1”电平,SDA 从“0”跳“1”,认为是结束信号,
如(图 3)E 段;
2:ACK 信号
如果本次通讯正常,芯片在串行通讯的第 8 个时钟下降沿后,TM1650 主动把 SDA 拉低。直到检
测到 SCL 来了上升沿,SDA 释放为输入状态(对芯片而言),如(图 3)D 段。
3: 写“1”和写“0”。
写“1”:保持 SDA 为“1”电平,SCL 从“0”跳到“1”,再从“1”跳到“0”,则认为是写入“1”
如(图 3)B 段。
写“0”:保持 SDA 为“0”电平,SCL 从“0”跳到“1”,再从“1”跳到“0”,则认为是写入“0”
如(图 3) C 段。
4: 一个字节数据传输格式
一个字节数据的传输格式如图 4,数据发送时 MSB 在前,LSB 在后。微处理器的数据通过两线总线
接口和 TM1650 通信,在输入数据时当 SCL 是高电平时,SDA 上的信号必须保持不变;只有 SCL 上的
时钟信号为低电平时,SDA 上的信号才能改变。数据输入的开始条件是 SCL 为高电平时,SDA 由高变
低;结束条件是 SCL 为高时,SDA 由低电平变为高电平。
5:读按键数据时序
读数据时,SCL 下降沿,数据从 TM1650 SDA 脚输出。
Command: 发送读按键命令。
Key_data: 读到的键盘扫描码。
显存地址:
该寄存器存储通过串行接口从外部器件传送到TM1650的数据,共4个字节单元,分别与芯片
A/KI~DP/KP和DIG管脚所接的LED灯对应,分配如下图:
写LED显示数据的时候,按照从显示地址从高位到低位,从数据字节的高位到低位操作。

下列是TM1650的示例代码:

#define WDT_CLR()			WDTCON |= 0x10		    //清看门狗
#define NOP()     			WDT_CLR()
#define DIO_INPUT()			P0CON &= 0xBF
#define DIO_OUTPUT()		P0CON |= 0x40

U8 code CODE[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,};//共阳数码管0~9字型码
/***************************************************
*函数名称:void TM1650_Start(void)
*输	   入:
*输	   出
*说	   明:
***************************************************/
void TM1650_Start(void)
{
	 CLK=1;
	 NOP(); NOP();NOP(); NOP();
	 DIO=1;
	 NOP(); NOP();NOP(); NOP();NOP();
	 DIO=0;
	 NOP(); NOP();NOP(); NOP();NOP();
	 CLK=0;
}
/***************************************************
*函数名称:void TM1650_Stop(void)
*输	   入:void
*输	   出:void
*说	   明:
***************************************************/
void TM1650_Stop(void)
{

	DIO=0;
	NOP(); NOP();NOP();NOP();NOP();
	CLK=1;
	NOP(); NOP();NOP();NOP();NOP();
	DIO=1;
	NOP(); NOP();NOP();NOP();NOP();
	//CLK=0;
	//DIO=0;
}
/***************************************************
*函数名称:void TM1650_Send_Byte(U8 oneByte)
*输	   入:
*输	   出:
*说	   明:配置显示缓存,main()中100ms调用
***************************************************/
void TM1650_Send_Byte(U8 oneByte)
{
	
	U8 i;
	for(i=0;i<8;i++)
	{
		CLK=0;
		if(oneByte&0x80) 
		  DIO=1;
		else 
		  DIO=0;
		NOP(); NOP(); NOP(); NOP(); NOP();
		CLK=1;
		oneByte=oneByte<<1;
	}
			    //8位数据传送完		 
	CLK = 0;//判断芯片发过来的ACK应答信号
	NOP(); NOP();NOP();NOP();NOP();
	DIO_INPUT();
	NOP(); NOP();NOP();NOP();NOP();
	CLK = 1;
	NOP(); NOP();NOP();NOP();NOP();
	i = 30;
	while((i > 0) && (DIO == 1))
	{
		NOP();NOP();
		i--;
	}
	CLK = 0;
	DIO_OUTPUT();
	DIO = 0;
}

/***************************************************
*函数名称:Disp_Buffer_Config
*输	   入:void
*输	   出:void
		显示函数,固定地址写数据
*说	   明:配置显示缓存,main()中100ms调用
***************************************************/
void disp(U8 add, U8 value)
{
	TM1650_Start();
	TM1650_Send_Byte(0x48);				//数据命令设置:固定地址,写数据到显示寄存器
	TM1650_Send_Byte(0x71);				//显示控制命令:开显示,脉冲宽度为11/16.
	TM1650_Stop();

	TM1650_Start();
	TM1650_Send_Byte(add);				//地址命令设置:写入add对应地址
	TM1650_Send_Byte(value);			//给add地址写数据
		
	TM1650_Stop();
	
}

/***************************************************
*函数名称:Disp_Buffer_Config
*输	   入:void
*输	   出:void
*说	   明:配置显示缓存,main()中100ms调用
***************************************************/
void Send_To_TM1650(void)
{
	disp(0x68,CODE[0]);
	disp(0x6A,CODE[1]);
	disp(0x6C,CODE[2]);
	disp(0x6E,CODE[3]);	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值