TM1638芯片的学习使用

Oprah ·
更新时间:2024-09-21
· 687 次阅读

相比MAX7219,TM1638的操作更加复杂,但是功能也更加强大
目录TM1638简介器件特性TM1638引脚图引脚功能说明TM1638地址组 显存地址 键值地址TM1638指令表 指令分类 数据命令 地址命令 显示控制命令TM1638的两种数码管使用方式共阴方式共阳方式TM1638数据格式按键扫描和键扫复用按键扫描电路按键复用自己编写的驱动程序(C51) 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 // 自己修改过的STC12C5A60S2的头文件,为了区分原头文件改名S3 //------------------------------------定义列表------------------------------------// sbit STB = P1^1; // 片选线 sbit CLK = P1^2; // 时钟线 sbit DIO = P1^3; // 数据线 unsigned char led_buffer[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>=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>=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; i8){ 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


作者:DaveoCKII



tm 芯片 学习

需要 登录 后方可回复, 如果你还没有账号请 注册新账号