//配置引脚。此部分使用单片机不同,会有区别。
#define I2C_SCL(x) ((x) ? ( GPIO_Write_High(GPIOA0,3)) : (GPIO_Write_Low(GPIOA0,3)));
#define I2C_SDA(x) ((x) ? ( GPIO_Write_High(GPIOA0,4)) : (GPIO_Write_Low(GPIOA0,4)));
//外部文件定义
extern void delay_nms(unsigned int t);
//
#define TM1637_BRIGHTNESS 7 // 0 - 7
void I2C_delay()
{
nop_();
//注意根据单片机调整,使时间在2us以上
}
void I2C_start()
{
I2C_SCL(1);
I2C_SDA(1);
I2C_delay();
I2C_SDA(0); // 时钟线设置为常态,低电平。
}
/*
I2C 总线写1个字节
不包含应答位的检测
*/
void I2C_write_byte(char byte_to_write)
{
unsigned char i;
for(i=0; i<8; i++)
{
I2C_SCL(0);
// I2C_SDA = byte_to_write & 0x01;
if(byte_to_write & 0x01)
{
I2C_SDA(1);
}
else
{
I2C_SDA(0);
}
I2C_delay();
I2C_SCL(1);
I2C_delay();
I2C_SCL(0);
I2C_delay();
byte_to_write >>= 1;
}
return;
}
void I2C_check_ack()
{
// I2C 检查应答位,实际未检查,只发送了应答位时钟,认为TM1637工作正常
I2C_SCL(0);
I2C_delay();//在第八个时钟下降沿之后延时5us,开始判断ACK 信号
/*
while(I2C_SDA)
{
;
}
*/
I2C_SCL(1);
I2C_delay();
I2C_SCL(0);
}
void I2C_send_ack()
{
I2C_SDA(0);
I2C_delay();
I2C_SCL(1);
I2C_delay();
I2C_SCL(0);
I2C_delay();
I2C_SDA(1);
I2C_delay();
}
void I2C_stop()
{
I2C_SCL(0);
I2C_delay();
I2C_SDA(0);
I2C_delay();
I2C_SCL(1);
I2C_delay();
I2C_SDA(1);
}
///
//
// TM1637模块操作函数
//
//
void TM1637_write_command_byte(unsigned char command)
{
I2C_start();
I2C_write_byte(command);
I2C_check_ack();
I2C_stop();
}
// bright : 0 - 7
void TM1637_display_switch_and_bright(char enable_display, unsigned char bright)
{
TM1637_write_command_byte(0x80 + (enable_display ? 0x08 : 0x00) + bright);
}
void TM1637_write_display_bytes(unsigned char first_addr,
unsigned char bytes_to_write[],
unsigned char num_of_bytes)
{
unsigned char i;
I2C_start();
I2C_write_byte(0x40);
I2C_check_ack();
I2C_stop();
I2C_start();
I2C_write_byte(0xC0 + first_addr);
I2C_check_ack();
for(i=0; i<num_of_bytes; i++)
{
I2C_write_byte(bytes_to_write[i]);
I2C_check_ack();
}
I2C_stop();
}
// addr: 0 - 5
void TM1637_write_display_byte(unsigned char addr, unsigned char segments)
{
I2C_start();
I2C_write_byte(0x40 + addr);
// I2C_write_byte(0x44);
I2C_check_ack();
I2C_stop();
I2C_start();
I2C_write_byte(0xC0 + addr);
I2C_check_ack();
I2C_write_byte(segments);
I2C_check_ack();
I2C_stop();
}
const unsigned char TM1637_SEG_TAB[] =
{
0x3F // 00111111 0
,0x06 // 00000110 1
,0x5B // 01011011 2
,0x4F // 01001111 3
,0x66 // 01100110 4
,0x6d // 01101101 5
,0x7d // 01111101 6
,0x07 // 00000111 7
,0x7F // 01111111 8
,0x6F // 01101111 9
,0x77 // 01110111 A
,0x7C // 01111100 b
,0x39 // 00111001 C
,0x5E // 01011110 d
,0x79 // 01111001 E
,0x71 // 01110001 F
};
void TM1637_show_digit(unsigned char pos, unsigned char digit, char with_dot)
{
TM1637_write_display_byte(pos, TM1637_SEG_TAB[digit] | (with_dot ? 0x20 : 0x00));
}
void TM1637_init()
{
unsigned char i;
TM1637_display_switch_and_bright(1, TM1637_BRIGHTNESS);
for(i=0; i<6; i++)
{
TM1637_write_display_byte(i, 0xFF);
}
delay_nms(200);
for(i=0; i<6; i++)
{
TM1637_write_display_byte(i, 0x00);
}
delay_nms(200);
for(i=0; i<6; i++)
{
TM1637_write_display_byte(i, 0xFF);
}
delay_nms(200);
for(i=0; i<6; i++)
{
TM1637_write_display_byte(i, 0x00);
}
delay_nms(200);
}
void TM1637(void)
{
unsigned char seg;
unsigned char i, j;
TM1637_init();
while(1)
{
for(i=0; i<16; i++)
{
for(j=0; j<6; j++)
{
TM1637_show_digit(j, i, 0);
}
delay_nms(1000);
}
}
}
TM1637驱动程序及数据手册
需积分: 0 123 浏览量
2022-04-27
17:05:44
上传
评论 1
收藏 399KB ZIP 举报
youngyyzz
- 粉丝: 2
- 资源: 1
最新资源
- 基于pygame实现的烟花代码
- mcu-printf关于51单片机使用printf函数进行串口调试的方法
- MySQL和数据表操作
- 微信小程序面试题.pdf
- 基于matlab实现电力系统仿真计算软件包,包括潮流计算,最优潮流计算等.rar
- 基于matlab实现电力系统各种故障波形仿真,单相接地故障,两相间短路,两相接地短路,三相短路等.rar
- 基于matlab实现电动汽车动力性,爬坡性,续驶里程等性能仿真.rar
- Python动态烟花代码.pdf
- 基于matlab实现串口发送接收数据 可配置端口,波特率等 发送可选择ASCII方式或HEX方式
- matlab基于BP神经网络手写字母识别(单一).zip代码9
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0