TM1637+stm32 HAL库

又到了一年一季的毕业季啊。许多同学毕业设计是少不了数码管了。哎呀!OLED他不香吗?Ips0.96他不香吗?今天一个学妹来问我。T1637.的数码管怎么用?关键问题是我也没用过呀。我又爱面子。就拿来看看吧。不过这东西确实让我踩了不少的坑。今天就写个博客发出来吧。
管脚设置 PB6PB7都是输出就可以
在这里插入图片描述
要注意的几点,
这不是IIC!
这不是IIC!
这不是IIC!
1,该总线传输位的顺序与iic相反
2,该设备独占该总线(没有设备地址可言)
3,应答很奇怪,官方手册说会有应答,但是我用while来测试,从第8个clk-第12个clk都没等到应答,索性跳过应答,delay大法好。
直接上代码。
这是.h文件

#ifndef _TM1637_H_
#define _TM1637_H_


#include "main.h"
#include "gpio.h"
#include "delay.h"

#define CLK_0 	HAL_GPIO_WritePin(TM_IIC_CLK_GPIO_Port,TM_IIC_CLK_Pin,GPIO_PIN_RESET)
#define CLK_1 	HAL_GPIO_WritePin(TM_IIC_CLK_GPIO_Port,TM_IIC_CLK_Pin,GPIO_PIN_SET)

#define DIO_0 	HAL_GPIO_WritePin(TM_IIC_SDA_GPIO_Port,TM_IIC_SDA_Pin,GPIO_PIN_RESET)
#define DIO_1 	HAL_GPIO_WritePin(TM_IIC_SDA_GPIO_Port,TM_IIC_SDA_Pin,GPIO_PIN_SET)

//#define SDA_IN	{GPIOB->MODER&=0xffff3fff;}
//#define SDA_OUT {GPIOB->MODER&=0xffff3fff;GPIOB->MODER|=0xffff7fff;}

//#define SDA_READ HAL_GPIO_ReadPin(TM_IIC_SDA_GPIO_Port,TM_IIC_SDA_Pin)

extern unsigned char tab[];

    //相关函数声明
/************************************
TM1637_DATA_Config
参数
unsigned char fb						;(88):88 显示数字设置
unsigned char fb_show_flag	;(88):88 显示开关设置	1:显示  0不显示
unsigned char sb						;88:(88) 显示数字设置
unsigned char sb_show_flag	;88:(88) 显示开关设置	1:显示  0不显示
unsigned char dot						;88(:)88 显示开关设置	1:显示  0不显示

使用例程 :
TM1637_DATA_Config(11,1,22,1,1);
TM1637_DATA_Display();
显示效果 :11:22

使用例程 :
TM1637_DATA_Config(12,0,34,1,1);
TM1637_DATA_Display();
显示效果 :__:34

使用例程 :
TM1637_DATA_Config(12,0,34,0,1);
TM1637_DATA_Display();
显示效果 :__:__
**************************************/
    void TM1637_DATA_Config(unsigned char fb,unsigned char fb_show_flag,unsigned char sb,unsigned char sb_show_flag,unsigned char dot);
    void I2C_Start(void);
    void I2C_stop(void);
    void TM1637_WriteBit(unsigned char mBit);
    void TM1637_WriteByte(unsigned char Byte);
    void TM1637_WriteCommand(unsigned char mData);
    void TM1637_WriteData(unsigned char addr,unsigned char mData);
    void TM1637_DATA_Display(void);
#endif

这是.c文件

#include "TM1637.h"
unsigned char dt=20; //延时时间参数
unsigned char  dpFlag = 0;//主函数有说明 
unsigned char  Data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char  DataDp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x80};
struct {
	char shi;
	char ge;
}FB;
 
struct {
	char shi;
	char ge;
}SB;

void TM1637_DATA_Config(unsigned char fb,unsigned char fb_show_flag,unsigned char sb,unsigned char sb_show_flag,unsigned char dot)
{
	if(fb_show_flag==1)
	{
		FB.shi = fb/10;
		FB.ge =  fb%10;
	}
	else
	{
		FB.shi=FB.ge=10;
	}
	if(sb_show_flag==1)
	{
		SB.shi = sb/10;
		SB.ge =  sb%10;
	}
	else
	{
		SB.shi=SB.ge=10;
	}
	dpFlag = dot;
		
}

void I2C_Start(void)
{
  CLK_1;
	DIO_1;
	delay_us(dt);
	
	DIO_0;
	delay_us(dt);
	CLK_0;
	delay_us(dt);
}

void I2C_stop(void)
{
	
	CLK_0;
	delay_us(dt);
  DIO_0;
	delay_us(dt);
	
  CLK_1;
	delay_us(dt);	
	DIO_1;
	delay_us(dt);  	
}

void TM1637_WriteBit(unsigned char mBit)
{
	CLK_0;
	delay_us(dt);
	if(mBit)
		DIO_1;
	else
		DIO_0;
	delay_us(dt);
	CLK_1;
	delay_us(dt);	
}
  
void TM1637_WriteByte(unsigned char Byte)
{
	char loop = 0;
	for(loop = 0;loop<8;loop++)
	{
		 TM1637_WriteBit((Byte>>loop) & 0x01);//先写低位	
	}
	CLK_0;
	delay_us(dt);
	DIO_1;	
	delay_us(dt);
	CLK_1;		
}
void TM1637_WriteCommand(unsigned char mData)
{
	I2C_Start();
	TM1637_WriteByte(mData);
	I2C_stop();
}


/*
*@note  写入地址和数据
*/

void TM1637_WriteData(unsigned char addr,unsigned char mData)
{
	I2C_Start();
	TM1637_WriteByte(addr);
	TM1637_WriteByte(mData);
	I2C_stop();
}
void TM1637_DATA_Display(void)
{
	TM1637_WriteCommand(0x44);
	TM1637_WriteData(0xc0,Data[FB.shi]);
	if(dpFlag)
			TM1637_WriteData(0xc1,DataDp[FB.ge]);
	else
			TM1637_WriteData(0xc1,Data[FB.ge]);
	
	TM1637_WriteData(0xc2, Data[SB.shi]);
	TM1637_WriteData(0xc3, Data[SB.ge]);
	TM1637_WriteCommand(0x88);
 }


代码有借鉴https://blog.csdn.net/Tesla_0/article/details/86662224,在此基础上,整合了一下。
使用例程 :
TM1637_DATA_Config(12,1,34,1,1);
TM1637_DATA_Display();
显示效果 :12:34(无图言x?)
在这里插入图片描述
工程包我发上来,我只想要5个c币,这可比动辄50个的博主良心多了吧。其实已经发了.c 和.h,也不怎么需要工程包了,我要被我自己感动哭了
点我下载兄弟

当使用STM32HAL库TM1637硬件IIC进行通信时,你可以按照以下步骤进行代码编写: 1. 配置I2C总线: 首先,你需要配置STM32的I2C总线。这可以通过CubeMX或手动编写代码来完成。确保正确配置I2C引脚、时钟频率等参数。 2. 初始化TM1637: 在开始使用TM1637之前,你需要初始化它。这包括设置显示亮度、清除显示内容等操作。 ```c // 定义TM1637的地址 #define TM1637_ADDRESS 0x40 // TM1637控制字节 #define TM1637_CMD_SET_DATA 0x40 #define TM1637_CMD_SET_ADDR 0xC0 #define TM1637_CMD_SET_DISPLAY 0x80 // 初始化TM1637 void TM1637_Init(void) { // 发送初始化命令 TM1637_SendCommand(TM1637_CMD_SET_DISPLAY | 0x08); // 设置显示亮度为最大值 TM1637_SendCommand(TM1637_CMD_SET_ADDR); // 设置地址为0 TM1637_ClearDisplay(); // 清除显示内容 } // 发送命令到TM1637 void TM1637_SendCommand(uint8_t command) { // 发送开始信号 HAL_I2C_Start(); HAL_I2C_WriteByte(TM1637_ADDRESS); // 发送命令字节 HAL_I2C_WriteByte(command); // 结束通信 HAL_I2C_Stop(); } ``` 3. 显示数据: 一旦你完成了初始化,你就可以发送要显示的数据到TM1637。 ```c // 显示一个数字 void TM1637_DisplayDigit(uint8_t digit, uint8_t position) { // 限制位置在0-3之间 if (position > 3) { position = 3; } // 设置数据地址 TM1637_SendCommand(TM1637_CMD_SET_ADDR | position); // 发送要显示的数字 TM1637_SendCommand(digit); } // 清除显示内容 void TM1637_ClearDisplay(void) { for (uint8_t i = 0; i < 4; i++) { TM1637_DisplayDigit(0x00, i); } } ``` 以上是一个简单的示例代码,用于使用STM32HAL库TM1637硬件IIC进行通信。你可以根据自己的需求进行修改和扩展。请确保正确设置I2C总线并连接TM1637设备。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值