`
这个程序中的定时是用STM32的滴答定时器来做的,该部分代码没有,用户可以自己写
程序中的一些数字是根据TM1637的用户手册推出来的,用户不懂的可以百度用户手册
/***************************************************主函数部分*****************************************************/
#include "stm32f10x.h"
#include "TM1637.h"
#include "bsp_SysTick.h"
extern uint8_t dpFlag; //为1显示中间冒号
extern unsigned char Data[];//不加冒号的段选
extern unsigned char DataDp[];//加冒号的段选
//定义显示数据的结构体
extern struct
{
char shi;
char ge;
}Hour;
extern struct
{
char shi;
char ge;
}Min;
/**
* @brief 主函数显示 00:00
*/
int main(void)
{
Hour.shi = 0;
Hour.ge = 0;
Min.shi = 0;
Min.ge = 0;
dpFlag = 0;
GPIO_Config();
Time_Display();
while(1);
}
/*********************************************END OF FILE**********************/
关于TM1637的驱动这里提供一个.c文件和.h文件
#ifndef _TM1673_H
#define _TM1673_H
#include "stm32f10x.h"
#include "bsp_SysTick.h”
//引脚的时钟使能函数的宏定义
#define TM1637_RCC_Cmd RCC_APB2PeriphClockCmd
//DIO和CLK相关引脚的宏定义,用户只需要修改相关宏即可
#define TM_DIO_PORT GPIOC
#define TM_DIO_CLK RCC_APB2Periph_GPIOC
#define TM_DIO_PIN GPIO_Pin_2
#define TM_CLK_PORT GPIOC
#define TM_CLK_CLK RCC_APB2Periph_GPIOC
#define TM_CLK_PIN GPIO_Pin_3
//时钟线和数据线高低电平的宏定义,不需修改
#define CLK_1 GPIO_SetBits(TM_CLK_PORT,TM_CLK_PIN)
#define CLK_0 GPIO_ResetBits(TM_CLK_PORT,TM_CLK_PIN)
#define DIO_1 GPIO_SetBits(TM_DIO_PORT,TM_DIO_PIN)
#define DIO_0 GPIO_ResetBits(TM_DIO_PORT,TM_DIO_PIN)
//相关函数声明
void GPIO_Config(void);
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 Time_Display(void);
#endif /* _TM1673_H*/
/*********************************************END OF FILE**********************/
这里是.c文件
#include "TM1637.h"
uint8_t dpFlag = 0;//主函数有说明
unsigned char Data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char DataDp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
struct {
char shi;
char ge;
}Hour;
struct {
char shi;
char ge;
}Min;
/*
*@breif GPIO_INIT
*@note no
*/
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TM1637_RCC_Cmd(TM_DIO_CLK|TM_CLK_CLK,ENABLE);
GPIO_InitStructure.GPIO_Pin = TM_DIO_PIN | TM_CLK_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//ÉèÖÃΪÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TM_DIO_PORT,&GPIO_InitStructure);
}
/*
时钟线为高时,数据线由高变低
*/
void I2C_Start(void)
{
CLK_1;
DIO_1;
SysTick_Delay_Us(140);
DIO_0;
SysTick_Delay_Us(140);
CLK_0;
SysTick_Delay_Us(140);
}
/*
*时钟线为高时,数据线由低变高
*/
void I2C_stop(void)
{
CLK_0;
SysTick_Delay_Us(140);
DIO_0;
SysTick_Delay_Us(140);
CLK_1;
SysTick_Delay_Us(140);
DIO_1;
SysTick_Delay_Us(140);
}
//写一个比特位
void TM1637_WriteBit(unsigned char mBit)
{
CLK_0;
SysTick_Delay_Us(140);
if(mBit)
DIO_1;
else
DIO_0;
SysTick_Delay_Us(140);
CLK_1;
SysTick_Delay_Us(140);
}
//写一个字节
void TM1637_WriteByte(unsigned char Byte)
{
char loop = 0;
for(loop = 0;loop<8;loop++)
{
TM1637_WriteBit((Byte>>loop) & 0x01);//先写低位
}
CLK_0;
SysTick_Delay_Us(140);
DIO_1;
SysTick_Delay_Us(140);
CLK_1;
SysTick_Delay_Us(140);
while(GPIO_ReadInputDataBit(TM_DIO_PORT ,TM_DIO_PIN) == 0x01);
//等待应答信号
}
/*
*写指令函数
*B7:B6 =01 数据命令控制
* 11地址命令控制
* 10显示命令控制
*/
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 Time_Display(void)
{
TM1637_WriteCommand(0x44);
TM1637_WriteData(0xc0,Data[Hour.shi]);
if(dpFlag)
TM1637_WriteData(0xc1,DataDp[Hour.ge]);
else
TM1637_WriteData(0xc1,DataDp[Hour.ge]);
TM1637_WriteData(0xc2, Data[Min.shi]);
TM1637_WriteData(0xc2, Data[Min.ge]);
TM1637_WriteCommand(0x8a);
}