TM1650数码管驱动芯片

这篇具有很好参考价值的文章主要介绍了TM1650数码管驱动芯片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

TM1650是一款国产4位共阴数码管驱动芯片,它还带有矩阵按键扫码功能。它的基本参数如下:

  • 工作电压:3~5V
  • 数码管驱动模式:8段x4位共阴数码管
  • 矩阵按键驱动模式:7x4矩阵按键,不支持组合键
  • 通信接口:类IIC,使用了IIC相同的时序,但没有完全遵守IIC的协议,不带从机地址。

现已提供合宙luatos驱动库:tm1650 - tm1650 数码管和按键扫描芯片 - LuatOS 文档

引脚定义

SCL:串行通信时钟线

SDA:串行通信数据线

做数码管驱动使用时

  • DIGx:数码管的位选引脚,灌电流驱动,最大可吸收150mA电流
  • A~DP:数码管的段驱动引脚,拉电流驱动,最大可输出25mA电流

TM1650数码管驱动芯片

典型应用原理图

 TM1650数码管驱动芯片

通信协议

TM1650使用的是类IIC接口,只是不带从机地址机制。所以总线上的基本信号也包含起始信号,ACK应答,结束信号,同时字节数据发送时,也是按照标准IIC的MSB First顺序。

虽然TM1650不带从机地址,但是可以和其他标准I2C从机器件如AT24C02挂同一个IIC总线下,前提是地址不冲突。对于TM1650来说,所谓的从机地址就是发送start信号后紧跟的那个字节数据。拿本文来说,使用了从机地址为:0x48,0x68,0x6A,0x6C,0x6E。笔者在一个项目中,就将AT24C02和TM1650挂同一个IIC总线使用了。

发送命令设置数码管显示工作参数

通信格式:起始信号,模式命令(1字节),显示命令(1字节),结束信号

这个指令用于设置数码管显示的相关参数。例如亮度,7段或者8段显示,显示的开关。模式命令固定为0x48,而显示命令则满足以下格式:

TM1650数码管驱动芯片

也就是说,显示命令字节的B6~B4用于设置显示亮度,B3用于选择7段或者8段显示模式,B0用于打开或者关闭显示。

发送驱动数码管显示的段码数据到显存

通信格式:起始信号,地址码(1字节),数码管段数据(1字节),结束信号

TM1650内部有4字节的显存,地址分别为0x68,0x6A,0x6C,0x6E,分别用于存放显示在DIG1,DIG2,DIG3,DIG4的段码数据。例如想要让DIG1对应的数码管位显示数字2,则要往0x68单元写入数字2的共阴段码0x5b。

TM1650数码管驱动芯片

TM1650数码管驱动例程

开发环境:Keil+GD32F130。移植的时候只需要修改tm1650_config.h 进行适配即可。

tm1650.c

#include "tm1650.h"
#include "tm1650_config.h"

//产生IIC总线起始信号
static void TM1650_IIC_start(void)
{
	TM1650_IIC_SCL_HIGH;     //SCL=1
	TM1650_IIC_SDA_HIGH;    //SDA=1
	TM1650_IIC_DELAY_4US;
	TM1650_IIC_SDA_LOW;     //SDA=0
	TM1650_IIC_DELAY_4US;
	TM1650_IIC_SCL_LOW;      //SCL=0
}

//产生IIC总线结束信号
static void TM1650_IIC_stop(void)
{
	TM1650_IIC_SCL_LOW;      //SCL=0
	TM1650_IIC_SDA_LOW;      //SDA=0
	TM1650_IIC_DELAY_4US;
	TM1650_IIC_SCL_HIGH;     //SCL=1
	TM1650_IIC_DELAY_4US;
	TM1650_IIC_SDA_HIGH;    //SDA=1
}

//通过IIC总线发送一个字节
static void TM1650_IIC_write_byte(uint8_t dat)
{
	uint8_t i;
	
	TM1650_IIC_SCL_LOW;
	for(i=0;i<8;i++)
	{
		TM1650_IIC_SDA_WR(dat&0x80);
		dat<<=1;	
		
		TM1650_IIC_DELAY_2US;
		TM1650_IIC_SCL_HIGH;
		TM1650_IIC_DELAY_2US;
		TM1650_IIC_SCL_LOW;
		TM1650_IIC_DELAY_2US;
	}
}

//通过IIC总线接收从机响应的ACK信号
static uint8_t TM1650_IIC_wait_ack(void)
{
	uint8_t ack_signal = 0;
	
	TM1650_IIC_SDA_HIGH;    //SDA=1
	TM1650_IIC_DELAY_2US;
	TM1650_IIC_SCL_HIGH;
	TM1650_IIC_DELAY_2US;
	if(TM1650_IIC_SDA_RD()) ack_signal = 1;   //如果读取到的是NACK信号
	TM1650_IIC_SCL_LOW;
	TM1650_IIC_DELAY_2US;
	return ack_signal;
}


//TM1650初始化
void TM1650_init(void)
{
	TM1650_IIC_SCL_MODE_OD;  //SCL开漏输出
    TM1650_IIC_SDA_MODE_OD;  //SDA开漏输出

    TM1650_IIC_SDA_HIGH;   //释放SDA线
    TM1650_IIC_SCL_HIGH;   //释放SCL线
	
	TM1650_cfg_display(TM1650_BRIGHT5);   //初始化为5级亮度,打开显示
	TM1650_clear();     //将显存内容清0
}


//作用:设置显示参数
//备注:这个操作不影响显存中的数据
//用例:
//	设置亮度并打开显示:TM1650_cfg_display(TM1650_BRIGHTx)
//	关闭显示:TM1650_cfg_display(TM1650_DSP_OFF)
void TM1650_cfg_display(uint8_t param)
{
	TM1650_IIC_start();
	TM1650_IIC_write_byte(0x48);  TM1650_IIC_wait_ack();     //固定命令
	TM1650_IIC_write_byte(param); TM1650_IIC_wait_ack();    //参数值
	TM1650_IIC_stop();
}


//将显存数据全部刷为0,清空显示
void TM1650_clear(void)
{
	uint8_t dig;
	for(dig = TM1650_DIG1 ; dig<= TM1650_DIG4 ;dig++)
	{
		TM1650_print(dig,0);   //将显存数据刷为0
	}
}

//往一个指定的数码管位写入指定的显示数据
//共阴数码管段码表:
//const uint8_t TUBE_TABLE_0[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};                                  //共阴,0~9的数字
//const uint8_t TUBE_TABLE_0[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};    //共阴,0~9~A~F
//用例:
//	在DIG1位上显示数字3: TM1650_print(TM1650_DIG1,TUBE_TABLE_0[3]);
void TM1650_print(uint8_t dig,uint8_t seg_data)
{
	TM1650_IIC_start();
	TM1650_IIC_write_byte(dig*2+0x68); TM1650_IIC_wait_ack();  //显存起始地址为0x68
	TM1650_IIC_write_byte(seg_data); TM1650_IIC_wait_ack();    //发送段码
	TM1650_IIC_stop();
}

tm1650.h 

#ifndef TM1650_H_
#define TM1650_H_


//显示参数
#define TM1650_BRIGHT1       0x11   /*一级亮度,打开LED显示*/
#define TM1650_BRIGHT2       0x21   /*二级亮度,打开LED显示*/
#define TM1650_BRIGHT3       0x31   /*三级亮度,打开LED显示*/
#define TM1650_BRIGHT4       0x41   /*四级亮度,打开LED显示*/
#define TM1650_BRIGHT5       0x51   /*五级亮度,打开LED显示*/
#define TM1650_BRIGHT6       0x61   /*六级亮度,打开LED显示*/
#define TM1650_BRIGHT7       0x71   /*七级亮度,打开LED显示*/
#define TM1650_BRIGHT8       0x01   /*八级亮度,打开LED显示*/
#define TM1650_DSP_OFF       0x00   /*关闭LED显示*/

//数码管位选
#define TM1650_DIG1     0
#define TM1650_DIG2     1
#define TM1650_DIG3     2
#define TM1650_DIG4     3

void TM1650_init(void);
void TM1650_cfg_display(uint8_t param);
void TM1650_clear(void);
void TM1650_print(uint8_t dig,uint8_t seg_data);

#endif //TM1650_H_

tm1650_config.h 文章来源地址https://www.toymoban.com/news/detail-410304.html

#ifndef TM1650_CONFIG_H_
#define TM1650_CONFIG_H_

#include "gd32f1x0.h"

//==========【配置IIC驱动引脚】========

//配置驱动SCL的gpio为开漏输出模式
#define  TM1650_IIC_SCL_MODE_OD   \
do{ gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_10); \
gpio_output_options_set(GPIOA, GPIO_OTYPE_OD, GPIO_OSPEED_10MHZ, GPIO_PIN_10); \
}while(0)

//配置驱动SDA的gpio为开漏输出模式
#define  TM1650_IIC_SDA_MODE_OD  \
do{ gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_9); \
gpio_output_options_set(GPIOA, GPIO_OTYPE_OD, GPIO_OSPEED_10MHZ, GPIO_PIN_9); \
}while(0)

//=====================================


//========【配置IIC总线的信号读写和时序】=======
//主机拉高SCL
#define TM1650_IIC_SCL_HIGH     gpio_bit_set(GPIOA,GPIO_PIN_10)

//主机拉低SCL
#define TM1650_IIC_SCL_LOW      gpio_bit_reset(GPIOA,GPIO_PIN_10)


//主机拉高SDA
#define TM1650_IIC_SDA_HIGH     gpio_bit_set(GPIOA,GPIO_PIN_9)

//主机拉低SDA
#define TM1650_IIC_SDA_LOW      gpio_bit_reset(GPIOA,GPIO_PIN_9)

//参数b为0时主机拉低SDA,非0则拉高SDA
#define TM1650_IIC_SDA_WR(b)    do{                                       \
                               if(b) gpio_bit_set(GPIOA,GPIO_PIN_9);   \
                               else  gpio_bit_reset(GPIOA,GPIO_PIN_9); \
                              }while(0)


//主机读取SDA线电平状态,返回值为0为低电平,非0则为高电平
#define TM1650_IIC_SDA_RD()    gpio_input_bit_get(GPIOA,GPIO_PIN_9) 

//软件延时2us
#define TM1650_IIC_DELAY_2US   do{for(int ii_=0;ii_<22;ii_++);}while(0)

//软件延时4us
#define TM1650_IIC_DELAY_4US   do{for(int ii_=0;ii_<40;ii_++);}while(0)
//================================


#endif //TM1650_CONFIG_H_

到了这里,关于TM1650数码管驱动芯片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Arduino UNO驱动TM1637四位时钟数码管显示时间

    TM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。  显示模式(8 段×6 位),支持共阳数码管输出  键扫描(8×2bit),增强型抗干扰按键识别电路  辉度调节电路(占空比

    2024年02月12日
    浏览(43)
  • 【洋桃一号板】STM32F103CBT6标准库函数驱动TM1640点亮数码管

    一、今天介绍如何使用STM32F103CBT6驱动TM1640点亮数码管,硬件用的洋桃开发板,点亮后效果如下,六个数码管依次显示0.1.2.3.4.5.6.7 硬件原理图如下,只用到了单片机的两个IO口即可实现上图的效果,该开发板上用的是PA11和PA12两个IO口,用来模拟IIC通信,其中PA11接SCLK,PA12接D

    2024年02月16日
    浏览(50)
  • STM32使用HAL库驱动TA6932数码管驱动芯片

    8段16位,支持共阴共阳LED数码管。 推挽配置即可。 1、使用TA6932_Init进行初始化 2、使用TA6932_Disp(uint8_t *_ucPtr,uint8_t _ucLenth)进行显示,_upPtr指针指向段码,_ucLenth为显示长度,不超过16位。

    2024年02月07日
    浏览(45)
  • STM32 Proteus仿真4x4矩阵15位抢答器数码管TM1637显示-0039

    STM32 Proteus仿真4x4矩阵15位抢答器数码管TM1637显示-0039 Proteus 仿真小实验: STM32 Proteus仿真4x4矩阵15位抢答器数码管TM1637显示-0039 功能: 硬件组成:STM32F103R6单片机 +TM1637驱动4位数码管+4x4矩阵键盘+蜂鸣器 1.有一个开启键,点击后蜂鸣器短响一声,开始抢答。此后4位数码管倒计

    2024年02月08日
    浏览(43)
  • STM32HAL库驱动数码管

    本文档创建于2023年3月7日 本文记录了我学习数码管驱动的过程,实际是微机原理课上留的一个作业。 本文作者:RobotFreak 本文参考《NANO_STM32F103开发指南-HAL库版本_V2.0》,正点原子官网可下载。 数码管,也称LED数码管,按发光二极管单元连接方式可分为“共阳极数码管”和“

    2024年02月08日
    浏览(39)
  • FPGA 驱动数码管动态显示(Verilog&Vivado)

    应用实例: (1)使用串口发送实现ACX720开发板时钟显示 本章将实现 FPGA 驱动数码管动态显示并提取出实现的电路结构,从电路结构入手编写代码,仿真对设计进行验证。最终板级调试时使用 Virtual Input/Output(VIO,虚拟输入/输出端口工具),输入需要显示的数据,数码管则显

    2023年04月12日
    浏览(57)
  • 底层驱动实现数码管显示温湿度数值功能

    开发板:STM32MP157A 温湿度传感器:si7006 显示器(数码管):m74hc595 遇到的问题:循环采集温湿度传感器数值,并将数值发送给数码管的时候两者存在竞态关系,导致数码管显示亮度很暗 解决办法:采用多线程或者多进程解决内核竞态问题 驱动代码 应用层代码 头文件

    2024年02月12日
    浏览(43)
  • 51单片机驱动8位数码管(74HC595驱动)滚动显示

    原文链接:https://www.yourcee.com/newsinfo/2929591.html 点击图片购买 主要关注下供电电压是3.0-5.0v(建议5V),请在规定范围内供电。 模块上芯片引出5个引脚,芯片引脚与模块引脚对应关系是:VCC-VCC SCK-SCLK, RCK-RCLK,SER-DIO,GND-GND 可以对比程序学习时序图,便于理解。 1.显示异常可排除

    2024年02月15日
    浏览(59)
  • 【Proteus仿真】| 51单片机——MAX7219 驱动数码管

    系列文章 todo: 该文章目的:让大家快速上手——知道如何使用MAX7219。故MAX7219就不做详细介绍了(需要了解的话可以看其他博文及数据手册)。 max7219是一个串行输入/输出 共阴极 数码管(点阵)驱动芯片。1个MAX7219最多可以驱动8位数码管。它具有自动扫描(切换位),BCD译码器(即

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包