写点什么

一种 LED 驱动专用控制电路

作者:向阳逐梦
  • 2023-11-26
    四川
  • 本文字数:2059 字

    阅读完需:约 7 分钟

一种LED驱动专用控制电路

一、基本概述

TM1620 是一种 LED(发光二极管显示器)驱动控制专用 IC,内部集成有 MCU 数字接口、数据锁存

器、LED 驱动等电路。本产品质量可靠、稳定性好、抗干扰能力强。主要适用于家电设备(智能热

水器、微波炉、洗衣机、空调、电磁炉)、机顶盒、电子称、智能电表等数码管或 LED 显示设备。

二、基本的特性说明

  • 采用 CMOS 工艺

    显示模式(8 段×6 位~10 段×4 位)

    辉度调节电路(8 级占空比可调)

    串行接口(CLK,STB,DIN)

    振荡方式:内置 RC 振荡

    内置上电复位电路

    内置数据锁存电路

    内置针对 LED 反偏漏电导致暗亮问题优化电路

    抗干扰能力强

    封装形式:SOP20

三、管脚定义

四、指令说明

五、应用电路

TM1620 驱动共阴数码屏硬件电路图(18)

1、VDD、GND 之间滤波电容在 PCB 板布线应尽量靠近 TM1620 芯片放置,加强滤波效果。

2、连接在 DIN、CLK、STB 通讯口上下拉三个 100pF 电容可以降低对通讯口的干扰。

3、因蓝光数码管的导通压降压约为 3V,因此 TM1620 供电应选用 5V。

六、电气参数


七、封装形式


本项目使用的是 6 位 8 段的数码管,即 0x020。

注意:芯片显示寄存器在上电瞬间其内部保存的值可能是随机不确定的,此时我们直接发送开屏命令,将有可能出现显示乱码。所以建议对显示寄存器进行一次上电清零操作,即上电后向 12 位显存地址(00H-0BH)中全部写入数据 0x00。具体操作方法是:初始化 TM1620 时使用(2)数据命令中的自动地址增加命令,依次给所有地址写 0x00。

八、硬件电路

TM1620 的 STB、CLK、DIN 引脚分别连接单片机的 PC0、PC1、PC2 引脚。

 初始化:

初始化 TM1620 的 3 个输出引脚:

代码部分:

定义结构体类型:

typedef struct{	Brightness_level_t  Brightness;		void (*TM1620_Init)(void);                          //TM1620初始化	void (*Disp)(Disp_NUM_t,uint8_t,Disp_DP_Status_t);  //数码管显示} Display_t;
复制代码

写入字节函数:

/*	* @name   TM1620_Write_Byte	* @brief  TM1620写入字节	* @param  dat -> 待写入数据	* @retval None      */static void TM1620_Write_Byte(uint8_t dat) {	uint8_t i = 0; 		CLR_STB;		for(i=0;i<8;i++)	{		CLR_CLK;		//准备数据位		if((dat & BIT0) == BIT0) //BIT0为宏定义,为0x01			SET_DIN;		else			CLR_DIN;		dat = dat >> 1; //移位,为发送下一位做准备		//拉高CLK,发送数据			SET_CLK;			__nop();	}	}
复制代码

TM1620 初始化函数:

/*	* @name   TM1620_Init	* @brief  TM1620初始化	* @param  None	* @retval None      */static void TM1620_Init() {	uint8_t i = 0;		//设置显示模式	TM1620_Write_Byte(Disp_Mode_GRID6_SEG8); 	SET_STB;  	    //设置地址自动增加模式	TM1620_Write_Byte(Write_Data_Addr_Auto_Add); 	SET_STB;		//利用循环清除显示寄存器地址	TM1620_Write_Byte(Disp_SFR_Addr_00H); //首地址 	for(i=0;i<Disp_SFR_Addr_Num;i++)		TM1620_Write_Byte(0x00);     SET_STB;  	//调节数码管辉度    TM1620_Write_Byte(Display.Brightness);	SET_STB; }
复制代码

数码管显示函数:

/*	* @name   Disp	* @brief  数码管显示  * @param  Disp_NUM:       数码管编号            Dat             数据0~F            Disp_DP_Status  小数点显示状态	* @retval None      */static void Disp(Disp_NUM_t Disp_NUM,uint8_t Dat,Disp_DP_Status_t Disp_DP_Status) {	//检查参数范围	if(Dat > 0x0F)	{		System.Assert_Failed();	}		//设置显示模式	TM1620_Write_Byte(Disp_Mode_GRID6_SEG8); 	SET_STB;		//设置地址固定模式	TM1620_Write_Byte(Write_Data_Addr_Fix); 	SET_STB;		//写地址(数码管编号)	TM1620_Write_Byte(Disp_NUM);	//写数据,并判断有无小数点	if(Disp_DP_Status == Disp_DP_ON)		TM1620_Write_Byte(Disp_Decode[Dat] + 0x80);     //Disp_Decode数组存贮的是数码管显示“0”~“F”的译码。	else		TM1620_Write_Byte(Disp_Decode[Dat]);	SET_STB;		//设置辉度  TM1620_Write_Byte(Display.Brightness);	SET_STB; }
复制代码

外部中断 0 回调函数:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){	if(GPIO_Pin == KEY1_Pin)	{		LED.LED_Flip(LED2);				switch(Display.Brightness)		{			case Brightness_level_1: Display.Brightness = Brightness_level_2; break;			case Brightness_level_2: Display.Brightness = Brightness_level_3; break;			case Brightness_level_3: Display.Brightness = Brightness_level_4; break;			case Brightness_level_4: Display.Brightness = Brightness_level_5; break;			case Brightness_level_5: Display.Brightness = Brightness_level_6; break;			case Brightness_level_6: Display.Brightness = Brightness_level_7; break;			case Brightness_level_7: Display.Brightness = Brightness_level_8; break;			case Brightness_level_8: Display.Brightness = Brightness_level_1; break;			default: Display.Brightness = Brightness_level_3;		}	}}
复制代码

九、立创商城供货信息



发布于: 刚刚阅读数: 6
用户头像

向阳逐梦

关注

人生享受编程,编程造就人生! 2022-06-01 加入

某公司芯片测试工程师,嵌入式开发工程师,InfoQ签约作者,阿里云星级博主,华为云·云享专家。座右铭:向着太阳,追逐梦想!

评论

发布
暂无评论
一种LED驱动专用控制电路_向阳逐梦_InfoQ写作社区