基于STM32的四位TM1637完整程序

`
这个程序中的定时是用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);
     }
  • 11
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鹏一电子工作室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值