TM1650芯片驱动四位数码管


自言自语

今天上班被丢了块4位数码管过来,还有一份驱动数码管的芯片资料。还好只有十几页,哈哈哈。
大致浏览下手册,了解到这个芯片叫TM1650,然后是使用模拟IIC协议的。那也就是说,只需要SDA和SCL两条线就能驱动4位数码管!!!
想想好像比那种74HC595节省IO资源多了。所以记录下,哈哈哈~

一、芯片图

在这里插入图片描述
其中:
SCL:IIC的时钟线
SDA:IIC的数据线
DIGx:每个数码管的总开关,不开,怎么搞也不会亮滴,数码管1、2、3、4
A/K11~G/K17/DP/KP:因为只用了下数码管,所以建议不用键盘扫描的可以简化成如下:
A~G + DP:也就是一个数码管上的八个段。

下图是本人瞎画图,逻辑是这个逻辑,但是段和字母是我自己随性的哈。
在这里插入图片描述

二、通讯协议

TM1650采用的是IIC协议。使用SDA、SCL两条总线。

开始信号

保持SCL、SDA两条总线在高电平,这时候两条总线是在喝茶没事干滴。要让人家干活肯定得确定人家没事干啦。
然后SCL保持住高电平,SCL变成低电平,也就是SDA产生下降沿。这时候,起始信号就产生了。
当然啦,我们跟着要将SCL拉低,钳住总线,这样才能占住这份工,才能专心工作。因为前面说了,高电平人家在喝茶。

终止信号

在SCL保持高电平的时候,SDA先是低电平,然后拉高,也就是SDA产生上升沿,这时候,终止信号就产生了。
SCL、SDA都是高电平,就表示活干完了,两人继续喝茶没事干,就像临时工,哈哈哈~

发送一字节数据

IIC数据都是一位一位发送的,每一位数据都会有两个阶段:想清楚自己是个啥和确定自己是个啥。
在SCL低电平的时候,SDA的数据是可以改变的,也就是可以是1也可以是0,先想清楚自己是1还是0;
在SCL高电平的时候,SDA的数据是稳定的,是1就是1,是0就是0,也就是确定自己是个啥,不能改了。
之后,就会顺着SDA总线自动发送出去,追都追不回来。
TM1650的数据是高位先发送,也就是说0x90 — 1001 0010,先发送的是高位的1,而不是低位的0.
至于IIC协议是不是都这样,没记,所以不乱说。

发送一字节数据的话,就是发8位数据,写个for循环,将一字节数据左移>>加与&操作凑成个函数。

获取TM1650的应答

你跟人家聊天,不是舔狗的那种,肯定是你找人家说话,人家愿意回你,才能接着聊下一个话题啦。不然的话,哥也是有脾气的,不聊了,结束话题。
每次主机发送一字节数据,都会需要TM1650回应一个应答,主机接收到了,才会接着往下发下一个字节。
也就是说,每第9个数据,是用来给TM1650回应一个应答位的。
0就是收到了,1就是没收到,发送失败,没得玩。
当SCL第9个时钟为低电平时,TM1650如果接收到数据,就会将SDA抢过来,发一个低电平给主机,否则就是高电平。

三、TM1650的各个功能

数据命令设置:0x48,这个是告诉TM1650,我们要用点亮数码管的功能,而不是按键扫描的功能
显示命令设置:
在这里插入图片描述
这里实际是一个字节数据,只是不同位部分代表不同功能。
bit[6:4]:设置数码管亮度,注意,000是最亮哦。
bit[3]:设置要不要显示小数点
bit[0]:是不是要开启数码管的显示

数码管显示

比如说,8级亮度,不显示小数点,那就是0x05
起始信号 — 发送数据0x48 — 判断丛机应答 — 发送 数据0x05 — 判断丛机应答 — 终止信号
这样,数码管就打开显示了。
打开之后,在后面显示数字的时候,就不用重复发送数据0x48了,因为我们已经选好了数码管功能。

亮度和显示方式可以做成枚举,清晰,而且多个数据占一个地方,很节省空间,多爽~

数码管关闭

起始信号 — 发送数据0x48 — 判断丛机应答 — 发送 数据0x00 — 判断丛机应答 — 终止信号
这样,数码管就关闭显示了。

数码管显示数字

我们要显示数字,首先得告诉TM1650,显示的是哪个数码管的数字,下面的数据就对应好了哪个数码管:
在这里插入图片描述
然后我们就可以显示数字了,一个数据8个位,刚好对应8个段,1就是亮,0就是灭。
我的话,因为分不清哪个位对那个段,哈哈哈,所以我是循环按位点亮来理清哪个位对哪个段的。

比如点亮数码1显示8,那就是0x68,假设0x7f是8,哈哈哈,因为还有个位是小数点。
那就是:
起始信号 — 发送数据0x68 — 判断丛机应答 — 发送 数据0x7f — 判断丛机应答 — 终止信号

然后,顺利的话,就会在数码管1亮起一个8。

将0~9对应的值,做成一个数组,通过数组下标确定就比较方便了。

之后就可以将其完善成一个个小功能,用来显示数字、调节亮度、切换小数点、数码管切换了。

两条线控制4位数码管,很不错的设计~

  • 13
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是基于MM32F0010A单片机的tm1624驱动程序示例代码: ``` #include "MM32F0010.h" #define SDA_PORT GPIOA #define SDA_PIN GPIO_Pin_5 #define SCL_PORT GPIOA #define SCL_PIN GPIO_Pin_6 #define TM1624_CMD1 0x8a #define TM1624_CMD2 0x40 void TM1624_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SDA_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = SCL_PIN; GPIO_Init(SCL_PORT, &GPIO_InitStructure); } void TM1624_SendByte(uint8_t data) { uint8_t i; for (i = 0; i < 8; i++) { if (data & 0x80) GPIO_SetBits(SDA_PORT, SDA_PIN); else GPIO_ResetBits(SDA_PORT, SDA_PIN); data <<= 1; GPIO_SetBits(SCL_PORT, SCL_PIN); GPIO_ResetBits(SCL_PORT, SCL_PIN); } } void TM1624_WriteCmd(uint8_t cmd) { GPIO_ResetBits(SCL_PORT, SCL_PIN); GPIO_ResetBits(SDA_PORT, SDA_PIN); TM1624_SendByte(cmd); GPIO_SetBits(SCL_PORT, SCL_PIN); } void TM1624_WriteData(uint8_t address, uint8_t data) { TM1624_WriteCmd(TM1624_CMD1); TM1624_WriteCmd(address << 1); TM1624_WriteCmd(data); } void TM1624_Clear(void) { uint8_t i; TM1624_WriteCmd(TM1624_CMD1); TM1624_WriteCmd(0x00); for (i = 0; i < 16; i++) TM1624_WriteData(i, 0x00); } int main(void) { TM1624_Init(); TM1624_Clear(); TM1624_WriteData(0, 0x01); TM1624_WriteData(1, 0x02); TM1624_WriteData(2, 0x03); TM1624_WriteData(3, 0x04); while (1) { } } ``` 该代码实现了对tm1624的初始化、发送字节、写入命令和数据、清屏等操作。需要注意的是,SDA和SCL的引脚需要根据实际连接进行修改。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值