1 TM1637驱动程序和模拟I2C配置是一样的输出模式配置成开漏输出模式,不然无法是数吗管正常显示。
2 在写程序时一定要细心,不要把移位写成了大于好或小于好,编译器是不会报错或者警告的。发送方式低位在前。
3 TM1637在第八个时钟的下降沿,会产生应答信号。
以下的tm1637程序,任何单片机都可以使用,只要把GPIO配置改一下就可以了。
#include "TM1637.H"
#include "Delay.h"
unsigned char smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/***
@brief TM1637³õʼ»¯
@param ÎÞ
@retval ÎÞ
*/
void TM1637_Init(void)
{
gpio_init_type gpio_init_struct;
crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_init_struct);
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN ;
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_pins = CLK_PIN|DIN_PIN ;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(TM1637_GPIO, &gpio_init_struct);
}
/***
@brief Star
@param ÎÞ
@retval ÎÞ
*/
void Star(void)
{
gpio_bits_set(TM1637_GPIO, DIN_PIN );
gpio_bits_set(TM1637_GPIO, CLK_PIN );
delay_us(5);
gpio_bits_reset(TM1637_GPIO, DIN_PIN );
delay_us(5);
gpio_bits_reset(TM1637_GPIO, CLK_PIN );
delay_us(2);
}
/***
@brief ·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ý
@param uint8_t data
@retval ÎÞ
*/
void Send_Byte(uint8_t data)
{
uint8_t i;
for(i=0;i<8;i++)
{
gpio_bits_reset(TM1637_GPIO, CLK_PIN );
if(data&(0x01<<i))
{
gpio_bits_set(TM1637_GPIO, DIN_PIN );
}
else
{
gpio_bits_reset(TM1637_GPIO, DIN_PIN );
}
delay_us(4);
gpio_bits_set(TM1637_GPIO, CLK_PIN );
delay_us(4);
}
}
/***
@brief Ó¦´ðACK
@param ÎÞ
@retval ÎÞ
*/
void Ack(void)
{
gpio_bits_reset(TM1637_GPIO, CLK_PIN );
delay_us(4);
while(gpio_input_data_bit_read(TM1637_GPIO, DIN_PIN));
gpio_bits_set(TM1637_GPIO, CLK_PIN );
delay_us(4);
}
/***
@brief STOP
@param ÎÞ
@retval ÎÞ
*/
void Stop(void)
{
gpio_bits_reset(TM1637_GPIO, CLK_PIN );
gpio_bits_reset(TM1637_GPIO, DIN_PIN );
delay_us(4);
gpio_bits_set(TM1637_GPIO, CLK_PIN );
delay_us(4);
gpio_bits_reset(TM1637_GPIO, DIN_PIN );
delay_us(4);
}
/***
@brief ÊýÂë¹ÜÏÔʾ
@param ÎÞ
@retval ÎÞ
*/
void Show_Seg(uint16_t number)
{
Star();
Send_Byte(0x40);
Ack();
Stop();
Star();
Send_Byte(0xC0);
Ack();
Send_Byte(smgduan[number/1000]);
Ack();
Send_Byte(smgduan[number%1000/100]);
Ack();
Send_Byte(smgduan[number%1000%100/10]);
Ack();
Send_Byte(smgduan[number%10]);
Ack();
Stop();
Star();
Send_Byte(0x8f);
Ack();
Stop();
}