又到了一年一季的毕业季啊。许多同学毕业设计是少不了数码管了。哎呀!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.youkuaiyun.com/Tesla_0/article/details/86662224,在此基础上,整合了一下。
使用例程 :
TM1637_DATA_Config(12,1,34,1,1);
TM1637_DATA_Display();
显示效果 :12:34(无图言x?)
工程包我发上来,我只想要5个c币,这可比动辄50个的博主良心多了吧。其实已经发了.c 和.h,也不怎么需要工程包了,我要被我自己感动哭了
点我下载兄弟