TM1637是一款广泛应用于数码管显示的驱动芯片,它通过简单的两线接口(时钟线CLK和数据线DIO)与微控制器进行通信,实现对数码管的控制。本文将详细介绍TM1637的驱动原理,帮助您更好地理解和使用这款芯片。
TM1637采用串行通信协议,通过CLK和DIO与微控制器进行通信。通信过程中,微控制器首先发送起始信号,然后发送指令和数据,最后发送结束信号。
起始条件是CLK为高电平时,DIO由高变低。具体实现如下:
void TM1637_Start(void){
TM1637_W_SDA(1);
TM1637_W_SCL(1);
TM1637_W_SDA(0);
TM1637_W_SCL(0);}
结束条件是CLK为高电平时,DIO由低变高。具体实现如下:
void TM1637_Stop(void){
TM1637_W_SCL(0);
TM1637_W_SDA(0);
TM1637_W_SCL(1);
TM1637_W_SDA(1);}
数据传输过程中,当CLK为高电平时,DIO上的信号必须保持不变;只有CLK为低电平时,DIO上的信号才能改变。数据输入的开始条件是CLK为高电平时,DIO由高变低;结束条件是CLK为高时,DIO由低电平变为高电平。
TM1637的数据传输带有应答信号ACK,当传输数据正确时,会在第八个时钟的下降沿,芯片内部会产生一个应答信号ACK将DIO管脚拉低,在第九个时钟结束之后释放DIO口线。发送一个字节的具体实现如下:
void TM1637_Write_Byte(uint8_t data){
uint8_t i;
TM1637_W_SCL(0);
for (i = 0; i < 8; i++)
{
if(data & 0x01)
{
TM1637_W_SDA(1);
}
else
{
TM1637_W_SDA(0);
}
data = data >> 1;
TM1637_W_SCL(1);
TM1637_W_SCL(0);
}}
uint8_t TM1637_ReceiveAck(void){
uint8_t AckBit;
TM1637_W_SDA(1);
TM1637_W_SCL(1);
AckBit = TM1637_R_SDA();
TM1637_W_SCL(0);
return AckBit;}
TM1637的指令格式包括起始位、数据位和结束位。起始位为高电平,数据位为8位,结束位为低电平。指令可以分为显示指令、设置指令和读取指令等。
显示指令用于控制数码管的显示内容。通过发送特定的指令和数据,可以设置数码管显示的数字或字符。
设置指令用于配置TM1637的各种参数,如显示亮度、扫描频率等。
读取指令用于读取TM1637的状态或按键输入数据。
TM1637内部集成了驱动芯片和LED数码管。驱动芯片负责接收微控制器发送的指令,并将其转换为LED数码管的控制信号,LED数码管则根据控制信号显示相应的数字或字符。
SG1 | SG2 | SG3 | SG4 | SG5 | SG6 | SG7 | SG8 | |
---|---|---|---|---|---|---|---|---|
K1 | 1110_1111 | 0110_1111 | 1010_1111 | 0010_1111 | 1100_1111 | 0100_1111 | 1000_1111 | 0000_1111 |
K2 | 1111_0111 | 0111_0111 | 1011_0111 | 0011_0111 | 1101_0111 | 0101_0111 | 1001_0111 | 0001_0111 |
在无按键按下时,读键数据为:1111_1111,低位在前,高位在后。
void TM1637_Init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11);}
。具体显示数据的代码如下:
void TM1637_WriteData(uint8_t u8Addr, uint8_t u8Data){
TM1637_Start();
TM1637_Write_Byte(u8Addr);
TM1637_ReceiveAck();
TM1637_Write_Byte(u8Data);
TM1637_ReceiveAck();
TM1637_Stop();}
。设置亮度的代码如下:
void TM1637_SetBrightness(uint8_t u8Brt){
TM1637_WriteCmd(0x88 | u8Brt);}
void TM1637_Switch(bool bState){
bState ? TM1637_WriteCmd(0x88) : TM1637_WriteCmd(0x80);}