数据手册
TM1640数据手册
数据手册解读
这里我们看管脚定义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();elseTM_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