STM32 HAL TM1637使用

TM1637属于一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路。

本文主要使用MCU是STM32 ,CubeMX+Keil5进行开发,使用HAL库

简介:TM1637可以带动16个按键以及做数码管驱动

TM1637.C

#include "TM1637.h"

void gpio_out()
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.Pin = TM1637_DIO_Pin;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(TM1637_DIO_GPIO_Port, &GPIO_InitStruct);
}

void gpio_in()
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.Pin = TM1637_DIO_Pin;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(TM1637_DIO_GPIO_Port, &GPIO_InitStruct);
}

///====================================== 
void TM1637_I2CStart(void) //1637 开始 
	{ 
		TM1637_CLK(1); 
		TM1637_DIO(1); 
		Delay_us(2); 
		TM1637_DIO(0); 
	} 

void TM1637_I2CStop(void) // 1637 停止 
	{ 
		TM1637_CLK(0);
		Delay_us(2); 
		TM1637_DIO(0); 
		Delay_us(2); 
		TM1637_CLK(1);
		Delay_us(2); 
		TM1637_DIO(1);
	} 

void TM1637_I2Cask(void) //1637 应答 
	{ 
		TM1637_CLK(0); 
		Delay_us(5); //在第八个时钟下降沿之后延时 5us,开始判断 ACK 信号 
		gpio_in();
		while(TM1637_DIO_State); 
		gpio_out();
		TM1637_CLK(1);
		Delay_us(2); 
		TM1637_CLK(0);
	} 
///========================================= 
void TM1637_I2CWrByte(uint8_t oneByte) //写一个字节 
	{ 
		uint8_t i; 
		for(i=0;i<8;i++) 
		 {
			TM1637_CLK(0); 
			if(oneByte&0x01) //低位在前 
			 { 
				TM1637_DIO(1); 
			 } 
			else 
			 { 
				 TM1637_DIO(0); 
			 } 
			 Delay_us(3); 
			 oneByte=oneByte>>1; 
			 TM1637_CLK(1); 
			 Delay_us(3); 
		 } 
	} 
//------------------------------------------------- 
uint8_t ScanKey(void) //读按键 
{ 
	 uint8_t rekey = 0,i=0; 
	 TM1637_I2CStart(); 
	 TM1637_I2CWrByte(0x42); //读按键命令 
	 TM1637_I2Cask(); 
	 TM1637_DIO(1); // 在读按键前拉高数据线
	 gpio_in();	
	 for(i=0;i<8;i++) //从低位开始读 
	 { 
		TM1637_CLK(0); 
		rekey=rekey>>1; 
		Delay_us(30); 
		TM1637_CLK(1); 
		if(TM1637_DIO_State) 
		{ 
			rekey=rekey|0x80; 
		} 
		else 
		{ 
			rekey=rekey|0x00; 
		} 
		Delay_us(30); 
	 }
	 gpio_out();	 
	 TM1637_I2Cask(); 
	 TM1637_I2CStop(); 
	 return (rekey); 
} 
//================================================ 
void SmgDisplay(uint8_t add, uint8_t data, uint8_t brightness) //写显示寄存器 
	{ 
		
		TM1637_I2CStart(); 
		TM1637_I2CWrByte(0x44); // 40H 地址自动加 1 模式,44H 固定地址模式
		
		TM1637_I2Cask(); 
		
		TM1637_I2CStop(); 
		TM1637_I2CStart(); 
		TM1637_I2CWrByte(add); //设置首地址, 
		TM1637_I2Cask(); 
		TM1637_I2CWrByte(data); //送数据
		TM1637_I2Cask();
		TM1637_I2CStop(); 
		TM1637_I2CStart(); 
		TM1637_I2CWrByte(brightness); //开显示 ,设置亮度 
		TM1637_I2Cask(); 
		TM1637_I2CStop(); 
	} 
//===========end==================================






	

TM1637.h

#ifndef __TM1637_H__
#define __TM1637_H__

#include "Delay.h"
#include "main.h"

/*定义端口*/
#define TM1637_CLK(x)   do{ x ? \
                      HAL_GPIO_WritePin(TM1637_CLK_GPIO_Port, TM1637_CLK_Pin, GPIO_PIN_SET) : \
                      HAL_GPIO_WritePin(TM1637_CLK_GPIO_Port, TM1637_CLK_Pin, GPIO_PIN_RESET); \
                  }while(0)

#define TM1637_DIO(x)   do{ x ? \
                      HAL_GPIO_WritePin(TM1637_DIO_GPIO_Port, TM1637_DIO_Pin, GPIO_PIN_SET) : \
                      HAL_GPIO_WritePin(TM1637_DIO_GPIO_Port, TM1637_DIO_Pin, GPIO_PIN_RESET); \
                  }while(0)	

#define TM1637_DIO_State        HAL_GPIO_ReadPin(TM1637_DIO_GPIO_Port, TM1637_DIO_Pin)
				  		  
				  
/*外部接口函数*/
				  
void SmgDisplay(uint8_t add, uint8_t data, uint8_t brightness); //写显示寄存器 

#endif /* __TM1637_H__ */

        注意:TM1637在进行读写时需要应该应答信号反馈,当没有应答时容易则一直while循环,这是一个弊端。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

啵啵520520

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

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

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

打赏作者

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

抵扣说明:

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

余额充值