TM1668 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。本产品性能优良,质量可靠。主要应用于VCR。
芯片介绍
我使用的是天微电子的TM1668芯片。
管脚定义
管脚功能:
注意
:DIO口输出数据时为N管开漏输出,在读键的时候需要外接1K-10K的上拉电阻。本公司推荐10K的上拉电阻。DIO在时钟的下降沿控制N管的动作,此时读数时不稳定,你可以参考图(6),在时钟的上升沿读数才时稳定。
芯片工作模式以及功能
显示寄存器地址和模式
数据传输格式
串行地址通信
当使用串行地址时会有两种工作模式:地址自动加一模式 &固定地址模式
本人使用驱动电路以及代码
电路图
笔者使用共阴极接法,来驱动7位十段LED。
代码
.c
#include "TM1668.h"
#include "bsp.h"
char TAB[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //共阴数码管无显示字型码
void TM1668_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/***************发送8bit数据,从低位开始**************/
void send_8bit(char dat) //发送8位数据,从低位开始
{
char i;
for(i=0;i<8;i++)
{
CLK_L;
if(dat&0x01)
DIO_H;
else
DIO_L;
Delay_3us();
Delay_3us();
Delay_3us();
CLK_H;
dat>>=1;
}
CLK_L;
DIO_L;
}
/******************发送控制命令***********************/
void send_command(char com) //发送命令字节
{
STB_H; //STB置高
Delay_3us();
STB_L; //STB置低
send_8bit(com); //发送8bit数据
}
/************显示函数,数码管1~7位显示0~6************/
void display(char *p) //显示函数,1~7位数码管显示0~6
{
char i;
char databuf[16];
for(i=0;i<16;i++)
{
databuf[i]=LedData[p[i]];
}
send_command(0x03); //设置显示模式,7位10段模式
send_command(0x40); //设置数据命令,采用地址自动加1模式
send_command(0xc0); //设置显示地址,从00H开始
for(i=0;i<7;i++)
{
// send_8bit(*p); //从00H开始,偶数地址送显示数据
send_8bit(databuf[i]);
send_8bit(databuf[i+8]);
//send_8bit(0x00); //因为SEG9-14未用到,所以奇数地址送全0
p++;
}
send_command(0x88); //设置显示命令,打开显示并设置占空比14/16.
STB_L;
}
.h
#ifndef __TM1688_H
#define __TM1688_H
#include "stm32f0xx.h"
/****
//gpio需要自己定义一下
*****/
#define TSCK_HIGH T_CLK_ON()
#define TSCK_LOW T_CLK_OFF()
#define TDIN_HIGH T_DIN_ON()
#define TDIN_LOW T_DIN_OFF()
#define TSTB1_HIGH T_STB_ON()
#define TSTB1_LOW T_STB_OFF()
#define CLK_H T_CLK_ON()
#define CLK_L T_CLK_OFF()
#define STB_H T_STB_ON()
#define STB_L T_STB_OFF()
#define DIO_H T_DIN_ON()
#define DIO_L T_DIN_OFF()
/*******************************************************************************
显示模式命令设置
*******************************************************************************/
#define GRID4_SEG13 0x00 /* 4位13段 */
#define GRID5_SEG12 0x01 /* 5位12段 */
#define GRID6_SEG11 0x02 /* 6位11段 */
#define GRID7_SEG10 0x03 /* 7位10段 */
/*******************************************************************************
数据命令设置
*******************************************************************************/
#define CMD_DataWriteIncrease 0x40 /* 地址自增写数据 */
#define CMD_DataWriteFixed 0x44 /* 固定地址写数据 */
/*******************************************************************************
显示控制命令设置
*******************************************************************************/
#define DSP_01_16 0x88 /* 设置脉冲宽度为1/16 */
#define DSP_02_16 0x89 /* 设置脉冲宽度为2/16 */
#define DSP_04_16 0x8A /* 设置脉冲宽度为4/16 */
#define DSP_10_16 0x8B /* 设置脉冲宽度为10/16 */
#define DSP_11_16 0x8C /* 设置脉冲宽度为11/16 */
#define DSP_12_16 0x8D /* 设置脉冲宽度为12/16 */
#define DSP_13_16 0x8E /* 设置脉冲宽度为13/16 */
#define DSP_14_16 0x8F /* 设置脉冲宽度为14/16 */
#define DSP_OFF 0x80 /* 显示关 */
/*******************************************************************************
地址命令设置
*******************************************************************************/
#define ADD_00H 0xC0 /* 显示地址: GRID1 */
#define ADD_01H 0xC1 /* 显示地址: GRID1 */
#define ADD_02H 0xC2 /* 显示地址: GRID2 */
#define ADD_03H 0xC3 /* 显示地址: GRID2 */
#define ADD_04H 0xC4 /* 显示地址: GRID3 */
#define ADD_05H 0xC5 /* 显示地址: GRID3 */
#define ADD_06H 0xC6 /* 显示地址: GRID4 */
#define ADD_07H 0xC7 /* 显示地址: GRID4 */
#define ADD_08H 0xC8 /* 显示地址: GRID5 */
#define ADD_09H 0xC9 /* 显示地址: GRID5 */
#define ADD_0AH 0xCA /* 显示地址: GRID6 */
#define ADD_0BH 0xCB /* 显示地址: GRID6 */
#define ADD_0CH 0xCC /* 显示地址: GRID7 */
#define ADD_0DH 0xCD /* 显示地址: GRID7 */
.main
#include <tm1668.h>
int main()
{
intdata = "1234"
int data_num[10];
data_num[0] = data/1000;
data_num[1] = data/100%10;
data_num[2] = data/10%10;
data_num[3] = data%10;
display(data_num);
while(1);
}
至此可以点亮led断码电路并且显示“1234”