TM1638芯片 LED数码管驱动器 详细介绍

2023-11-15

相比MAX7219,TM1638的操作更加复杂,但是功能也更加强大

TM1638简介

  TM1638是深圳市天微电子有限公司设计的一款带键盘扫描接口的LED(发光二极管显示器)驱动控制专用芯片,内部集成有MCU数字接口、数据锁存器、LED高压驱动、键盘扫描等电路。主要应用于冰箱、空调 、家庭影院等产品的高段位显示屏驱动。

器件特性

  • 采用功率CMOS 工艺
  • 显示模式 10 段×8 位
  • 键扫描(8×3bit)
  • 8级辉度可调
  • 串行接口(CLK,STB,DIO)
  • 振荡方式:RC 振荡(450KHz+5%)
  • 内置上电复位电路
  • 采用SOP28封装

TM1638引脚图

TM1638引脚图

引脚功能说明

  • STB:片选端;在上升或下降沿初始化串行接口,随后等待接收指令。当STB 为高时,CLK被忽略
  • DIO:数据端;在时钟上升沿输入/输出串行数据
  • CLK:时钟端;输入时钟信号
  • K1~K3:键扫输入;输入该脚的数据在显示周期结束后被锁存
  • SEG1/KS1~SEG8/KS8:段输出;P管开漏输出,也用作键扫描
  • SEG9,SEG10:段输出;P管开漏输出
  • GRID1~GRID8:位输出;N管开漏输出
  • VDD:电源端;功能
  • GND:逻辑地;功能

TM1638地址组

 显存地址

在这里插入图片描述
  显存地址中,如果GRIDn和SEGn对应的地址里数据为1,则连接到GRIDn和SEGn上的LED段落将会被点亮。 例如00H的数据为0X0F,则连到GIRD1和SEG1、SEG2、SEG3、SEG4上的LED段落将会被点亮

 键值地址

在这里插入图片描述
  每个Byte里储存6个键值数据,相对应的位置为1则代表对应位置有键按下。

TM1638指令表

 指令分类

TM1638通过传送的8位指令的B7,B6两位来区分指令类型:

B7 B6 指令类型
0 1 数据命令
1 1 地址命令
1 0 显示控制命令

 数据命令

在这里插入图片描述

 地址命令

在这里插入图片描述
  地址命令用来设置要写入的数据的地址。数据写入有自增址和固定址两种,固定址每次写入数据需要指定要写入数据的地址。

 显示控制命令

在这里插入图片描述
  显示控制命令主要是用来设置LED的亮度,以及显示开关。

TM1638的两种数码管使用方式

  TM1638的一个优点是:不区分共阴/共阳,两种数码管都可以使用,但是使用方法有所不同。
  这里涉及到TM1638的显示原理:TM1638的GRIDn端是始终保持低电平的,当显存地址里对应的数据为1时,TM1638令与其对应的SEGn端为高电平来使LED导通发光。

共阴方式

  共阴数码管使用同一个阴极和多个阳极,因为GRID始终为低电平,所以只能由1个GRIDn端作为共阴极,而8个SEG端作为阳极。在这里插入图片描述
  这时每个数码管的显示数据由8个SEGn对应1个GRIDn端组成,由显存地址关系图可知每个非奇数地址便储存着1个数码管的显示数据。
  共阴数码管的显存数据写入比共阳方便很多,只用向一个地址写入8位数据即可。例如GRID1和SEG1~SEG8对应共阴LED1,要让其显示 0 则只用向 00H 地址写入 0X3F;
  如下图所示:
在这里插入图片描述
  共阴方式的不足则是无法使用SEG9和SEG10来组成共阴数码管,所以共阴方式最多可以使用8个数码管。多余的SEG9和SEG10仍可以使用,但必须采用共阳方式。

共阳方式

  共阴数码管使用同一个阳极和多个阴极,因为GRID始终为低电平,所以只能由8个GRIDn端作为阴极,1个SEG端作为共阳极。
在这里插入图片描述  这时每个数码管的显示数据由8个GRIDn对应1个SEGn端组成,由显存地址关系图可知:由8个偶数/奇数地址的共同一位组成一个数码管的8位显示数据。
  共阳数码管的数据写入比较麻烦,每为一个数码管写入一次数据都要向8个地址分别写入1位数据。例如GRID1~GRID8和SEG1对应共阴LED1,要让其显示0则要00H,02H,04H,06H,08H,0AH都写入1,向0CH和0EH中写入0
  如下图所示:
在这里插入图片描述
  共阳方式的优点是可以使用多至10个数码管;缺点啧是数据的写入方式比较繁琐,并且需要额外增加数据转换。

TM1638数据格式

  • TM1638的数据读取和发送都在CLK的上升沿进行,因为DIO在时钟的下降沿控制N管动作,此时读数不稳定。
  • TM1638采取低位在前的数据格式,每次发送和读取都是1byte长度,即8位二进制数据
  • 每次STB拉低之后的第一个字节作为指令,处理指令时当前其它处理被终止。

串行数据传输格式

  • 自增址模式下,只用写入一次地址即首地址,之后依次写入数据,每次写入数据,地址自动增加0X01。数据全部写入之后,上拉STB来作为结束的信号。
    在这里插入图片描述
  • 固定址模式下,每次写入数据需要先写入一次地址,为要写入的数据指定写入的地址,之后写入数据,然后上拉STB结束一次写入。
    在这里插入图片描述
  • 读数据以拉低STB写入读键值指令(0X42)作为开始,之后TM1638会依次从低到高的顺序传送4byte的键值数据。读取4byte数据之后上拉STB结束读取。
    在这里插入图片描述

按键扫描和键扫复用

按键扫描电路

  电路的连接方式如下图,Kn端作为列线,KSn端作为行线,当有键按下被扫描到,数据被存入键值寄存器。
在这里插入图片描述
  按键扫描时在端口上的波形:

在这里插入图片描述

按键复用

  SEG1/KS1~SEG8/KS8是复用的端口,作为显示输出同时作为键扫输出端口。当存在按钮同时按下时,如S1,S2,SEG1和SEG2相当于被短路,此时D1,2D两个LED都会被点亮,从而造成显示错误。
  解决方法之一是在每个按键上串联一个二极管,如下图所示,也可以换成510Ω大小的电阻。
在这里插入图片描述

自己编写的驱动程序(C51)

/**********************************************************************************
 * 程序名:    TM1638驱动程序
 * 作者:      DaveoCKII
 * 日期:      2020.2.29
 * 版本:      STC12C5A60S2
 **********************************************************************************/

#ifndef _TM1638_H_
#define _TM1638_H_

#include <STC12C5A60S3.H>		// 自己修改过的STC12C5A60S2的头文件,为了区分原头文件改名S3
//------------------------------------定义列表------------------------------------//
sbit STB = P1^1;        // 片选线
sbit CLK = P1^2;        // 时钟线
sbit DIO = P1^3;        // 数据线
unsigned char ledb[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 			// 显示数据缓冲区
unsigned char LED_CC[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  // 共阴LED显示数据 '0~F'
unsigned char LED_CA[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};  // 共阳LED显示数据 '0~F'
unsigned char x[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};   	// 数据转换中用来提取各位的数据
//------------------------------------函数列表------------------------------------//

void TM1638_LEDCC(unsigned char LEDnums);   // TM1638 LED显示(共阴)

void TM1638_LEDCA(unsigned char LEDnums);   // TM1638 LED显示(共阳)

void TM1638_Write(unsigned char	DATA);      // TM1638 写数据函数

void TM1638_WriteCOM(unsigned char cmd);    // TM1638 写命令函数

unsigned char TM1638_Read(void);            // TM1638 读数据函数

unsigned char TM1638_ReadKey(void);         // TM1638 读键函数

//------------------------------------函数内容------------------------------------//

void TM1638_Write(unsigned char	DATA)	
{
	unsigned char i;
	for(i=0;i<8;i++)     // 1Byte 8位数据
	{
		CLK=0;           // 拉低时钟线
		DIO=DATA&0X01;   // 发送数据
		DATA>>=1;        // 数据格式:低位在前
		CLK=1;           // 拉高时钟线,写入数据
	}
}

void TM1638_WriteCOM(unsigned char cmd)
{
	STB=0;               // 拉低片选线
	TM1638_Write(cmd);   // 写命令
	STB=1;               // 拉高片选线
}

unsigned char TM1638_Read(void)
{
	unsigned char i,Data=0;
    
	DIO=1;               // 初始化数据线
	for(i=0;i<8;i++)    
	{
		Data>>=1;        // 数据格式:低位在前
		CLK=0;
		if(DIO)
			Data|=0x80;
		CLK=1;
	}
	return Data;
}

unsigned char TM1638_ReadKey(void)
{
    unsigned char c[4];         // 4Byte数据储存
    unsigned char i=999;		// 先用作延时
    unsigned char key_value=0;  
    
    STB=0;                      // 拉低片选线,开始读键值
    TM1638_Write(0x42);         // 写'读数据'命令
	while(i--)                  // 等待准备完毕
	for(i=0;i<4;i++)            // 读取4个Byte
		c[i]=TM1638_Read();   
	STB=1;                      // 拉高片选线,读键值结束
    // 8键  col:K3  row:KS1~KS8
    if(c[0]==0x01)  key_value=1;
	if(c[0]==0x10)  key_value=5;
	if(c[1]==0x01)  key_value=2;
	if(c[1]==0x10)  key_value=6;
	if(c[2]==0x01)  key_value=3;
	if(c[2]==0x10)  key_value=7;
	if(c[3]==0x01)  key_value=4;
	if(c[3]==0x10)  key_value=8;
    
    return (key_value);         // 返回键值
}

void TM1638_LEDCC(unsigned char LEDnums)
{
	unsigned char i; 
    
    TM1638_WriteCOM(0x40);      	// 设置地址自增
    
    STB=0;				// 拉低片选线,开始写数据
    TM1638_Write(0xc0);             // 写首地址
    for(i=0; i<LEDnums; i++) {      // 写显示数据
        TM1638_Write(ledb[i]); 
        TM1638_Write(ledb[i+8]);
    }
    for(i=LEDnums; i<8; i++) {      
        TM1638_Write(0); 
        TM1638_Write(0); 
    }    
    STB=1;				// 拉高片选线,结束写数据
}

void TM1638_LEDCA(unsigned char LEDnums)
{
	unsigned char i;
    unsigned char datas[16];
    
    // 数据转换
    for(i=0; i<8; i++){
        datas[i]=(ledb[0]&x[i])+(ledb[1]&x[i])+(ledb[2]&x[i])+(ledb[3]&x[i])+
                 (ledb[4]&x[i])+(ledb[5]&x[i])+(ledb[6]&x[i])+(ledb[7]&x[i]);
    }
    if(LEDnums>8){
        for(i=0; i<8; i++)
            datas[i+8]=(ledb[8]&x[i])+(ledb[9]&x[i]);
    }
    else {
        for(i=0; i<8; i++)
            datas[i]=0x00;
    }
        
    TM1638_WriteCOM(0x40);			// 设置地址自增
    
    STB=0;				// 拉低片选线,开始写数据
    TM1638_Write(0xc0);             // 写首地址
    for(i=0; i<LEDnums; i++) {      // 写显示数据
        TM1638_Write(datas[i]); 
        TM1638_Write(datas[i+8]);
    }
    for(i=LEDnums; i<8; i++) {
        TM1638_Write(0); 
        TM1638_Write(0); 
    }
    STB=1;				// 拉低片选线,结束写数据
}


//--------------------------------------------------------------------------------//


#endif 


  DaveoCKII
2020.3.5

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TM1638芯片 LED数码管驱动器 详细介绍 的相关文章

  • 异常:java lang AbstractMethodError

    通常在尝试调用抽象方法时抛出此 java lang AbstractMethodError 通常 此错误是在编译时本身识别的 如果在运行时抛出此错误 则该类必须不兼容 与先前存在的类不兼容 更改 因此 它是IncompatibleClass
  • 嵌入式 Linux 入门 环境篇(四、必备开发工具安装)

    嵌入式 Linux入门 环境篇第四课 开发工具软件的安装与说明 by 矜辰所致 前言 前面的环境篇我们把开发的基本环境安装好了 Ubuntu虚拟机 网络配置 为了从 0 开始说明 还特意买了一台新电脑 就问是不是不将就 在我们接下来做嵌入式

随机推荐

  • 思科实验18.网络层:OSPF路由协议(下)

    多区域OSPF和RIP结合 实验流程 1 设计拓扑 2 配置主机IP地址 3 配置路由器各端口ip 4 封装OSPF协议 5 封装RIP协议 6 剩余工作 7 验证主机连通 实验流程 mermaid svg k8yA2guPqb8dork0
  • @Autowired注解的底层原理

    Spring框架的便利让我们很容易地使用 Autowired注解实现依赖注入 本篇将深入Spring源码解析 Autowired注解的工作原理 一 Autowired注解的作用 1 Autowired 是一个注释 它可以对类成员变量 方法及
  • 微软服务器导入arm,微软发布Windows 10 Build 20277,在ARM上为Win10引入了x64仿真

    微软已经在开发通道中向Windows Insiders发布了Windows 10 Insider Preview Build 20277 FE PRERELEASE 完整的内部版本号 20277 1 fe release 201207 15
  • JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)

    如果想了解Java内存模型参考 jvm内存模型 和内存分配以及jdk jre jvm是什么关系 阿里 美团 京东 相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题 有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制
  • 关注公号: AI深度视线

    1 引言 摘要 在这项工作中 我们旨在构建一个性能强大的简单 直接和快速的实例分割框架 我们遵循SOLOv1方法的原理 SOLO 按位置分割对象 重要的是 我们通过动态学习目标分割器的mask head 具体来说 将mask分支解耦为mas
  • 秋招提前批!大厂offer的捷径!

    前言 又是一年秋招季 年年岁岁花相似 岁岁年年人不同 今天 博主在牛客上看到一个帖子 24届校招提前批已经开始了 24届大厂提前批 首先 跟大家科普一下提前批的概念 提前批是指企业在校园招聘季之前提前开展的招聘活动 它通常在暑假期间或上半年
  • 基于STM32F103C8T6的高速DMA传输多通道ADC数据

    文章目录 前言 一 软件设计思路 二 代码 总结 前言 ADC在STM32系列单片机的使用中占用着很大的比例 常见的案例是通过ADC单次转换电压值 这种方式的缺陷在于转换效率不高 一般的单片机带有ADC1和ADC2两个ADC转换 单次转换需
  • modbus协议详解_【实例】西门子PLC通过MODBUS控制变频器

    一 MODBUS通信概述 MODBUS协议分为串行链路上MODBUS协议和基于TCP IP协议的MODBUS 协议 串行链路上MODBUS协议有MODBUS ASCAII 字符串 和MODBUS RTU两种 200SMART所提供的MODB
  • 全面分析副业做什么更快速见收益?

    大家好 我是沐小沐 今天我们聊一聊全面分析副业做什么更快速见收益 如今副业刚需的时代 沒有副业 等于你就失去了几百万的车和房 并不夸张 在这个填满焦虑情绪的社会发展 每个人都是在整体规划自身的副业 哪些的副业才算是好的副业呢 我觉得最好是能
  • SAP 科目的 未清项管理的理解

    清账的事务代码 自动清账 F 13 总账清账 F 04 供应商清账 F 53 客户清账 F032 未清项管理是SAP的一个重要功能 通过未清项管理可以实现付款 收款 的一一对应 以及准确的账龄分析 会计科目设置此标志后 系统会将凭证行标记为
  • 在虚拟磁盘中安装Windows Server 2016

    说起来我一直没有安装过Windows服务器版的系统 所以最近想尝试一下Windows Server 2016 这个最新的Windows服务器系统 当然如果是家用的话 肯定还是安装桌面版的系统更好 服务器版的系统主要是企业使用 日常功能反而不
  • python读取每一行再按照空格分隔

    all with open number txt r as f for line in f readlines curLine line strip split print curLine all append curLine f clos
  • 附近商家位置java开发附近定位

    根据给定经纬度 lat lng 求出其左上角 left top 右上角 right top 左下角 left bottom 右下角 right bottom 的四个位置 所有在这个区域的范围都在该点附近 public class Test
  • 最新计算机毕业设计选题推荐 - 毕设选题建议

    文章目录 0 前言 1 java web 管理系统 毕设选题 2 java web 平台 业务系统 毕设选题 3 游戏设计 动画设计类 毕设选题 适合数媒的同学 4 算法开发 5 数据挖掘 毕设选题 6 大数据处理 云计算 区块链 毕设选题
  • 2020全国网络安全知识竞赛链工宝答案 爬取 自动答题

    要用浏览器打开公众号的练题库 然后就可以自动获取答案 最下面是我获取到的300多个题 差不多就这些了 可以进一个加个函数自动答题 def fu try browser refresh time sleep 2 xx browser find
  • STM32F103RET6 ADC配置流程

    STM32F103RET6 ADC基本配置流程 首先 使用RCC库函数RCC APB2PeriphClockCmd使能ADC时钟 可以使用以下代码 RCC APB2PeriphClockCmd RCC APB2Periph ADC1 ENA
  • 开环控制系统与闭环控制系统

    开环控制系统是指无被控量反馈的控制系统 即需要控制的是被控对象的某一量 被控量 而测量的只是给定信号 被控量对于控制作用没有任何影响的系统 结构如图所示 闭环控制的定义是有被控制量反馈的控制 其原理框如图所示 从系统中信号流向看 系统的输出
  • 最强Transformer发布!谷歌大脑提出ViT-G:缩放视觉Transformer,高达90.45%准确率!

    Scaling Vision Transformers 论文 https arxiv org abs 2106 04560 1简介 视觉Transformer ViT 等基于注意力的神经网络最近在许多计算机视觉基准测试中取得了最先进的结果
  • 关于在uni-app中引入组件、css样式以及js文件的方法总结

    uni app是使用vue js开发多端应用的框架 可以说为一些钱多开发者提供了很大的方便 近些天学习了一下vue js 可当开始开发的时候却不知怎么去将文件分块 然后查了一下 发现引入文件确实与传统的html不一样 总结了一下分别引入组件
  • TM1638芯片 LED数码管驱动器 详细介绍

    相比MAX7219 TM1638的操作更加复杂 但是功能也更加强大 目录 TM1638简介 器件特性 TM1638引脚图 引脚功能说明 TM1638地址组 显存地址 键值地址 TM1638指令表 指令分类 数据命令 地址命令 显示控制命令