TM1650芯片驱动四位数码管(含部分代码)

本文介绍了TM1650芯片如何通过IIC协议驱动四位数码管,包括IIC的基本结构、软件IIC和硬件IIC的区别,以及如何发送开始、停止信号和数据。提供详细的编程函数示例,适合嵌入式开发人员学习交流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TM1650芯片驱动四位数码管

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

二、IIC(Inter-Integrated Circuit BUS)结构解析

    1、IIC协议介绍
    I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 

    软件IIC:软件IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,用软件控制管脚状态以模拟I2C通信波形,软件模拟寄存器的工作方式。

    硬件IIC:一块硬件电路,硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,硬件(固件)I2C是直接调用内部寄存器进行配置。

在这里插入图片描述
通讯协议
TM1650 采用2线串行传输协议通讯。
1:开始信号(START)/结束信号(STOP)
开始信号:保持SCL为“1”电平,SDA从“1”跳“0”,认为是开始信号,
如(图3)A段;
结束信号:保持SCL为“1”电平,SDA从“0”跳“1”,认为是结束信号,
如(图3)E段;
2:ACK信号
如果本次通讯正常,芯片在串行通讯的第8个时钟下降沿后,TM1650主动把SDA拉低。直到检
测到SCL来了上升沿,SDA释放为输入状态(对芯片而言),如(图3)D段。
3: 写“1”和写“0”。
写“1”:保持 SDA 为“1”电平,SCL 从“0”跳到“1”,再从“1”跳到“0”,则认为是写入“1”
如(图3)B段。
写“0”:保持 SDA 为“0”电平,SCL 从“0”跳到“1”,再从“1”跳到“0”,则认为是写入“0“
在这里插入图片描述
一个字节数据传输格式
一个字节数据的传输格式如图4,数据发送时MSB在前,LSB在后。微处理器的数据通过两线总线
接口和TM1650通信,在输入数据时当SCL是高电平时,SDA上的信号必须保持不变;只有SCL上的
时钟信号为低电平时,SDA上的信号才能改变。数据输入的开始条件是SCL为高电平时,SDA由高变
低;结束条件是SCL为高时,SDA由低电平变为高电平。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
开始/停止代码:

void TM1650_start(void)    //开始信号
{    
  TM1650_SDA_OUT = 1;
	TM1650_SCL = 1;
	TM1650_SDA_IN = 1;
	Delay4us();		
	TM1650_SDA_IN = 0;
	Delay4us();		
  TM1650_SCL = 1;
  Delay4us();		
}


void TM1650_stop(void)    //停止信号
{
    TM1650_SDA_OUT = 1;
    TM1650_SCL = 1;
    TM1650_SDA_IN = 0;
    Delay4us();		
		TM1650_SCL = 1;
    TM1650_SDA_IN = 1;
    Delay4us();		
    
}

发送数据


void TM1650_send(u08t data)    //传输数据
{
    TM1650_SDA_OUT = 1;
    TM1650_SCL = 0;
    TM1650_SDA_IN = 0;
    Delay4us();	
    for(s32t i=7; i>=0; i--)
    {
        if(data&(1<<i))    //判断SDA为高电平还是低电平,高位到低位操作
            TM1650_SDA_IN = 1;    
        else
            TM1650_SDA_IN = 0;
        Delay4us();	
        TM1650_SCL = 1;
        Delay4us();	
        TM1650_SCL = 0;
        Delay4us();	
    }

	}

	

我们一些喜欢嵌入式的朋友一起建立的一个技术交流平台,本着大家一起互相学习的心态而建立,不太成熟,希望志同道合的朋友一起来。

在这里插入图片描述

### 关于TM1650驱动数码管的程序代码及教程 对于STC8系列单片机而言,存在一个已经过实际验证且稳定可靠的TM1650数码管驱动程序[^1]。此驱动程序不仅包了完整的TM1650数码管驱动代码,还提供了基础的显示功能支持。 #### 示例代码展示 下面是一个简化版的例子来说明如何利用这个驱动库在数码管上显示出特定数值: ```c #include "tm1650.h" void main() { // 初始化TM1650模块 TM1650_Init(); while (1) { // 设置亮度等级(范围通常是0-7) TM1650_SetBrightness(5); // 显示数字'1234' TM1650_DisplayData(0x00, '1'); TM1650_DisplayData(0x01, '2'); TM1650_DisplayData(0x02, '3'); TM1650_DisplayData(0x03, '4'); delay_ms(1000); // 延迟一秒 // 清除屏幕 TM1650_ClearDisplay(); delay_ms(1000); // 再次延迟一秒 } } ``` 上述代码实现了每隔两秒交替显示“1234”和空白的效果。`TM1650_Init()`用于初始化TM1650设备;`TM1650_SetBrightness(x)`用来调整背光强度;而`TM1650_DisplayData(addr,val)`则是向指定位置写入字符数据的方法之一。最后通过调用`TM1650_ClearDisplay()`可以清除当前屏幕上所有的内容。 为了使这段代码正常工作,在将其集成至个人项目之前还需要完成几个前置条件: - 将所有必要的文件从GitHub仓库下载下来; - 把这些文件加入到自己的IDE工程里边去; - 正确设置好I²C接口对应的GPIO引脚定义; - 编译链接之后把最终生成的目标文件烧录进MCU内部闪存当中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

就爱吃夜宵

您的鼓励是我创作的最大动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值