TM1637驱动IIC I2C 32单片机

TM1637是一款由天微电子(Titan Micro Electronics)设计的专用显示驱动芯片,广泛应用于LED数码管、段码屏等显示设备的控制。其核心功能是通过简化通信协议和硬件接口,实现高效的多位数码管驱动与亮度调节,同时支持按键扫描功能

代码

#include "tm1637.h"		
volatile uint8_t seconds = 0;
volatile uint8_t minutes = 0;
volatile uint8_t hours = 0;
void TM1637_W_SCL(uint8_t x)
{
	HAL_GPIO_WritePin(TM1637_SCL_PORT, TM1637_SCL_PIN, (GPIO_PinState)x);
	Delay_us(10);
}	

void TM1637_W_SDA(uint8_t x)
{
	HAL_GPIO_WritePin(TM1637_SDA_PORT, TM1637_SDA_PIN, (GPIO_PinState)x);
	Delay_us(10);
}

uint8_t TM1637_R_SDA(void)
{
	uint8_t value;
	value = HAL_GPIO_ReadPin(TM1637_SDA_PORT, TM1637_SDA_PIN);
	Delay_us(10);
	return value;
}
uint8_t Data_code[22] =
{
    0x3F,/*0*/
    0x06,/*1*/
    0x5B,/*2*/
    0x4F,/*3*/
    0x66,/*4*/
    0x6D,/*5*/
    0x7D,/*6*/
    0x07,/*7*/
    0x7F,/*8*/
    0x6F,/*9*/
		0x77,/*10 A*/
    0x7C,/*11 b*/
    0x58,/*12 c*/
    0x5E,/*13 d*/
    0x79,/*14 E*/
    0x71,/*15 F*/
    0x76,/*16 H*/
    0x38,/*17 L*/
    0x54,/*18 n*/
    0x73,/*19 P*/
    0x3E,/*20 U*/
    0x00,/*21 黑屏*/
		
};
uint8_t Data_TEST[10] = {
    0x01, /* 0 000 0001 */
    0x02, /* 0 000 0010 */
    0x04, /* 0 000 0100 */
    0x08, /* 0 000 1000 */
    0x10, /* 0 001 0000 */
    0x20, /* 0 010 0000 */
    0x40, /* 0 100 0000 */
    0x80, /* 1 000 0000 */
    0x00, /* 0 000 0000 */
};

GPIO初始化

void TM1637_GPIO_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;

	TM1637_SCL_CLK_ENABLE();
	TM1637_SDA_CLK_ENABLE();
	
	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出
	GPIO_InitStructure.Pull = GPIO_PULLUP;
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
	//SCL
	GPIO_InitStructure.Pin = TM1637_SCL_PIN;

  HAL_GPIO_Init(TM1637_SCL_PORT, &GPIO_InitStructure);
	//SDA
	GPIO_InitStructure.Pin = TM1637_SDA_PIN;
  HAL_GPIO_Init(TM1637_SDA_PORT, &GPIO_InitStructure);
	

	HAL_GPIO_WritePin(TM1637_SCL_PORT, TM1637_SCL_PIN, GPIO_PIN_SET);
	HAL_GPIO_WritePin(TM1637_SDA_PORT, TM1637_SDA_PIN, GPIO_PIN_SET);

}

IIC通信

//起始信号
void TM1637_I2C_Start( void )
{
	TM1637_W_SDA(1);
	TM1637_W_SCL(1);
	TM1637_W_SDA(0);
	TM1637_W_SCL(0);
}

//停止信号
void TM1637_I2C_Stop( void )
{
	TM1637_W_SDA(0);
	TM1637_W_SCL(1);
	TM1637_W_SDA(1);
}

//发送字节
void TM1637_I2C_SendByte(uint8_t Byte)
{
	uint8_t i;
	for( i = 0; i < 8; i++ )
	{
		TM1637_W_SDA( Byte & (0X01 << i));
		TM1637_W_SCL(1);
		TM1637_W_SCL(0);
	}
}

//接收字节
uint8_t TM1637_I2C_ReceiveByte(void)
{
	uint8_t i = 0 , Byte = 0x00;
	TM1637_W_SDA(1);
	Delay_us(5);
	for(i = 0 ; i < 8; i++)
	{
		TM1637_W_SCL(1);
		if( TM1637_R_SDA() )
		{
			Byte |= (0x80 >> i);
		}
		TM1637_W_SCL(0);
	}
	return Byte;
}

//发送应答位
void TM1637_I2C_SendAck(uint8_t AckBit)
{
	TM1637_W_SDA( AckBit );
	TM1637_W_SCL(1);
	TM1637_W_SCL(0);
}

//接收应答位
uint8_t TM1637_I2C_ReceiveAck(void)
{
	uint8_t AckBit ;
	TM1637_W_SCL(1);
	TM1637_W_SDA(1);
	AckBit = TM1637_R_SDA();
	TM1637_W_SCL(0);
	

	return AckBit;

}

TM1637逻辑实现

TM1637模式选择
void TM1637_SelectMode(uint8_t dig, uint8_t dig_data, uint8_t mode)
{
	static uint8_t colon_state = 0;
	uint8_t sendData = 0;
	

	//位置有效性检验
	if(dig > 4) return;
	switch(mode)
	{
		case TM1637_MODE_TEST:	//测试模式
			sendData = Data_TEST[dig_data];//发送测试数据
			break;
		
		case TM1637_MODE_NUM:		//常规数字显示模式
			sendData = Data_code[dig_data];
			break;
		
		case TM1637_MODE_TIME:	//时间显示模式(冒号显示)
			sendData = Data_code[dig_data];//常规数据
			if(dig == 1)
			{
				(colon_state == 0)?(sendData |= 0x80) : sendData;
				colon_state ^= 1;//状态反转
			}
			break;
		
		case TM1637_MODE_COUNTDOWN:	//倒计时模式(常亮冒号)
			sendData = Data_code[dig_data];
			if(dig == 1)
			{
				sendData |= 0x80;
			}
			break;
		
		default:
			
			break;
	}
	
	TM1637_I2C_SendByte(sendData);

}
TM1637显示
void TM1637_Display(uint8_t dig, uint8_t dig_data, uint8_t mode)
{
	TM1637_I2C_Start();
	TM1637_I2C_SendByte(0x44);								//写数据到显示寄存器 40H 地址自动加1 模式, //44H 固定地址模式,本程序采用自加1模式																		
	TM1637_I2C_ReceiveAck();
	TM1637_I2C_Stop();

	TM1637_I2C_Start();
	TM1637_I2C_SendByte( 0xC0 | dig );					//地址命令设置 显示地址 C0H---C5H
	TM1637_I2C_ReceiveAck();
	
	TM1637_SelectMode(dig, dig_data, mode);
	TM1637_I2C_ReceiveAck();
	TM1637_I2C_Stop();

}
TM1637设置显示亮度
level : 设置亮度等级  0---7
void TM1637_SetBrightness(uint8_t level)
{
	TM1637_I2C_Start();
	TM1637_I2C_SendByte( 0x88 | level );							//开显示,最大亮度-----调节脉冲宽度控制0---7  脉冲宽度14/16
	TM1637_I2C_ReceiveAck();
	TM1637_I2C_Stop();
}
上电自检
void TM1637_SelfTest(void)
{
	uint8_t i = 0;
	for( i = 0 ; i< 10 ;i++)
	{
		TM1637_Display(0, i, TM1637_MODE_TEST);
		TM1637_Display(1, i, TM1637_MODE_TEST);
		TM1637_Display(2, i, TM1637_MODE_TEST);
		TM1637_Display(3, i, TM1637_MODE_TEST);
		Delay_ms(350);
	}
}
初始化
void Digit_Config(uint8_t Brightness)
{
	TM1637_GPIO_Init();
	TM1637_SetBrightness(Brightness);
	TM1637_SelfTest();
}
数码管显示错误
void Digit_DisaplayErorr(uint8_t errorNum)
{
	uint8_t dig3, dig4;

	if(errorNum > 99) return ;//判断越界
	dig3 = errorNum/10;
	dig4 = errorNum%10;
	
	TM1637_Display(0, 21, TM1637_MODE_NUM);//熄灭
	TM1637_Display(1, 14, TM1637_MODE_NUM);//E
	TM1637_Display(2, dig3, TM1637_MODE_NUM);
	TM1637_Display(3, dig4, TM1637_MODE_NUM);

}
数码管显示数字
void Digit_DisaplayNum(uint16_t num)
{
	uint8_t thousand, hundred, ten, single;
	

	thousand = num/1000;		//千位
	hundred = num/100%10;		//百位
	ten = num/10%10;				//十位
	single = num%10;				//个位
	
	TM1637_Display(0, thousand, TM1637_MODE_NUM);
	TM1637_Display(1, hundred,  TM1637_MODE_NUM);
	TM1637_Display(2, ten, 			TM1637_MODE_NUM);
	TM1637_Display(3, single,   TM1637_MODE_NUM);

}
TM1637其他接口
void Digit_DisaplaySetTime(uint8_t dig1, uint8_t dig2, uint8_t dig3, uint8_t dig4)
{
	

	TM1637_Display(0, dig1, TM1637_MODE_NUM);
	TM1637_Display(1, dig2, TM1637_MODE_NUM);
	TM1637_Display(2, dig3, TM1637_MODE_NUM);
	TM1637_Display(3, dig4, TM1637_MODE_NUM);

}
```


void Digit_DisaplayTime(uint8_t hours, uint8_t minutes)
{
	uint8_t h1, h2, m1, m2;
	h1 = hours/10;
	h2 = hours%10;
	m1 = minutes/10;
	m2 = minutes%10;
	TM1637_Display(0, h1, TM1637_MODE_TIME);
	TM1637_Display(1, h2, TM1637_MODE_TIME);
	TM1637_Display(2, m1, TM1637_MODE_TIME);
	TM1637_Display(3, m2, TM1637_MODE_TIME);
}


void Digit_DisaplayCountdown(uint16_t Seconds)
{
	uint8_t m1, m2, s1, s2, minute, second;
	//校验数据有效性
	if(Seconds > 6000) return;
	

	//秒->分钟
	//分钟(0~99)
	//秒(0~60)
	
	minute = Seconds / 60;
	second = Seconds % 60;
	m1 = minute/10;
	m2 = minute%10;
	s1 = second/10;
	s2 = second%10;
	
	TM1637_Display(0, m1, TM1637_MODE_COUNTDOWN);
	TM1637_Display(1, m2, TM1637_MODE_COUNTDOWN);
	TM1637_Display(2, s1, TM1637_MODE_COUNTDOWN);
	TM1637_Display(3, s2, TM1637_MODE_COUNTDOWN);

}



void Digit_SetTimeNow(uint8_t hour, uint8_t minute, uint8_t second)
{
	// hours = hour;
	// minutes = mintue;
	// seconds = second;
//	digit.current_time[0] = hour;
//	digit.current_time[1] = minute;
//	digit.current_time[2] = second;
}

TM1637.h

#ifndef _TM1637_H_
#define _TM1637_H_

#include "py32f0xx_hal.h"
#include "Delay.h"

#define		TM1637_SCL_CLK_ENABLE			__HAL_RCC_GPIOB_CLK_ENABLE
#define		TM1637_SCL_PORT						GPIOB
#define		TM1637_SCL_PIN						GPIO_PIN_1

#define		TM1637_SDA_CLK_ENABLE			__HAL_RCC_GPIOB_CLK_ENABLE
#define		TM1637_SDA_PORT						GPIOB
#define		TM1637_SDA_PIN						GPIO_PIN_2


typedef struct{
	uint8_t hour;//时钟
	uint8_t minute;//分钟
	uint8_t second;//秒钟
}Time_t;

enum{
	TM1637_MODE_TEST = 0,
	TM1637_MODE_NUM,
	TM1637_MODE_TIME,
	TM1637_MODE_COUNTDOWN,
};

extern volatile uint8_t seconds;
extern volatile uint8_t minutes;
extern volatile uint8_t hours;


void TM1637_GPIO_Init(void);
void TM1637_I2C_Start( void );
void TM1637_I2C_Stop( void );
uint8_t TM1637_I2C_ReceiveAck(void);
void TM1637_I2C_SendAck(uint8_t AckBit);
void TM1637_I2C_SendByte(uint8_t Byte);
void TM1637_SelectMode(uint8_t dig, uint8_t dig_data, uint8_t mode);
void TM1637_Display(uint8_t dig, uint8_t dig_data, uint8_t mode);
void TM1637_SetBrightness(uint8_t level);
void TM1637_SelfTest(void);

void Digit_Config(uint8_t Brightness);//初始化配置
void Digit_DisaplayErorr(uint8_t errorNum);//显示错误
void Digit_DisaplayNum(uint16_t num);//显示数字
void Digit_DisaplayTime(uint8_t hours, uint8_t minutes);//显示时间(时,分)
void Digit_DisaplayCountdown(uint16_t seconds);//显示倒计时
void Digit_SetTimeNow(uint8_t hour, uint8_t mintue, uint8_t second);


#endif

TM1637.c

#include "tm1637.h"		

volatile uint8_t seconds = 0;
volatile uint8_t minutes = 0;
volatile uint8_t hours = 0;

void TM1637_W_SCL(uint8_t x)
{
	HAL_GPIO_WritePin(TM1637_SCL_PORT, TM1637_SCL_PIN, (GPIO_PinState)x);
	Delay_us(10);
}	

void TM1637_W_SDA(uint8_t x)
{
	HAL_GPIO_WritePin(TM1637_SDA_PORT, TM1637_SDA_PIN, (GPIO_PinState)x);
	Delay_us(10);
}

uint8_t TM1637_R_SDA(void)
{
	uint8_t value;
	value = HAL_GPIO_ReadPin(TM1637_SDA_PORT, TM1637_SDA_PIN);
	Delay_us(10);
	return value;
}


/*********************************************************************************************
*@description:数码管显示库
*@Author: sand
*@param[in]: 22个
*@return: 
*@others 
*********************************************************************************************/
uint8_t Data_code[22] =
{
    0x3F,/*0*/
    0x06,/*1*/
    0x5B,/*2*/
    0x4F,/*3*/
    0x66,/*4*/
    0x6D,/*5*/
    0x7D,/*6*/
    0x07,/*7*/
    0x7F,/*8*/
    0x6F,/*9*/
		0x77,/*10 A*/
    0x7C,/*11 b*/
    0x58,/*12 c*/
    0x5E,/*13 d*/
    0x79,/*14 E*/
    0x71,/*15 F*/
    0x76,/*16 H*/
    0x38,/*17 L*/
    0x54,/*18 n*/
    0x73,/*19 P*/
    0x3E,/*20 U*/
    0x00,/*21 黑屏*/
		
};

/*********************************************************************************************
*@description:测试库
*@Author: sand
*@param[in]: 10个
*@return: 
*@others  数码管上的":" 符号( dig2 |0x80)  第二个数码管
*********************************************************************************************/
uint8_t Data_TEST[10] = {
    0x01, /* 0 000 0001 */
    0x02, /* 0 000 0010 */
    0x04, /* 0 000 0100 */
    0x08, /* 0 000 1000 */
    0x10, /* 0 001 0000 */
    0x20, /* 0 010 0000 */
    0x40, /* 0 100 0000 */
    0x80, /* 1 000 0000 */
    0x00, /* 0 000 0000 */
};
 
/*********************************************************************************************
*@description: GPIO初始化
*@Author: sand
*@param[in]: none
*@return: 
*@others 
*********************************************************************************************/
void TM1637_GPIO_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;

	TM1637_SCL_CLK_ENABLE();
	TM1637_SDA_CLK_ENABLE();

	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出
	GPIO_InitStructure.Pull = GPIO_PULLUP;
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
	//SCL
	GPIO_InitStructure.Pin = TM1637_SCL_PIN;
  HAL_GPIO_Init(TM1637_SCL_PORT, &GPIO_InitStructure);
	//SDA
	GPIO_InitStructure.Pin = TM1637_SDA_PIN;
  HAL_GPIO_Init(TM1637_SDA_PORT, &GPIO_InitStructure);
	
	HAL_GPIO_WritePin(TM1637_SCL_PORT, TM1637_SCL_PIN, GPIO_PIN_SET);
	HAL_GPIO_WritePin(TM1637_SDA_PORT, TM1637_SDA_PIN, GPIO_PIN_SET);
}
 
//起始信号
void TM1637_I2C_Start( void )
{
	TM1637_W_SDA(1);
	TM1637_W_SCL(1);
	TM1637_W_SDA(0);
	TM1637_W_SCL(0);
}
 
//停止信号
void TM1637_I2C_Stop( void )
{
	TM1637_W_SDA(0);
	TM1637_W_SCL(1);
	TM1637_W_SDA(1);
}

//发送字节
void TM1637_I2C_SendByte(uint8_t Byte)
{
	uint8_t i;
	for( i = 0; i < 8; i++ )
	{
		TM1637_W_SDA( Byte & (0X01 << i));
		TM1637_W_SCL(1);
		TM1637_W_SCL(0);
	}
}

//接收字节
uint8_t TM1637_I2C_ReceiveByte(void)
{
	uint8_t i = 0 , Byte = 0x00;
	TM1637_W_SDA(1);
	Delay_us(5);
	for(i = 0 ; i < 8; i++)
	{
		TM1637_W_SCL(1);
		if( TM1637_R_SDA() )
		{
			Byte |= (0x80 >> i);
		}
		TM1637_W_SCL(0);
	}
	return Byte;
}

//发送应答位
void TM1637_I2C_SendAck(uint8_t AckBit)
{
	TM1637_W_SDA( AckBit );
	TM1637_W_SCL(1);
	TM1637_W_SCL(0);
}

//接收应答位
uint8_t TM1637_I2C_ReceiveAck(void)
{
	uint8_t AckBit ;
	TM1637_W_SCL(1);
	TM1637_W_SDA(1);
	AckBit = TM1637_R_SDA();
	TM1637_W_SCL(0);
	
	return AckBit;
}

//TM1637模式选择
void TM1637_SelectMode(uint8_t dig, uint8_t dig_data, uint8_t mode)
{
	static uint8_t colon_state = 0;
	uint8_t sendData = 0;
	
	//位置有效性检验
	if(dig > 4) return;
	switch(mode)
	{
		case TM1637_MODE_TEST:	//测试模式
			sendData = Data_TEST[dig_data];//发送测试数据
			break;
		
		case TM1637_MODE_NUM:		//常规数字显示模式
			sendData = Data_code[dig_data];
			break;
		
		case TM1637_MODE_TIME:	//时间显示模式(冒号显示)
			sendData = Data_code[dig_data];//常规数据
			if(dig == 1)
			{
				(colon_state == 0)?(sendData |= 0x80) : sendData;
				colon_state ^= 1;//状态反转
			}
			break;
		
		case TM1637_MODE_COUNTDOWN:	//倒计时模式(常亮冒号)
			sendData = Data_code[dig_data];
			if(dig == 1)
			{
				sendData |= 0x80;
			}
			break;
		
		default:
			
			break;
	}
	
	TM1637_I2C_SendByte(sendData);
}


//TM1637显示
void TM1637_Display(uint8_t dig, uint8_t dig_data, uint8_t mode)
{
	TM1637_I2C_Start();
	TM1637_I2C_SendByte(0x44);								//写数据到显示寄存器 40H 地址自动加1 模式, //44H 固定地址模式,本程序采用自加1模式																		
	TM1637_I2C_ReceiveAck();
	TM1637_I2C_Stop();

	TM1637_I2C_Start();
	TM1637_I2C_SendByte( 0xC0 | dig );					//地址命令设置 显示地址 C0H---C5H
	TM1637_I2C_ReceiveAck();
	
	TM1637_SelectMode(dig, dig_data, mode);
	TM1637_I2C_ReceiveAck();
	TM1637_I2C_Stop();
}

 
// TM1637设置显示亮度			level : 设置亮度等级  0---7
void TM1637_SetBrightness(uint8_t level)
{
	TM1637_I2C_Start();
	TM1637_I2C_SendByte( 0x88 | level );							//开显示,最大亮度-----调节脉冲宽度控制0---7  脉冲宽度14/16
	TM1637_I2C_ReceiveAck();
	TM1637_I2C_Stop();
}

//上电自检
void TM1637_SelfTest(void)
{
	uint8_t i = 0;
	for( i = 0 ; i< 10 ;i++)
	{
		TM1637_Display(0, i, TM1637_MODE_TEST);
		TM1637_Display(1, i, TM1637_MODE_TEST);
		TM1637_Display(2, i, TM1637_MODE_TEST);
		TM1637_Display(3, i, TM1637_MODE_TEST);
		Delay_ms(350);
	}
}

/*********************************************************************************************
*@description:数码管初始化配置
*@Author: sand
*@param[in]: Brightness:亮度(0~7)
*@return: none
*@others 
*********************************************************************************************/
void Digit_Config(uint8_t Brightness)
{
	TM1637_GPIO_Init();
	TM1637_SetBrightness(Brightness);
	TM1637_SelfTest();
}

/*********************************************************************************************
*@description:数码管显示错误
*@Author: sand
*@param[in]: errorNum 错误码
*@return: none
*@others 
*********************************************************************************************/
void Digit_DisaplayErorr(uint8_t errorNum)
{
	uint8_t dig3, dig4;

	if(errorNum > 99) return ;//判断越界
	dig3 = errorNum/10;
	dig4 = errorNum%10;

	TM1637_Display(0, 21, TM1637_MODE_NUM);//熄灭
	TM1637_Display(1, 14, TM1637_MODE_NUM);//E
	TM1637_Display(2, dig3, TM1637_MODE_NUM);
	TM1637_Display(3, dig4, TM1637_MODE_NUM);
}

/*********************************************************************************************
*@description:数码管显示数字
*@Author: sand
*@param[in]: num 数字(0~9999)
*@return: none
*@others 
*********************************************************************************************/
void Digit_DisaplayNum(uint16_t num)
{
	uint8_t thousand, hundred, ten, single;
	
	thousand = num/1000;		//千位
	hundred = num/100%10;		//百位
	ten = num/10%10;				//十位
	single = num%10;				//个位
	
	TM1637_Display(0, thousand, TM1637_MODE_NUM);
	TM1637_Display(1, hundred,  TM1637_MODE_NUM);
	TM1637_Display(2, ten, 			TM1637_MODE_NUM);
	TM1637_Display(3, single,   TM1637_MODE_NUM);
}

/*********************************************************************************************
*@description:数码管显示设置时间(中间带两点)
*@Author: sand
*@param[in]: dig1:第一个数码管 dig2:第二个数码管 dig3:第三个数码管 dig4:第四个数码管
*@return: none
*@others 
*********************************************************************************************/
void Digit_DisaplaySetTime(uint8_t dig1, uint8_t dig2, uint8_t dig3, uint8_t dig4)
{
	
	TM1637_Display(0, dig1, TM1637_MODE_NUM);
	TM1637_Display(1, dig2, TM1637_MODE_NUM);
	TM1637_Display(2, dig3, TM1637_MODE_NUM);
	TM1637_Display(3, dig4, TM1637_MODE_NUM);
}

/*********************************************************************************************
*@description:数码管显示时间
*@Author: sand
*@param[in]: hours:小时, minutes:分钟
*@return: none
*@others 
*********************************************************************************************/
void Digit_DisaplayTime(uint8_t hours, uint8_t minutes)
{
	uint8_t h1, h2, m1, m2;
	h1 = hours/10;
	h2 = hours%10;
	m1 = minutes/10;
	m2 = minutes%10;
	TM1637_Display(0, h1, TM1637_MODE_TIME);
	TM1637_Display(1, h2, TM1637_MODE_TIME);
	TM1637_Display(2, m1, TM1637_MODE_TIME);
	TM1637_Display(3, m2, TM1637_MODE_TIME);
}

/*********************************************************************************************
*@description:数码管显示倒计时
*@Author: sand
*@param[in]: minutes:分钟, seconds:秒钟
*@return: none
*@others 
*********************************************************************************************/
void Digit_DisaplayCountdown(uint16_t Seconds)
{
	uint8_t m1, m2, s1, s2, minute, second;
	//校验数据有效性
	if(Seconds > 6000) return;
	
	//秒->分钟
	//分钟(0~99)
	//秒(0~60)
	
	minute = Seconds / 60;
	second = Seconds % 60;
	m1 = minute/10;
	m2 = minute%10;
	s1 = second/10;
	s2 = second%10;
	
	TM1637_Display(0, m1, TM1637_MODE_COUNTDOWN);
	TM1637_Display(1, m2, TM1637_MODE_COUNTDOWN);
	TM1637_Display(2, s1, TM1637_MODE_COUNTDOWN);
	TM1637_Display(3, s2, TM1637_MODE_COUNTDOWN);
}

/*********************************************************************************************
*@description:数码管设置当前时间
*@Author: sand
*@param[in]: hour:时钟 minutes:分钟, seconds:秒钟
*@return: none
*@others 
*********************************************************************************************/
void Digit_SetTimeNow(uint8_t hour, uint8_t minute, uint8_t second)
{
	// hours = hour;
	// minutes = mintue;
	// seconds = second;
//	digit.current_time[0] = hour;
//	digit.current_time[1] = minute;
//	digit.current_time[2] = second;
}

### 回答1: stm32f103单片机可以通过使用tm1637芯片来驱动4位数码管。tm1637芯片是一种专门用于数码管控制的驱动芯片,其具有方便的接口和简单的控制方式。 首先,我们需要连接stm32f103单片机tm1637芯片。将stm32f103的SCL引脚连接到tm1637的CLK引脚,将stm32f103的SDA引脚连接到tm1637的DIO引脚。此外,还需要将stm32f103的VCC和GND引脚分别连接到tm1637的VCC和GND引脚,以提供电源。最后,将数码管的共阴极或共阳极引脚连接到tm1637的对应引脚。 接下来,我们可以通过编写代码来控制tm1637芯片。首先需要引入tm1637的库文件,并进行相关的初始化设置。之后,可以使用库文件提供的函数来设置显示内容和控制数码管的亮度等。 在代码中,我们可以使用数字数组来表示需要显示的数字。例如,如果要显示数字1234,可以使用以下代码: ``` uint8_t num[] = {0x03, 0x06, 0x5B, 0x4F}; ``` 然后,我们可以调用库函数来设置数码管的显示内容。例如,使用以下代码来显示数字1234: ``` tm1637_display_all(num); ``` 除了显示数字,tm1637芯片还可以用来显示其他字符和符号。可以通过在数字数组中设置对应的数值来显示特定的字符。例如,使用以下代码来显示字符A: ``` uint8_t chA = 0x77; tm1637_display_all(&chA); ``` 最后,为了方便使用,可以设置tm1637芯片的亮度等级。可以使用以下代码来设置亮度等级为7: ``` tm1637_set_brightness(7); ``` 通过以上的步骤,可以成功驱动4位数码管并在stm32f103单片机上显示所需的内容。 ### 回答2: STM32F103单片机可以使用TM1637芯片来驱动4位数码管。 首先,需要将TM1637芯片与STM32F103单片机进行连接。将TM1637的SCL引脚连接到STM32F103的SCL引脚,将TM1637的SDA引脚连接到STM32F103的SDA引脚,将TM1637的VCC引脚连接到STM32F103的5V电源引脚,将TM1637的GND引脚连接到STM32F103的地引脚。 接下来,在STM32F103的代码中,需要使用相应的库函数来控制TM1637芯片。首先,需要初始化TM1637芯片,可以通过设置相关的寄存器来配置芯片的工作模式和亮度等参数。然后,可以通过发送数据的方式向TM1637芯片传送需要显示的数字或字母等信息。 具体使用TM1637芯片驱动4位数码管的步骤如下: 1. 引入相关的头文件和库函数,例如:#include "stm32f10x.h"。 2. 初始化STM32F103的GPIO口和I2C通信模块,例如:GPIO_Init()。 3. 配置TM1637芯片的初始化参数,例如:通过设置相关的寄存器来配置芯片的工作模式和亮度等参数。 4. 编写相应的函数来发送数据到TM1637芯片,例如:通过发送I2C通信协议来向TM1637芯片传送需要显示的数字或字母等信息。 5. 调用上述函数来实现将需要显示的内容发送到TM1637芯片,例如:调用display()函数。 6. 在主函数中调用相关的初始化函数和显示函数,例如:在while循环中不断调用display()函数来更新显示内容。 通过上述步骤,STM32F103单片机就可以使用TM1637芯片来驱动4位数码管,并实现需要显示的数字、字母或其他信息的功能。 ### 回答3: STM32F103单片机可以使用TM1637芯片来驱动4位数码管。 TM1637是一种常用的数码管驱动芯片,它可以通过IIC总线与单片机进行通信。STM32F103单片机内部集成了多个IIC接口,因此可以直接与TM1637芯片进行通信。 首先,需要在STM32F103单片机上配置IIC通信引脚,可以选择任何可用的GPIO引脚。然后在程序中初始化IIC通信,并将其设置为适当的时钟频率。 然后,可以通过IIC总线向TM1637芯片发送命令和数据,以控制数码管的显示。可以通过设置传输的字节数据,来控制数码管的亮灭状态,数值显示等。 例如,要在数码管上显示数字1234,可以按以下步骤操作: 1. 发送命令设置数码管的亮度和显示格式。 2. 发送第一个字节数据,将数值1的编码发送给第一位数码管。 3. 发送第二个字节数据,将数值2的编码发送给第二位数码管。 4. 发送第三个字节数据,将数值3的编码发送给第三位数码管。 5. 发送第四个字节数据,将数值4的编码发送给第四位数码管。 通过这种方式,可以控制TM1637芯片驱动4位数码管显示不同的数字、字母和符号等。需要根据具体芯片规格书和数码管的接线情况,正确配置和发送命令和数据。 总之,通过STM32F103单片机使用TM1637芯片驱动4位数码管,可以实现方便、精确的数值显示功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

One Kb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值