精华内容
下载资源
问答
  • 2021-07-28 13:55:34

            TM1650可以节省单片机引脚驱动数码管利用时序图写出驱动程序。

    void I2CStart(void)//开始信号
    {
    	CLK_H;
    	DIO_H;
    	Delay_us(5);
    	DIO_L;
    
    }
    
    void I2Cask(void) //ACK信号
    {
    	u8 timeout = 1;
    	CLK_H;
    	Delay_us(5);
    	CLK_L;
    	while((DIO)&&(timeout<=100))
    	{
    	  timeout++;
    	}
    	Delay_us(5);
    	CLK_L;
    }
    
    void I2CStop(void) //停止信号
    {
    	CLK_H;
    	DIO_L;
    	Delay_us(5);
    	DIO_H;
    }
    
    void I2CWrByte(u8 oneByte) //写一个字节高位在前,低位在后
    {
    	u8 i;
    	CLK_L;
    	Delay_us(1);
    	for(i=0;i<8;i++)
    	{
    	oneByte = oneByte<<1;
    	DIO = CY;
    	CLK_L;
    	Delay_us(5);
    	CLK_H;
    	Delay_us(5);
    	CLK_L;
    	}
    }
    
    
    /****************数码管显示*****************/
    void TM1650_Set(u8 add,u8 dat) 
    {
    //写显存必须从高地址开始写
    	I2CStart();
    	I2CWrByte(add); //第一个显存地址
    	I2Cask();
    	I2CWrByte(dat);
    	I2Cask();
    	I2CStop();
    }
    

    更多相关内容
  • 数码管、按键驱动芯片,IIC通讯接口,极少的芯片管脚占用,附驱动软件3979086nan/20200115/41a7840567c9002a083cfa729f1ffe9c.zip
  • 本例程基于STM32F103C8T6单片机,驱动TM1637数码管进行0-9加点与不加点的数据显示。
  • MCU型号是STM32F103C8T6;TM1640的SCLK接PA11,DIN接PA12。程序模板通过STM32CubeMX配置生成。可以实现对应位的数码管显示指定数字。例程是用八位数码管显示圆周率。
  • STM8单片机驱动TM1628的示例程序

    千次阅读 2021-09-16 10:16:32
    STM8单片机驱动LED驱动芯片TM1628的示例程序,四位共阴数码管,显示“1234”,开发环境为IAR FOR STM8,程序代码如下: #include "iostm8s105s4.h>" #define uchar unsigned char #define uint unsigned int //...

    STM8单片机驱动LED驱动芯片TM1628的示例程序,四位共阴数码管,显示“1234”,开发环境为IAR FOR STM8,程序代码如下:

    #include "iostm8s105s4.h>"

    #define    uchar    unsigned char
    #define    uint    unsigned int
    //------显示任务变量定义-------------------------------------------------------
    #define DIS_STB_H()        (PE_ODR|=0x20)               //SPI接口PE5
    #define DIS_STB_L()        (PE_ODR&=0xdf)               //SPI接口
    #define DIS_SCK_H()        (PC_ODR|=0x04)               //SPI接口PC2
    #define DIS_SCK_L()        (PC_ODR&=0xfb)               //SPI接口
    #define DIS_DIO_H()        (PC_ODR|=0x08)               //SPI接口PC3
    #define DIS_DIO_L()        (PC_ODR&=0xf7)               //SPI接口
    uchar Display_Value[4]={0,0,0,0};
    const uchar DISP_TAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0 ~ 9
    const uchar DISP_POSITION[4]={0xc0,0xc2,0xc4,0xc6}; //显示地址

    /*********************************************
    * 发送一字节数据到TM1628
    *********************************************/
    void TM1628_Send_Byte(uchar dat)
    {    
      uchar i;
      for (i = 0; i < 8; i++)
      {    
        DIS_SCK_L();    
        if (dat & 0x01)   
        {
          DIS_DIO_H();
        }
        else  
        {
          DIS_DIO_L();
        }
        dat >>= 1;
        DIS_SCK_H();
        }
    }

    /*********************************************
    * 发送一字节命令到TM1628
    *********************************************/
    void TM1628_Send_Cmd(uchar dat)
    {    
      uchar i;
      DIS_STB_L();
      for (i = 0; i < 8; i++)
      {    
        DIS_SCK_L();         
        if (dat & 0x01)
        {
          DIS_DIO_H();
        }
        else  
        {
          DIS_DIO_L();
        }
        dat >>= 1;    
        DIS_SCK_H();
      }
      DIS_STB_H();
      DIS_DIO_H();
    }

    /*********************************************
    * 采用固定地址模式发送数据
    *********************************************/
    void Display_OneByte(uchar dat , uchar addr)
    {
      TM1628_Send_Cmd(0x03);//显示模式是7位10段
      TM1628_Send_Cmd(0x44);//写数据到显示寄存器,固定地址模式
      DIS_STB_L();
      TM1628_Send_Byte(addr);//显示地址    STB下降沿时,默认第一个数据是命令
      TM1628_Send_Byte(dat); //数据    
      DIS_STB_H();
      TM1628_Send_Cmd(0x8f);//显示亮度设置,最亮
    }

    /*********************************************
    * 更新需显示内容
    *********************************************/
    void Updata_Display(uint indata)
    {
      Display_Value[0] = DISP_TAB[indata%10];    
      Display_Value[1] = DISP_TAB[(indata/10)%10];
      Display_Value[2] = DISP_TAB[(indata/100)%10];
      Display_Value[3] = DISP_TAB[indata/1000];
    }

    /*********************************************
    * 将数据发送给四位数码管
    *********************************************/
    void Display(void)
    {
      uchar num;
      for(num=0;num<4;num++)
      {    
        Display_OneByte(Display_Value[num] , DISP_POSITION[num]);    
      }
    }

    /**********************************************************                                    
    * 初始化                                                                      
    **********************************************************/
    void Display_Init()
    {    
      PC_DDR |= 0x0c;            // 配置PC端口的方向寄存器PC2/PC3输出
      PC_CR1 |= 0x0c;            // 设置PC2/PC3为推挽输出
      PC_CR2 &= 0xf3;    
        
      PE_DDR |= 0x20;            // 配置PE端口的方向寄存器PE5输出
      PE_CR1 |= 0x20;            // 设置PE5为推挽输出
      PE_CR2 &= 0xdf;    
     
      DIS_STB_H();
      DIS_DIO_L();
      DIS_SCK_L();
    }

    void CLK_Init(void)
    {
      CLK_ECKR=0x03;//外部时钟寄存器 外部时钟准备就绪,外部时钟开
      CLK_SWCR=0x02;//切换控制寄存器 使能切换机制
      CLK_SWR=0xB4;//主时钟切换寄存器 选择HSE为主时钟源
      while (!(CLK_SWCR & 0x08));  
      //Wait for switch done 该语句如果没有则不能切
      //换成功,在仿真时使用内部时钟,停止仿真时,切换到外部时钟,但重新上电或复位后
      //又回到内部时钟状态(Debug模式)
      CLK_CSSR=0x01;//时钟安全系统寄存器    
    }

    void Delay_ms( uint ms )
    {    
      uint i,j;
      for( j=0; j<ms; j++ )
      {    
        for( i=0; i<1000; i++ )
        {;}    
      }
    }

    void main( void )
    {
      Delay_ms(200);
      CLK_Init();
      Display_Init();
      Updata_Display(1234);    //四位数码管显示1234
      Display();
      while(1)
      {

      }
    }

    展开全文
  • TM1650LED数码管驱动

    2019-04-28 09:48:53
    TM1650LED数码管驱动,STM8S105 通过模拟IIC控制TM1650显示,按键获取
  • TM1628_TM1628_

    2021-10-02 00:26:12
    TM1628驱动 显示任意数字 C51
  • TM1620 数码管驱动 4位LED数码管
  • stc8系列的 tm1650数码管驱动亲测可用
  • 数码管驱动芯片TM1616 TM1618 TM1620驱动代码TM16XX通用驱动,STM32驱动代码
  • 针对研究数码管显示的初学者,本资源包含了TM1640-16位8段数码管的驱动程序代码,有助于初步学习如何驱动数码管显示
  • 本文档是基于TM1628驱动LED灯的演示程序,采用C语言编写,主控是stm8s系列,本程序主要是完成驱动显示的功能,以及各函数的接口,和stm8s的一些初始化程序
  • STC15W401AS驱动TM1652程序,方便移植,简单明了。波特率19200bps。!!!!!!!!!!!!!
  • TM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。本产品性能优良,质量可靠。主要应用于电磁炉、微波炉及小家电产品的...
  • 4位数码管显示模块 LED亮度可调带时钟点 TM1637驱动 595驱动程序 包括计数功能 置数功能 清零功能
  • 年过完了,首先祝大家开工大吉! 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

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

    展开全文
  • TM1680驱动程序(51单片机,15 单片机)
  • TM1640两线驱动,使用共阴驱动编码,转换成共阳驱动。所以在本代码内,能看到共阴的驱动编码。供学习参考。
  • TM1629驱动程序,在C51单片机上实现的例程
  • 通过按键计数在数码管上面操作,还可以设置自动计数
  • STM32 TM1628程序

    千次阅读 2018-07-11 16:15:41
    /*************************************函数名称:Tm1628_Write_Bit函数说明:写单个字节函数参数:命令参数函数返回:NULL*************************************/void Tm1628_Write_Bit(uint8_t data){ uint8_t i...

    以下是.C

    #include "tm1628.h"


    /*************************************
    函数名称:Tm1628_Write_Bit
    函数说明:写单个字节
    函数参数:命令参数
    函数返回:NULL
    *************************************/
    void Tm1628_Write_Bit(uint8_t data)
    {
    uint8_t i;
    Tm1628_CKL_H;
    Tm1628_DIO_H;
    for(i = 0; i < 8; i++)
    {

    Tm1628_CKL_L;
    delay_us(100);
    if((data & 0x01) == 1)
    Tm1628_DIO_H;
    else
    Tm1628_DIO_L;
    data = data >> 1;
    Tm1628_CKL_H;
    delay_us(100);
    }
    }


    /*************************************
    函数名称:Tm1628_Write_Command
    函数说明:写命令
    函数参数:命令参数
    函数返回:NULL
    *************************************/
    void Tm1628_Write_Command(u8 unm)
    {
    Tm1628_STB_L;
    delay_ms(1);
    Tm1628_Write_Bit(unm);
    Tm1628_STB_H;
    delay_ms(1);
    }




    /*************************************
    函数名称:Tm1628init
    函数说明:TM1628初始化
    函数参数:NULL
    函数返回:NULL
    *************************************/
    void Tm1628init(void)
    {
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);     //使能PB端口时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;    //LB6-->PB8 端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //IO口速度为10MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);     //初始化GPIOB6 - 8
    Tm1628_Write_Command(0x03);   //7位10段
    Tm1628_ClearDisplay(); //清屏
    Tm1628_GrayScale(2); //亮度2
    Tm1628_Fixed(0xc2,0xff);
    }






    /*************************************
    函数名称:Tm1628_Fixed
    函数说明:固定写显示
    函数参数:(1)data 地址
    (2)add 数据
    函数返回:NULL
    *************************************/
    void Tm1628_Fixed(uint8_t data, uint8_t add)
    {
    Tm1628_Write_Command(0x44);
    Tm1628_STB_L;
    delay_ms(1);
    Tm1628_Write_Bit(data);
    Tm1628_Write_Bit(add);
    Tm1628_STB_H;
    delay_ms(1);
    }




    /*************************************
    函数名称:Tm1628_Continuous
    函数说明:连续写显示
    函数参数:(1)data 地址  从C0开始
    (2)num 数据
    (3)add  数量 最大14
    函数返回:NULL
    *************************************/


    void Tm1628_Continuous(uint8_t data, uint8_t num, uint8_t *add)
    {
    uint8_t i;
    Tm1628_Write_Command(0x40);
    Tm1628_STB_L;
    delay_ms(1);
    Tm1628_Write_Bit(data);
    for(i = 0; i < num; i++)
    {
    Tm1628_Write_Bit(add[i]);
    }
    Tm1628_STB_H;
    delay_ms(1);
    }
    /*************************************
    函数名称:Tm1628_ClearDisplay
    函数说明:清屏
    函数参数:NULL
    函数返回:NULL
    *************************************/


    void Tm1628_ClearDisplay(void)
    {
    uint8_t i;
    Tm1628_Write_Command(0x40);
    Tm1628_STB_L;
    delay_ms(1);
    Tm1628_Write_Bit(0xC0);
    for(i = 0; i < 14; i++)
    {
    Tm1628_Write_Bit(0x00);
    }
    Tm1628_STB_H;
    delay_ms(1);
    }








    /*************************************
    函数名称:Tm1628_GrayScale
    函数说明:用于亮度调节 0 - 9
    函数参数:亮度 0 - 9
    函数返回:NULL
    *************************************/
    void Tm1628_GrayScale(uint8_t data)
    {
    switch(data)
    {
    case(0): Tm1628_Write_Command(GrayScale_ON);   break;
    case(1): Tm1628_Write_Command(GrayScale1); break;
    case(2): Tm1628_Write_Command(GrayScale2); break;
    case(3): Tm1628_Write_Command(GrayScale3); break;
    case(4): Tm1628_Write_Command(GrayScale4); break;
    case(5): Tm1628_Write_Command(GrayScale5); break;
    case(6): Tm1628_Write_Command(GrayScale6); break;
    case(7): Tm1628_Write_Command(GrayScale7); break;
    case(8): Tm1628_Write_Command(GrayScale8); break;
    }

    }

    以下是.h


    #ifndef __TM1628_H
    #define __TM1628_H


    #include "sys.h"
    #include "delay.h"


    #define Tm1628_CKL_H GPIO_WriteBit(GPIOB,GPIO_Pin_6,Bit_SET)
    #define Tm1628_CKL_L GPIO_WriteBit(GPIOB,GPIO_Pin_6,Bit_RESET)


    #define Tm1628_DIO_H GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_SET)
    #define Tm1628_DIO_L GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_RESET)


    #define Tm1628_STB_H GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_SET)
    #define Tm1628_STB_L GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_RESET)




    #define GrayScale_OFF 0x80 //关显示
    #define GrayScale_ON 0x81 //开显示




    #define GrayScale1   0x88 //灰度等级1
    #define GrayScale2   0x89 //灰度等级2
    #define GrayScale3   0x8A //灰度等级3
    #define GrayScale4   0x8B //灰度等级4
    #define GrayScale5   0x8C //灰度等级5
    #define GrayScale6   0x8D //灰度等级6
    #define GrayScale7   0x8E //灰度等级7
    #define GrayScale8   0x8F //灰度等级8


    void Tm1628init(void);   //TM1628初始化
    void Tm1628_Fixed(uint8_t data, uint8_t add); //固定写显示 data 地址 add 数据
    void Tm1628_Continuous(uint8_t data, uint8_t num, uint8_t *add); //连续写显示
    void Tm1628_ClearDisplay(void); //清屏
    void Tm1628_GrayScale(uint8_t data); //亮度调节

    #endif


    楼主是新萌 之前想直接找一篇 代码拔下来 后来发现没有 就自己写了写 函数实测能用


    展开全文
  • TM1640 含51主程序带电路图 驱动共阳5位7断数码管
  • #define DATA_COMMAND 0X40#define DISP_COMMAND 0x80#define ADDR_COMMAND 0XC0//TM1638模块引脚定义int DIO = 2;int CLK = 1;int STB = 0; //这里定义了那三个脚//共阴数码管显示代码unsigned c...
  • 1,基于STM32+TM1638芯片的共阳极数码管驱动程序,可同时驱动8个数码管,函数封装很好,使用时只需要调用函数,参数为每个数码管需要显示的数字即可 2,亲测有效,有疑问可在下面评论
  • 给老妈做了个电子表,用DS3231+STM32做的,结果DS3231资源非常少,憋了好几天才整出来,目前运行良好,据说DS3231精度超级高啊。
  • TM1640数码管驱动+电路

    2021-02-06 20:00:18
    TM1640数码管驱动芯片:驱动程序、电路图。 TM1640最多可驱动16个数码管TM1640数码管驱动芯片:驱动程序、电路图。 TM1640最多可驱动16个数码管
  • TM1640数码管驱动程序

    2016-05-01 23:38:55
    TM1640数码管驱动程序
  • 数码管显示驱动芯片,tm1652,串口驱动
  • 这个是数码管驱动,2个IO口驱6位数码管,而且同时还能外接12个按键
  • 在STM32F103C8T6最小系统上驱动 TM1637四位数码管显示模块

空空如也

空空如也

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

tm1628驱动数码管程序