TM1640-单片机驱动

TM1640-LED 驱动控制专用芯片的驱动

芯片简介

TM1640 是一种LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 驱动等电路。本产品性能优良,质量可靠。主要应用于电子产品LED显示屏驱动。采用SOP28、 SSOP28的封装形式。

1.采用CMOS工艺;
2.显示模式(8 段×16 位);
3.辉度调节电路(占空比 8 级可调);
4.两线串行接口(SCLK, DIN);
5.振荡方式:内置RC振荡;
6.内置上电复位电路;
7.封装形式: SOP28、 SSOP28。

引脚说明
单价1块钱左右,供电支持3.3V、5V,注意驱动的LED是否支持5V,单个LED驱动电流最大支持50mA;主要用来驱动8x8的LED点阵屏,具体的请参考数据手册。

驱动逻辑:

驱动逻辑1
驱动逻辑2

数据格式

数据格式

寄存器地址

地址指令设置
上电时,地址默认设为C0H。
显示数据与芯片管脚以及显示地址之间的对应关系如下表所示:管脚映射
注意:芯片显示寄存器在上电瞬间其内部保存的值可能是随机不确定的,此时客户直接发送开屏命令,将有可能出现显示乱码。所以我司建议客户对显示寄存器进行一次上电清零操作,即上电后向16位显存地址 (C0H-CDH)中全部写入数据0x00。
控制指令

头文件代码

注意这是使用的是LL库,用HAL库更换为HAL里面的函数即可。

#ifndef	_TM1640_H
#define	_TM1640_H

#include "stm32f1xx_ll_gpio.h"

void TM1640Init(void);
void TM1640Close(void);
void TM1640Open(void);
void TM1640DisplaySetTime(const uint8_t Hour,const uint8_t Min);
void TM1640DisplayIntoalTime(const uint32_t Time);
#endif

C文件代码

注意这是使用的是LL库,用HAL库更换为HAL里面的函数即可。

#include "tm1640.h"
#define _TIM1640Data_Port       GPIOB
#define _TIM1640Data_Pin        LL_GPIO_PIN_3

#define _TIM1640Clk_Port        GPIOB
#define _TIM1640Clk_Pin         LL_GPIO_PIN_4

#define _Tm1640GpioReset(Port,Pin)   LL_GPIO_ResetOutputPin(Port,Pin)
#define _Tm1640GpioSet(Port,Pin)     LL_GPIO_SetOutputPin(Port,Pin)

#define DISP_OFF 0x80 
#define	DATA_COMMAND	0X40  

static void _Tm1640Delay(volatile uint32_t cnt){while(cnt){cnt--;}}
#define _Tm1640ShortDelay()        _Tm1640Delay(20)

uint8_t const ShuMaGuan[]={ //数码管显示内容数组
	0x3F,  //"0"
    0x06,  //"1"
    0x5B,  //"2"
    0x4F,  //"3"
    0x66,  //"4"
    0x6D,  //"5"
    0x7D,  //"6"
    0x07,  //"7"
    0x7F,  //"8"
    0x6F,  //"9"
    0x77,  //"A"
    0x7C,  //"B"
    0x39,  //"C"
    0x5E,  //"D"
    0x79,  //"E"
    0x71,  //"F"
    0x40,  //"-"
};

uint8_t writeData[8];//写数组

static void _TM1640_Start(void)//开始指令
{
  _Tm1640GpioSet(_TIM1640Clk_Port,_TIM1640Clk_Pin);
	_Tm1640ShortDelay();
  _Tm1640GpioSet(_TIM1640Data_Port,_TIM1640Data_Pin);    
	_Tm1640ShortDelay();
	_Tm1640GpioReset(_TIM1640Data_Port,_TIM1640Data_Pin);
	_Tm1640ShortDelay();
  _Tm1640GpioReset(_TIM1640Clk_Port,_TIM1640Clk_Pin);
}
static void _TM1640_Stop(void)//停止指令
{
	_Tm1640GpioSet(_TIM1640Clk_Port,_TIM1640Clk_Pin);
	_Tm1640ShortDelay();
	_Tm1640GpioReset(_TIM1640Data_Port,_TIM1640Data_Pin);
	_Tm1640ShortDelay();
	_Tm1640GpioSet(_TIM1640Data_Port,_TIM1640Data_Pin);
	_Tm1640ShortDelay();
  _Tm1640GpioReset(_TIM1640Clk_Port,_TIM1640Clk_Pin);
}

static void _TM1640_SendByte(uint8_t DATA)//发送字节函数			
{
	uint8_t i;
  	uint8_t temp = DATA;
	for(i=0;i<8;i++)
	{
		_Tm1640GpioReset(_TIM1640Clk_Port,_TIM1640Clk_Pin);
        _Tm1640ShortDelay();
        if(temp&0x01){
            _Tm1640GpioSet(_TIM1640Data_Port,_TIM1640Data_Pin);
        }
        else {
            _Tm1640GpioReset(_TIM1640Data_Port,_TIM1640Data_Pin);
        }
		_Tm1640ShortDelay();
		_Tm1640GpioSet(_TIM1640Clk_Port,_TIM1640Clk_Pin);
    temp>>=1;
	}
    _Tm1640GpioReset(_TIM1640Clk_Port,_TIM1640Clk_Pin);
}

static void _TM1640_SendCOM(uint8_t cmd)//发送命令函数	
{
	_TM1640_Start();
	_TM1640_SendByte(cmd);
	_TM1640_Stop();
}

static void _TM1640_WriteSRAM(const uint8_t *Write_p)//写入SRAM数据
{
	uint8_t i;	
	_TM1640_SendCOM(0x40);
	_TM1640_Start();
	_TM1640_SendByte(0xc0);
	for(i=0;i<8;i++){//使用的地址自动加1模式
        _TM1640_SendByte(Write_p[i]);
    }
	_TM1640_Stop();
}

void TM1640DisplaySetTime(const uint8_t Hour,const uint8_t Min)//显示设置时间
{
    if(Hour==0xFF&&Min==0xFF){
        writeData[4] = ShuMaGuan[0x10];
        writeData[5] = ShuMaGuan[0x10];
        writeData[6] = ShuMaGuan[0x10];
        writeData[7] = ShuMaGuan[0x10];
    }
    else {
        writeData[4] = ShuMaGuan[Hour/10];
        writeData[5] = ShuMaGuan[Hour%10];
        writeData[6] = ShuMaGuan[Min/10];
        writeData[7] = ShuMaGuan[Min%10];
    }
    _TM1640_WriteSRAM(writeData);
}
void TM1640DisplayIntoalTime(const uint32_t Time)//显示实时时间
{
    writeData[0] = ShuMaGuan[Time/1000];
    writeData[1] = ShuMaGuan[Time%1000/100];
    writeData[2] = ShuMaGuan[Time%100/10];
    writeData[3] = ShuMaGuan[Time%10];
    _TM1640_WriteSRAM(writeData);
}
void TM1640Close(void)//关闭显示
{
    _TM1640_Start();
    _TM1640_SendByte(0x80);
    _TM1640_Stop();
    _TM1640_WriteSRAM(writeData);
}
void TM1640Open(void)//打开显示
{
    _TM1640_Start();
    _TM1640_SendByte(0x8F);
    _TM1640_Stop();
    _TM1640_WriteSRAM(writeData);
}
void TM1640Init(void)//初始化函数
{
    uint8_t i;
    _TM1640_Start();
    _TM1640_SendByte(0x8F);// 开显示
    _TM1640_Stop();
    for(i=0;i<8;i++){
       writeData[i]=0xFF;  //'H' 
    }
    _TM1640_WriteSRAM(writeData);
}

大概就是这个样子,后面再做补充。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值