数据手册
数据手册解读
这里我们看管脚定义DIN和SCLK,一个数据线一个时钟线
SEG1~SEG8为段码,GRID1~GRID16为位码(共阴极情况下)
这里VDD给5V
数据指令
数据命令设置
地址命令设置
显示控制命令
共阴极硬件连接图
这里我们只介绍共阴极,共阳极需要在代码里调整,有兴趣可以私聊我
注意事项
TM1640驱动源码(非阻塞)
tm1640.c
//******************************************************************************
/**
* @Name : TM1640_Start
* @Date : 2025年4月21日
* @Description: TM1640起始
* @Parameters : None
* @Return : None
*/
void TM1640_Start(void)
{
TM_SDA_H();
TM_SCL_H();
__NOP();__NOP();
TM_SDA_H();
__NOP();__NOP();
TM_SDA_L();
__NOP();__NOP();
__NOP();__NOP();
TM_SCL_L();
__NOP();__NOP();
}
//******************************************************************************
/**
* @Name : TM1640_Stop
* @Date : 2025年4月21日
* @Description: TM1640结束
* @Parameters : None
* @Return : None
*/
void TM1640_Stop(void)
{
TM_SCL_H();
__NOP();__NOP();
TM_SDA_L();
__NOP();__NOP();
TM_SDA_H();
__NOP();__NOP();
TM_SCL_L();
TM_SDA_L();
}
//******************************************************************************
/**
* @Name : TM1640_WriteData
* @Date : 2025年4月21日
* @Description: 写入一字节的数据
* @Parameters : oneByte:需要发送的数据字节
* @Return : None
*/
void TM1640_WriteData(uint8_t oneByte)
{
uint8_t index;
for(index=0;index<8;index++)
{
TM_SCL_L();
if(oneByte&0x01)
TM_SDA_H();
else
TM_SDA_L();
__NOP();__NOP();__NOP();
TM_SCL_H();
oneByte=oneByte>>1;
}
TM_SCL_L();
__NOP();__NOP();
__NOP();__NOP();
TM_SDA_L();
__NOP();__NOP();
}
//******************************************************************************
/**
* @Name : TM1640_Handle
* @Date : 2025年4月21日
* @Description: 启动、写数据和控制显示
* @Parameters : None
* @Return : None
*/
void TM1640_Handle(void)
{
uint8_t index;
TM1640_Start();
TM1640_WriteData(CMD_DATA_1);//地址自动加1,普通模式
TM1640_Stop();
TM1640_Start();
TM1640_WriteData(START_ADDRESS_1);
for(index=0;index<smg_num;index++)
{
TM1640_WriteData(smg[index]);
}
TM1640_Stop();
TM1640_Start();
TM1640_WriteData(BRIGHTNESS_LEVEL_4);
TM1640_Stop();
__NOP();
}
这里smg[index]需要你自己去定义,然后将数组传入tm1640中就可以
tm1640.h
/*数码管数量*/
#define smg_num 16(最大16位)
/*显示控制命令,设置亮度打开显示屏,共8级亮度,也就是设置不同的脉冲宽度*/
#define BRIGHTNESS_LEVEL_1 0x88
#define BRIGHTNESS_LEVEL_2 0x89
#define BRIGHTNESS_LEVEL_3 0x8a
#define BRIGHTNESS_LEVEL_4 0x8b
#define BRIGHTNESS_LEVEL_5 0x8c
#define BRIGHTNESS_LEVEL_6 0x8d
#define BRIGHTNESS_LEVEL_7 0x8e
#define BRIGHTNESS_LEVEL_8 0x8f
#define CLOSE_DISPLAY 0x80
/*数据设置命令*/
#define CMD_DATA_1 0X40 //地址自动加1,普通模式 0100 0000
#define CMD_DATA_2 0X44 //地址固定,普通模式 0100 0100
#define CMD_DATA_3 0X48 //地址自动加1,内部测试模式 0100 1000
#define CMD_DATA_4 0X4C //地址固定,内部测试模式 0100 1100
/*地址命令设置 显存地址为0xC0-0xCF*/
#define START_ADDRESS_1 0XC0 //第一个数码管
#define START_ADDRESS_2 0XC1
#define START_ADDRESS_3 0XC2
#define START_ADDRESS_4 0XC3
#define START_ADDRESS_5 0XC4
#define START_ADDRESS_6 0XC5
#define START_ADDRESS_7 0XC6
#define START_ADDRESS_8 0XC7
#define START_ADDRESS_9 0XC8
#define START_ADDRESS_10 0XC9
#define START_ADDRESS_11 0XCa
#define START_ADDRESS_12 0XCb
#define START_ADDRESS_13 0XCc
#define START_ADDRESS_14 0XCd
#define START_ADDRESS_15 0XCe
#define START_ADDRESS_16 0XCf
#define TM_SCL_H() GPIOB->BSRR = GPIO_PIN_6
#define TM_SCL_L() GPIOB->BRR = GPIO_PIN_6
#define TM_SDA_H() GPIOB->BSRR = GPIO_PIN_7
#define TM_SDA_L() GPIOB->BRR = GPIO_PIN_7