精华内容
下载资源
问答
  • TM1638驱动数码管的arduino和51单片机源程序与电路图
    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是一种带键盘扫描接口的数码管驱动芯片。可以驱动共阳极数码管或共阴极数码管,相比单片机直接驱动数码管的方案,可以省去很多单片机的端口,也不...

      年过完了,首先祝大家开工大吉!

       TM1638是一种带键盘扫描接口的数码管驱动芯片。可以驱动共阳极数码管或共阴极数码管,相比单片机直接驱动数码管的方案,可以省去很多单片机的端口,也不需要浪费资源去扫描显示了。使用方便,价格也便宜。

      最近一个项目用到它,没详细看数据手册,只是按照数据手册给的共阳极的原理图画了电路。

    9aded9b37780f63eae736a52ff431c65.png

           然而板子做好了写程序时发现,它的寄存器是按照共阴极数码管的方式定义的。驱动共阴极数码管,只需要写1个或2个(如果用到SEG9和SEG10)寄存器即可,寄存器的8位对应一个数码的8段,非常简单,如下:

    11bac01e084fd75561d5e7d876085bf9.png       然而,驱动共阳极数码管,则需要写8个或16个(如果用到SEG9和SEG10)寄存器。而且还需要根据自己的电路图进行行列的转换,移位操作。程序上,比共阴极的驱动方式要复杂很多。

    aa88527e31804d5fc5a35f33501f1fa9.png

    b3c488091ca900f70db08cab6867d5b6.png

           无奈,板子已经做好了,只能按照共阳极的写程序,下面是我写的共阴极寄存器转换为共阳极显示的程序。

    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

    推荐阅读:

    【硬件设计】电源防反接电路设计

    【硬件设计】几种电平转换电路

    【软件设计】Keil总是未响应?

    【软件设计】STM32软件调用系统BootLoader

       欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

    展开全文
  • tm1638 stm32驱动程序

    2021-03-29 09:00:18
    tm1638数码管专用芯片的stm32驱动程序,网上好多都是用51驱动的,这里的是stm32的程序,要考虑时序的问题!
  • MCU型号是STM32F103C8T6;TM1640的SCLK接PA11,DIN接PA12。程序模板通过STM32CubeMX配置生成。可以实现对应位的数码管显示指定数字。例程是用八位数码管显示圆周率。
  • TM1638驱动程序

    2015-01-26 08:29:43
    TM1638驱动程序 亲测可以的 ≧▽≦ 啦啦啦
  • 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引脚图

    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

    展开全文
  • 1,基于STM32+TM1638芯片的共阳极数码管驱动程序,可同时驱动8个数码管,函数封装很好,使用时只需要调用函数,参数为每个数码管需要显示的数字即可 2,亲测有效,有疑问可在下面评论
  • tm1638 2*5位 8段共阳数码管驱动, Device: STM32F030CCT6, IDE: IAR,
  • 该模块的大部分驱动程序与另一款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个数码管的段码,重新组合以后的数据。

    展开全文
  • 之前记录过TM637数码管显示模块的驱动C语言程序(详见4位数码管显示模块TM1637芯片C语言驱动程序),本文分享一下天微电子的另一款数码管按键驱动芯片TM1638的单片机C语言驱动程序。 模块如下图,8位共阴数码管,8个...
  • 驱动共阴数码管二、C51控制TM1638程序1.驱动函数2.主函数3.测试效果总结 一、TM1638按键数码管模块说明 1.TM1638概述和特性 TM1638是带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU数字...
  • TM1638控制共阳数码管显示的例子网上不是太多,所以做这一块的时候研究了一段时间,我把自己做的传上来,想给可能会用到的朋友提供一些参照。程序正常使用,测试没有问题。
  • 上一篇文章记录了TM1638驱动的显示模块的显示功能C语言程序,详见TM1638显示板(8数码管+8LED+8按键)驱动程序(显示功能),本文分享按键的驱动,以及按键的去抖动等操作。 模块如下图: 笔者采用的MCU是STM32F103...
  • #include "TM1638.h" //************************************************************ #define DISP_CMD0 0x00 //4位13段 #define DISP_CMD1 0x01 //5位12段 #define DISP_CMD2 0x02 //6位11段 #define DISP_CMD...
  • /********************************************************************************************** **Program Assignment: Driver for TM1638 digital tube **Author : Wuwang **Date : 2014.8
  • 数码管、按键驱动芯片,IIC通讯接口,极少的芯片管脚占用,附驱动软件3979086nan/20200115/41a7840567c9002a083cfa729f1ffe9c.zip
  • 在之前使用TM1638作为数码管单独驱动显示,还是很顺利的,看到还自带按键扫描功能,这个非常不错,可以省掉3X8的矩阵键盘,虽然不一定能使用的上,差不多能把这个芯片的功能基本都榨干了,因为是使用的共阴数码管...
  • TM1620 数码管驱动 4位LED数码管
  • stc8系列的 tm1650数码管驱动亲测可用
  • MC9S12XEP100驱动TM1638芯片控制10个共阳数码管显示 最近几天研究了一下1638芯片,现在将配置方法共享给大家,我用的是xep100mcu,...1)设置驱动数码管的地址方式,0x40自动增加(需给一个起始地址,默认00H),0x44固
  • TM1638按键数码管显示模块 实物图 原理图 tm1638.c文件 #include "tm1638.h" #include "delay.h" ////////////////////////////////////////////////////////////////////////////////// /////////////...
  • 此代码为官方TM1638的51单片机驱动代码,共阳转共阴,稍作修改即可移植到别的平台
  • TM1640数码管驱动+电路

    2020-12-01 12:30:13
    TM1640数码管驱动芯片:驱动程序
  • 针对研究数码管显示的初学者,本资源包含了TM1640-16位8段数码管的驱动程序代码,有助于初步学习如何驱动数码管显示
  • STM32f030+tm1629D12路共阳数码管,4个指示灯,4个按键。注意:文件里的程序是基于TM1638修改的,所以程序里有好多TM1638名字命名的函数,不影响使用
  • 数码管驱动芯片TM1616 TM1618 TM1620驱动代码TM16XX通用驱动,STM32驱动代码
  • TM1650芯片驱动四位共阴数码管。即模块配套资料。
  • 本例程基于STM32F103C8T6单片机,驱动TM1637数码管进行0-9加点与不加点的数据显示。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 603
精华内容 241
关键字:

tm1638驱动数码管

友情链接: Music.rar