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;主要用来驱动8×8的LED点阵屏,具体的请参考数据手册。
驱动逻辑:
数据格式
寄存器地址
上电时,地址默认设为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);
}
大概就是这个样子,后面再做补充。
作者:嵌入式王大锤