基于STM32的HAL库驱动TM1637数码管显示

引脚配置

首先在STM32CUBE里面配置引脚,
基于STM32的HAL库驱动TM1637数码管显示_第1张图片

头文件

/*
************************************************************
TM1637 是一种带键盘扫描接口的LED (发光二极管显示器)驱动控制专用电路,
内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。
本产品性能优良,质量可靠。主要应用于电磁炉、微波炉及小家电产品的显示屏驱动。采用DIP/SOP20的封装形式。

采用功率CMOS 工艺
显示模式(8 段X6 位),支持共阳数码管输出
键扫描 (8 X 2b) ,增强型抗干扰按键识别电路
辉度调节电路 (占空比 8 级可调)两线串行接口 (CLK,DIO)振荡方式: 内置RC 振荡 (450KHz+5%)
内置上电复位电路
内置自动消隐电路
封装形式: DIP20/SOP20

************************************************************
*/

#ifndef __TM1637_H
#define __TM1637_H

#include "main.h"

#define TM1637_CLK_H()	HAL_GPIO_WritePin(TM1637_CLK_GPIO_Port,TM1637_CLK_Pin,GPIO_PIN_SET)
#define TM1637_CLK_L()	HAL_GPIO_WritePin(TM1637_CLK_GPIO_Port,TM1637_CLK_Pin,GPIO_PIN_RESET)
#define TM1637_SDA_H()	HAL_GPIO_WritePin(TM1637_SDA_GPIO_Port,TM1637_SDA_Pin,GPIO_PIN_SET)
#define TM1637_SDA_L()	HAL_GPIO_WritePin(TM1637_SDA_GPIO_Port,TM1637_SDA_Pin,GPIO_PIN_RESET)


/*
使用方法:
1、设置背光亮度TM1637_SetBL
2、设置工作模式TM1637_SetWorkMode(目前无0x42读键模式)
3、显示数据TM1637_Disp
*/

void TM1637_SetBL(uint8_t level);/*设置显示亮度,0=关闭,8最大*/
void TM1637_SetWorkMode(uint8_t mode);/*工作模式,0x40=地址自增显示,0x44=固定地址显示,0x42=读键扫数据*/
void TM1637_Disp(uint8_t *p,uint8_t lenth);



#endif

C文件

#include "tm1637.h"

const uint8_t DISP_CODE_COM_ANNODE[] =	/*共阳段码*/
{
    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 ??*/
};//这里是数码管显示字符所对应的数据



void TM1637_Start(void)
{
	TM1637_SDA_H();
	TM1637_CLK_H();

	TM1637_SDA_L();
	TM1637_CLK_L();
}

void TM1637_Stop(void)
{
	TM1637_CLK_L();
	TM1637_SDA_L();

	TM1637_CLK_H();
	TM1637_SDA_H();	
}

void TM1637_SendByte(uint8_t dat)
{
	
	for(uint8_t i=0; i<8; i++)
	{
		TM1637_CLK_L();
		if(dat & 0x01)
		{
			TM1637_SDA_H();
		}
		else
		{
			TM1637_SDA_L();
		}

		dat >>= 1;
		TM1637_CLK_H();
	
	}
}

void TM1637_WaitAck(void)
{
	uint8_t i=0;
	TM1637_CLK_L();
	
	while(i<250)	i++;
	TM1637_CLK_H();

	TM1637_CLK_L();
	
}

void TM1637_SetBL(uint8_t level)
{
	/*设置显示方式*/
	uint8_t backLight;
	if(level == 0)
	{
		backLight = 0x80;
	}
	else if(level > 8)
	{
		backLight = 0x8f;
	}
	else
	{
		backLight = 0x88 | (level-1);
	}
	
	TM1637_Start();
	TM1637_SendByte(backLight);
	TM1637_WaitAck();
	TM1637_Stop();	
}

void TM1637_SetWorkMode(uint8_t mode)
{
	/*设置地址模式*/
	TM1637_Start();
	TM1637_SendByte(0x40);/*工作模式,0x40=地址自增显示,0x44=固定地址显示,0x42=读键扫数据*/
	TM1637_WaitAck();
	TM1637_Stop();	
}

void TM1637_Disp(uint8_t *p,uint8_t lenth)
{
	uint8_t i;
	uint8_t data;
	
//	/*设置地址模式*/
//	TM1637_Start();
//	TM1637_SendByte(0x40);
//	TM1637_WaitAck();
//	TM1637_Stop();
	
	/*设置首地址*/
	TM1637_Start();
	TM1637_SendByte(0xc0);/*0XC0=GRID0;0XC5=GRID5*/
	TM1637_WaitAck();
	
	/*发送数据*/
	for(i=0; i<lenth; i++)
	{
		data = DISP_CODE_COM_ANNODE[*(p+i)];
		TM1637_SendByte(data);
		TM1637_WaitAck();
	}
	TM1637_Stop();
	
//	/*设置显示方式*/
//	TM1637_Start();
//	TM1637_SendByte(0x8f);
//	TM1637_WaitAck();
//	TM1637_Stop();
}



使用方法

/*
使用方法:
1、设置背光亮度TM1637_SetBL
2、设置工作模式TM1637_SetWorkMode(目前无0x42读键模式)
3、显示数据TM1637_Disp
*/
在主函数中,例如要显示一个变量值

uint16_t g_usCO2ppm = 1234;
uint8_t g_ucaDispCode[4];
while(1)
{
		  g_ucaDispCode[0] = g_usCO2ppm/1000;
		  g_ucaDispCode[1] = g_usCO2ppm/100%10;
		  g_ucaDispCode[2] = g_usCO2ppm/10%10;
		  g_ucaDispCode[3] = g_usCO2ppm%10;
		  TM1637_Disp(g_ucaDispCode,4);
}

注意

程序没有启用按键读取功能,只简单显示。ack也没有判断,直接延时跳过。

你可能感兴趣的:(stm32,单片机,嵌入式硬件)