特性描述
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]);
}