-
2021-08-01 03:51:28
#define DATA_COMMAND 0X40
#define DISP_COMMAND 0x80
#define ADDR_COMMAND 0XC0
//TM1638模块引脚定义
int DIO = 2;
int CLK = 1;
int STB = 0; //这里定义了那三个脚
//共阴数码管显示代码
unsigned char tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char num[8]; //各个数码管显示的值
void setup ()
{
pinMode(STB,OUTPUT);
pinMode(CLK,OUTPUT);
pinMode(DIO,OUTPUT); //让三个脚都是输出状态
}
void loop()
{
unsigned char i;
init_TM1638(); //初始化TM1638
for(i=0;i<8;i++)
Write_DATA(i<<1,tab[0]); //初始化寄存器
while(1)
{
i=Read_key(); //读按键值
if(i<8)
{
num[i]++;
while(i==Read_key()); //等待按键释放
if(num[i]>15)
num[i]=0;
Write_DATA(i*2,tab[num[i]]);
Write_allLED(1<
}
}
}
void TM1638_Write(unsigned char DATA) //写数据函数
{
unsigned char i;
pinMode(DIO,OUTPUT);
for(i=0;i<8;i++)
{
digitalWrite(CLK,LOW);
if(DATA&0X01)
digitalWrite(DIO,HIGH);
else
digitalWrite(DIO,LOW);
DATA>>=1;
digitalWrite(CLK,HIGH);
}
}
unsigned char TM1638_Read(void) //读数据函数
{
unsigned char i;
unsigned char temp=0;;
pinMode(DIO,INPUT);//设置为输入
for(i=0;i<8;i++)
{
temp>>=1;
digitalWrite(CLK,LOW);
if(digitalRead(DIO)==HIGH)
temp|=0x80;
digitalWrite(CLK,HIGH);
}
return temp;
}
void Write_COM(unsigned char cmd) //发送命令字
{
digitalWrite(STB,LOW);
TM1638_Write(cmd);
digitalWrite(STB,HIGH);
}
unsigned char Read_key(void)
{
unsigned char c[4],i,key_value=0;
digitalWrite(STB,LOW);
TM1638_Write(0x42); //读键扫数据 命令
for(i=0;i<4;i++)
{
c[i]=TM1638_Read();
}
digitalWrite(STB,HIGH); //4个字节数据合成一个字节
for(i=0;i<4;i++)
{
key_value|=c[i]<
}
for(i=0;i<8;i++)
{
if((0x01<
break;
}
return i;
}
void Write_DATA(unsigned char add,unsigned char DATA) //指定地址写入数据
{
Write_COM(0x44);
digitalWrite(STB,LOW);
TM1638_Write(0xc0|add);
TM1638_Write(DATA);
digitalWrite(STB,HIGH);
}
void Write_allLED(unsigned char LED_flag) //控制全部LED函数,LED_flag表示各个LED状态
{
unsigned char i;
for(i=0;i<8;i++)
{
if(LED_flag&(1<
Write_DATA(2*i+1,1);
else
Write_DATA(2*i+1,0);
}
}
//TM1638初始化函数
void init_TM1638(void)
{
unsigned char i;
Write_COM(0x8b); //亮度 (0x88-0x8f)8级亮度可调
Write_COM(0x40); //采用地址自动加1
digitalWrite(STB,LOW); //
TM1638_Write(0xc0); //设置起始地址
for(i=0;i<16;i++) //传送16个字节的数据
TM1638_Write(0x00);
digitalWrite(STB,HIGH);
}
更多相关内容 -
TM1638驱动数码管的一点建议,附程序
2022-02-11 01:11:21年过完了,首先祝大家开工大吉! TM1638是一种带键盘扫描接口的数码管驱动芯片。可以驱动共阳极数码管或共阴极数码管,相比单片机直接驱动数码管的方案,可以省去很多单片机的端口,也不...年过完了,首先祝大家开工大吉!
TM1638是一种带键盘扫描接口的数码管驱动芯片。可以驱动共阳极数码管或共阴极数码管,相比单片机直接驱动数码管的方案,可以省去很多单片机的端口,也不需要浪费资源去扫描显示了。使用方便,价格也便宜。
最近一个项目用到它,没详细看数据手册,只是按照数据手册给的共阳极的原理图画了电路。
然而板子做好了写程序时发现,它的寄存器是按照共阴极数码管的方式定义的。驱动共阴极数码管,只需要写1个或2个(如果用到SEG9和SEG10)寄存器即可,寄存器的8位对应一个数码的8段,非常简单,如下:
然而,驱动共阳极数码管,则需要写8个或16个(如果用到SEG9和SEG10)寄存器。而且还需要根据自己的电路图进行行列的转换,移位操作。程序上,比共阴极的驱动方式要复杂很多。
无奈,板子已经做好了,只能按照共阳极的写程序,下面是我写的共阴极寄存器转换为共阳极显示的程序。
void Convert() { uint8_t Temp; uint8_t i,j,k; for(i=0; i<8; i++) //8个寄存器 { Temp = Disp_Cathode_Reg[i];//共阴极寄存器 for(j=0; j<16; j+=2) //8个寄存器移位 { Disp_Anode_Reg[j] = Disp_Anode_Reg[j]>>1; } for(j=0; j<8; j++) //8位 { k=j<<1; if(Temp&0x01) { Disp_Anode_Reg[k] |= 0x80; } else { Disp_Anode_Reg[k] &= 0x7F; } Temp = Temp>>1; } } for(i=0; i<16; i+=2) //8个寄存器 { Disp_Anode_Reg[i+1] = Disp_Anode_Reg[i]>>5; Disp_Anode_Reg[i] = Disp_Anode_Reg[i]<<3; } }
共阴极的方式最多可驱动8位x10段的数码管,而共阳极可驱动10位x8端的数码管。这里给大家提个醒,电路尽量要按照共阴极的方式设计,写程序方便。如果数码管位数大于8位,必须按照共阳极的方式设计,也要尽量按照顺序去设计数码管的位和段,这样程序做转换时逻辑也简单一些。
最后附上完整驱动程序,仅供参考。(公众号不支持外部链接,请复制到浏览器打开)
链接:https://pan.baidu.com/s/1DCSW039uw8n4ugY5dLntZg
提取码:bpka
推荐阅读:
欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。
-
tm1638 stm32驱动程序
2021-03-29 09:00:18tm1638数码管专用芯片的stm32驱动程序,网上好多都是用51驱动的,这里的是stm32的程序,要考虑时序的问题! -
STM32 TM1640驱动数码管例程
2021-08-02 00:43:53MCU型号是STM32F103C8T6;TM1640的SCLK接PA11,DIN接PA12。程序模板通过STM32CubeMX配置生成。可以实现对应位的数码管显示指定数字。例程是用八位数码管显示圆周率。 -
TM1638驱动程序
2015-01-26 08:29:43TM1638驱动程序 亲测可以的 ≧▽≦ 啦啦啦 -
TM1638芯片 LED数码管驱动器 详细介绍
2020-03-05 11:19:39目录TM1638简介器件特性TM1638引脚图引脚功能说明TM1638地址组 显存地址 键值地址TM1638指令表 指令分类 数据命令 地址命令 显示控制命令TM1638的两种数码管使用方式共阴方式共阳方式TM1638数据格式按键扫描和...相比MAX7219,TM1638的操作更加复杂,但是功能也更加强大 目录
TM1638简介
TM1638是深圳市天微电子有限公司设计的一款带键盘扫描接口的LED(发光二极管显示器)驱动控制专用芯片,内部集成有MCU数字接口、数据锁存器、LED高压驱动、键盘扫描等电路。主要应用于冰箱、空调 、家庭影院等产品的高段位显示屏驱动。
器件特性
- 采用功率CMOS 工艺
- 显示模式 10 段×8 位
- 键扫描(8×3bit)
- 8级辉度可调
- 串行接口(CLK,STB,DIO)
- 振荡方式:RC 振荡(450KHz+5%)
- 内置上电复位电路
- 采用SOP28封装
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 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<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 -
基于STM32+TM1638芯片的共阳极数码管驱动程序
2020-01-10 13:21:281,基于STM32+TM1638芯片的共阳极数码管驱动程序,可同时驱动8个数码管,函数封装很好,使用时只需要调用函数,参数为每个数码管需要显示的数字即可 2,亲测有效,有疑问可在下面评论 -
tm1638 2*5位 8段共阳数码管驱动
2018-05-14 06:53:40tm1638 2*5位 8段共阳数码管驱动, Device: STM32F030CCT6, IDE: IAR, -
TM1638数码管显示板(8数码管+16按键)单片机C语言驱动程序(显示功能)
2021-11-19 19:41:08该模块的大部分驱动程序与另一款TM1638驱动的8个数码管、8个LED、8个按键的显示板的程序一致,该模块驱动程序见 TM1638显示板(8数码管+8LED+8按键)驱动程序(显示功能) 2.1 端口设置函数 /**********************...一、概述
模块如下图,8位共阳数码管,16个按键,8个led灯。
笔者采用的MCU是STM32F103C8T6,IAR开发环境,使用了HAL库。二、源代码
该模块的大部分驱动程序与另一款TM1638驱动的8个数码管、8个LED、8个按键的显示板的程序一致,该模块驱动程序见
TM1638显示板(8数码管+8LED+8按键)驱动程序(显示功能)2.1 端口设置函数
/******************************************************************************* * 函数名:Port_SetMode * 功 能:GPIO设置输入或输出模式 * 参 数:*GPIOx 引脚组号 GPIO_Pin引脚号 u32Mode输入或输出模式 * 返回值:无 * 说 明:无 *******************************************************************************/ void Port_SetMode(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, uint32_t u32Mode) { GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_Pin; GPIO_InitStruct.Mode = u32Mode; //GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); }
2.2 TM1638驱动函数
2.2.1 头文件TM1638.h
/******************************************************************************* * 文件:TM1638.h * 作者:https://blog.csdn.net/wanglong3713 * 版本:v1.0 * 日期:2021-1-3 * 说明:适用于TM1638驱动的8个共阳数码管、16个按键的显示板 *******************************************************************************/ #ifndef _TM1638_H_ #define _TM1638_H_ #include "Typedefine.h" #include "Port.h" /******************************************************************************* Macro definitions *******************************************************************************/ #define TUBE_DISPLAY_NULL 26 #define TUBE_DISPLAY_DECIMAL_PIONT_OFFSET 16 #define TM1638_STBSet() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET) #define TM1638_STBReset() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET) #define TM1638_CLKSet() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET) #define TM1638_CLKReset() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET) #define TM1638_DIOSet() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET) #define TM1638_DIOReset() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET) #define TM1638_DIOModeOutput() Port_SetMode(GPIOB, GPIO_PIN_9, GPIO_MODE_OUTPUT_PP) #define TM1638_DIOModeInput() Port_SetMode(GPIOB, GPIO_PIN_9, GPIO_MODE_INPUT) #define TM1638_DIORead() HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9) /******************************************************************************* Typedef definitions *******************************************************************************/ typedef struct { uint8_t tube0; uint8_t tube1; uint8_t tube2; uint8_t tube3; uint8_t tube4; uint8_t tube5; uint8_t tube6; uint8_t tube7; }TM1638Tube_ts; /******************************************************************************* Global functions *******************************************************************************/ void TM1638_Init(void); void TM1638_TubeDisplay(TM1638Tube_ts data); void TM1638_LedDisplay(uint8_t data); uint8_t TM1638_ReadKey(void); void TM1638_WriteCmd(uint8_t u8Cmd); void TM1638_SetBrightness(uint8_t u8Brt); void TM1638_Switch(bool bState); #endif /***********************************END OF FILE********************************/
2.2.2 TM638.c文件
/******************************************************************************* * 文件:TM1638.c * 作者:whttps://blog.csdn.net/wanglong3713 * 版本:v1.0 * 日期:2022-1-3 * 说明:适用于TM1638驱动的8个共阳数码管、16个按键的显示板 *******************************************************************************/ #include "TM1638.h" //数码管数字段码表 const uint8_t TM1638_TubeNumTab[] = { //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, C, d, E, F, 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71, //0., 1., 2., 3., 4., 5., 6., 7., 8., 9. Null 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x00 }; //显示寄存器地址 const uint8_t TM1638_TubeAddrTab[] = { 0xC0,0xC2,0xC4,0xC6,0xC8,0xCA,0xCC,0xCE }; /******************************************************************************* * 函数名:TM1638_WriteData * 功 能:TM1638写数据 * 参 数:u8Data需要写入的数据 * 返回值:无 * 说 明:无 *******************************************************************************/ void TM1638_WriteData(uint8_t u8Data) { uint8_t i; TM1638_DIOModeOutput();//DIO设置为输出 for(i = 0; i < 8; i++) { TM1638_CLKReset(); (u8Data & 0x01) ? (TM1638_DIOSet()):(TM1638_DIOReset()); u8Data >>= 1; TM1638_CLKSet(); } } /******************************************************************************* * 函数名:TM1638_WriteCmd * 功 能:TM1638写命令字 * 参 数:u8Cmd需要写入的命令 * 返回值:无 * 说 明:发送命令字时STB置0,发送完置1 *******************************************************************************/ void TM1638_WriteCmd(uint8_t u8Cmd) { TM1638_STBReset(); TM1638_WriteData(u8Cmd); TM1638_STBSet(); } /******************************************************************************* * 函数名:TM1638_ReadData * 功 能:TM1638读数据 * 参 数:无 * 返回值:读出的数据 * 说 明:无 *******************************************************************************/ uint8_t TM1638_ReadData(void) { uint8_t i; uint8_t temp=0; TM1638_DIOModeInput();//DIO设置为输入 for(i = 0; i < 8; i++) { temp >>= 1; TM1638_CLKReset(); if(TM1638_DIORead() == 1) { temp |= 0x80; } TM1638_CLKSet(); } return temp; } /******************************************************************************* * 函数名:TM1638_TubeDisplay * 功 能:8个数码管显示 * 参 数:sData显示数据结构体 * 返回值:无 * 说 明:共阳极数码管,数据为从右至左顺序; temp1保存8个数码管需要显示的数据,temp2保存需要往显示寄存器发送的数据; *******************************************************************************/ void TM1638_TubeDisplay(TM1638Tube_ts sData) { uint8_t temp1[8], temp2[8]; uint8_t i, j; uint8_t u8InitVal = 0x01;//用于提取8个temp1中的8个位 //8个数码管需要显示的数据 temp1[0] = TM1638_TubeNumTab[sData.tube7]; temp1[1] = TM1638_TubeNumTab[sData.tube6]; temp1[2] = TM1638_TubeNumTab[sData.tube5]; temp1[3] = TM1638_TubeNumTab[sData.tube4]; temp1[4] = TM1638_TubeNumTab[sData.tube3]; temp1[5] = TM1638_TubeNumTab[sData.tube2]; temp1[6] = TM1638_TubeNumTab[sData.tube1]; temp1[7] = TM1638_TubeNumTab[sData.tube0]; //每个数码管的数据temp1,取1位,保存在一个temp2中 for (i = 0; i < 8; i++) { temp2[i]=0; for (j = 0; j < 8; j++) { temp2[i] += (((temp1[j] & u8InitVal) >> i) << j); } u8InitVal <<= 1; } for(i = 0; i < 8; i++) { TM1638_STBReset(); TM1638_WriteData(TM1638_TubeAddrTab[i]);//地址 TM1638_WriteData(temp2[i]);//数据 TM1638_STBSet(); } } /******************************************************************************* * 函数名:TM1638_SetBrightness * 功 能:设置亮度 * 参 数:u8Brt亮度,共8级,0~7 * 返回值:无 * 说 明:0x88为开显示 *******************************************************************************/ void TM1638_SetBrightness(uint8_t u8Brt) { TM1638_WriteCmd(0x88 | u8Brt); } /******************************************************************************* * 函数名:TM1638_Switch * 功 能:显示开关 * 参 数:0关,1开 * 返回值:无 * 说 明:0x88为开显示 *******************************************************************************/ void TM1638_Switch(bool bState) { bState ? TM1638_WriteCmd(0x88) : TM1638_WriteCmd(0x80); } /***********************************END OF FILE********************************/
2.3 重点函数解析
该显示板的以上驱动函数中,需要说明一下的是这个函数
/******************************************************************************* * 函数名:TM1638_TubeDisplay * 功 能:8个数码管显示 * 参 数:sData显示数据结构体 * 返回值:无 * 说 明:共阳极数码管,数据为从右至左顺序; temp1保存8个数码管需要显示的数据,temp2保存需要往显示寄存器发送的数据; *******************************************************************************/ void TM1638_TubeDisplay(TM1638Tube_ts sData)
在解析之前,先看原理图中数码管的连接方式,SG1-SG8分别连一个数码管,相当于“片选”,GR1-GR8分别连接8段数码管的a-g、dp,即数码管的“段选”。
共阳数码管的驱动程序比共阴数码管的要繁琐一些。如上图手册描述(手册下载地址),不考虑小数点位,数码管阳极连接SEG1,让该数码管显示0,即abcdef点亮,g熄灭,段码为0x3F,即二进制0011 1111,向地址00H-0AH都发送了1,而向0CH(和0EH)发送了0,即将0x3F从低位到高位,每1位分别发送给00H-0CH;同理,每个SEG连接的数码管都要这样发送,所以,8个数码管的显示数据,要将每一个数码管显示的段码的最低位拆出来,然后将8个数码管的段码的最低位(第0位),组合到一块成一个字节,同时发送给同一个地址00H,然后是第1位-第7位都进行相同的操作,这样就可以将8个数码管的数据,全部送给需要的显示寄存器的地址了。
8个数码管的地址从左至右依次为00H、02H、04H、06H、08H、0AH、0CH、0EH,对应的地址设置命令分别为C0H、C2H、C4H、C6H、C8H、CAH、CCH、CEH(手册5.2章节)。三、显示效果
显示01234567:
四、总结
TM1638驱动共阳数码管,最重要的是要清楚,向显示寄存器中写入的数据,实际并不是每个数码管的段码,而是8个数码管的段码,重新组合以后的数据。
-
TM1638显示板(8数码管+8LED+8按键)驱动程序(显示功能)
2021-10-01 00:17:54之前记录过TM637数码管显示模块的驱动C语言程序(详见4位数码管显示模块TM1637芯片C语言驱动程序),本文分享一下天微电子的另一款数码管按键驱动芯片TM1638的单片机C语言驱动程序。 模块如下图,8位共阴数码管,8个... -
TM1638的一些使用以及点亮数码管程序
2021-06-20 00:02:17驱动共阴数码管二、C51控制TM1638程序1.驱动函数2.主函数3.测试效果总结 一、TM1638按键数码管模块说明 1.TM1638概述和特性 TM1638是带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU数字... -
TM1638控制共阳数码管显示的相关函数代码
2018-07-23 11:02:17TM1638控制共阳数码管显示的例子网上不是太多,所以做这一块的时候研究了一段时间,我把自己做的传上来,想给可能会用到的朋友提供一些参照。程序正常使用,测试没有问题。 -
TM1638驱动显示板(8数码管+8LED+8按键)单片机C语言程序(按键功能)
2021-11-23 23:40:09上一篇文章记录了TM1638驱动的显示模块的显示功能C语言程序,详见TM1638显示板(8数码管+8LED+8按键)驱动程序(显示功能),本文分享按键的驱动,以及按键的去抖动等操作。 模块如下图: 笔者采用的MCU是STM32F103... -
TM1638模块驱动(stm32,可以显示led灯,数码管,按键操作)(包含全部功能)
2021-08-06 15:54:22#include "TM1638.h" //************************************************************ #define DISP_CMD0 0x00 //4位13段 #define DISP_CMD1 0x01 //5位12段 #define DISP_CMD2 0x02 //6位11段 #define DISP_CMD... -
TM1638八位数码管八按键驱动程序(stm32f103驱动,使用了stm32 3.5库)
2014-08-26 10:17:55/********************************************************************************************** **Program Assignment: Driver for TM1638 digital tube **Author : Wuwang **Date : 2014.8 -
TM1628_TM1628完整PDF资料及驱动程序_数码管芯片IIC_TM1628_areafi8_
2021-10-01 09:49:39数码管、按键驱动芯片,IIC通讯接口,极少的芯片管脚占用,附驱动软件3979086nan/20200115/41a7840567c9002a083cfa729f1ffe9c.zip -
Arduino UNO 利用3个IO口 + TM1638+驱动8位数码管显示+24个独立按键
2021-12-13 21:04:11在之前使用TM1638作为数码管单独驱动显示,还是很顺利的,看到还自带按键扫描功能,这个非常不错,可以省掉3X8的矩阵键盘,虽然不一定能使用的上,差不多能把这个芯片的功能基本都榨干了,因为是使用的共阴数码管... -
TM1620_worsezet_TM1620数码管驱动_tm1620编程_tm1620数码管_Tm1620_
2021-09-30 00:22:06TM1620 数码管驱动 4位LED数码管 -
stc8系列的 tm1650数码管驱动亲测可用
2021-07-24 18:31:34stc8系列的 tm1650数码管驱动亲测可用 -
MC9S12XEP100 SPI驱动TM1638控制10个共阳数码管显示
2021-08-26 10:43:13MC9S12XEP100驱动TM1638芯片控制10个共阳数码管显示 最近几天研究了一下1638芯片,现在将配置方法共享给大家,我用的是xep100mcu,...1)设置驱动数码管的地址方式,0x40自动增加(需给一个起始地址,默认00H),0x44固 -
STM32F407控制TM1638按键数码管显示模块
2020-10-16 15:39:55TM1638按键数码管显示模块 实物图 原理图 tm1638.c文件 #include "tm1638.h" #include "delay.h" ////////////////////////////////////////////////////////////////////////////////// /////////////... -
TM1638共阴数码管驱动代码
2013-02-17 10:45:45此代码为官方TM1638的51单片机驱动代码,共阳转共阴,稍作修改即可移植到别的平台 -
TM1640数码管驱动+电路
2020-12-01 12:30:13TM1640数码管驱动芯片:驱动程序 -
数码管驱动TM1640驱动程序
2018-05-27 21:17:41针对研究数码管显示的初学者,本资源包含了TM1640-16位8段数码管的驱动程序代码,有助于初步学习如何驱动数码管显示 -
TM1629D_tm1638共阳程序_tm1638共阳_tm1629d_TM1638_tm1638共阳_
2021-09-29 09:59:37STM32f030+tm1629D12路共阳数码管,4个指示灯,4个按键。注意:文件里的程序是基于TM1638修改的,所以程序里有好多TM1638名字命名的函数,不影响使用 -
数码管驱动芯片TM1616 TM1618 TM1620驱动代码.zip
2020-08-11 14:36:05数码管驱动芯片TM1616 TM1618 TM1620驱动代码TM16XX通用驱动,STM32驱动代码 -
TM1650四位共阴数码管模块配套资料_tm1650驱动共阳_TM1650共阴_tm1650芯片资料_TM1650_共阴数码管_
2021-08-09 21:09:50TM1650芯片驱动四位共阴数码管。即模块配套资料。 -
STM32 TM1637数码管驱动程序
2020-09-17 21:04:56本例程基于STM32F103C8T6单片机,驱动了TM1637数码管进行0-9加点与不加点的数据显示。