产品简介
代码
TM1637.H
```c
#ifndef __TM1637_H
#define __TM1637_H
#include "sys.h"
#define GPIO_CLK(x) GPIO_WriteBit(GPIOB,GPIO_Pin_0,(BitAction)(x)); //CLK
#define GPIO_DIO(x) GPIO_WriteBit(GPIOB,GPIO_Pin_1,(BitAction)(x)); //DIO
void TM1637_Init(void);
void TM1637_START(void);
void TM1637_STOP(void); //结束条件
void TM1637_WRITE_BYTE_DATA(unsigned char mydata);
void TM1637_CHECK_ack(void);
void TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(unsigned char addr, unsigned char my_data);
#endif
TM1637.C
```c
#include "TM1637.h"
#include "delay.h"
const unsigned char SEGMENT_CODE[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned int delay_time=10;
void TM1637_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
}
void TM1637_START() //开始条件
{
GPIO_CLK(1);
delay_us(delay_time);
GPIO_DIO(1);
delay_us(delay_time);
GPIO_DIO(0);
delay_us(delay_time);
GPIO_CLK(0);
delay_us(delay_time);
}
void TM1637_STOP() //结束条件
{
GPIO_CLK(0);
delay_us(delay_time);
GPIO_DIO(0);
delay_us(delay_time);
GPIO_CLK(1);
delay_us(delay_time);
GPIO_DIO(1);
delay_us(delay_time);
}
void TM1637_WRITE_BYTE_DATA(unsigned char mydata) //送数据 低位先传
{
unsigned char i;
for(i=0;i<8;i++)
{
GPIO_CLK(0);
delay_us(delay_time);
GPIO_DIO(mydata&0x01);
delay_us(delay_time);
GPIO_CLK(1);
delay_us(delay_time);
mydata>>=1;
delay_us(delay_time);
}
GPIO_CLK(0);
delay_us(delay_time);
}
void TM1637_CHECK_ack()
{
// 检查应答位,
GPIO_CLK(0);
delay_us(delay_time);
//DIN 在第9个脉冲被拉低,要检查的
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==1)
{
}
GPIO_CLK(1);
delay_us(delay_time);
GPIO_CLK(0);
delay_us(delay_time);
}
/*
采用固定地址模式=============
TM1637---支持6位8段数码管========================================
如果有4个数码管,此程序被反复执行4次
addr=== 0~5,TM1637支持6个数码管
my_data==== 第0个数码管的数据
*/
void TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(unsigned char addr, unsigned char my_data)
{
unsigned char get_segment=0;
//时序 (1) start
TM1637_START();
//(2)发送commmd1==0X44就是固定地址
TM1637_WRITE_BYTE_DATA(0x40+addr);
TM1637_CHECK_ack();
//注意这个有STOP
TM1637_STOP();
TM1637_START();
//(3)发送起始地址,
TM1637_WRITE_BYTE_DATA(0xC0+addr);
//要等DIN在第9个脉冲被拉低
TM1637_CHECK_ack();
get_segment = SEGMENT_CODE[my_data] ;
//(4) 发送该地址的数据
TM1637_WRITE_BYTE_DATA(get_segment);
//要等DIN在第9个脉冲被拉低
TM1637_CHECK_ack();
TM1637_STOP();
//==============
TM1637_START();
TM1637_WRITE_BYTE_DATA(0X8C); //开显示
TM1637_STOP();
}
main.c
```c
------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stdio.h"
#include "led.h"
#include "delay.h"
#include "timer2.h"
#include "usart.h"
#include "TM1637.h"
extern char Timer_out_flag2;
int main(void)
{
u8 q1=0;
u8 q2=0;
u8 q3=0;
u8 q4=0;
unsigned int Count=0;
extern char Timer_out_flag2;
//-------------------------------------------------------------------------------
//延时函数初始化
delay_init();
//-------------------------------------------------------------------------------
//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//-------------------------------------------------------------------------------
//串口初始化为115200
uart_init(115200);
//-------------------------------------------------------------------------------
//LED端口初始化
LED_Init();
//-------------------------------------------------------------------------------
//TM1637初始化
TM1637_Init();
//第一个是重装值,第二是预分频数-------------------------
/*
Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk
(50*7200)/36M
=360000/36
=10000us
=10ms
*/
TIM2_Int_Init(49,7199); //单次定时器10ms
TIM_Cmd(TIM2, ENABLE); //使能TIMx
//-------------------------------------------------------------------------------
while (1)
{
if (Timer_out_flag2==1)
{
Count++;
if ( Count>=9999)
{
Count=0;
}
//printf("Count=");
//printf("%d",Count);
//printf("\r\n");
q1=Count/1000;
q2=(Count%1000)/100;
q3=(Count%100)/10;
q4=Count%10;
//此函数必须执行4次,才能将数据写入缓冲器
TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(0,q1);
TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(1,q2);
TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(2,q3);
TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(3,q4);
Timer_out_flag2=0;
}
}
}
😍