引脚配置
首先在STM32CUBE里面配置引脚,
头文件
/*
************************************************************
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也没有判断,直接延时跳过。