精华内容
下载资源
问答
  • 2020-12-22 02:37:41

    #include

    #include

    #define uchar unsigned char

    #define uint  unsigned int

    sbit CLK = P3^2;

    sbit DIO = P3^3;

    #define CLK_H  CLK = 1

    #define CLK_L  CLK = 0

    #define DIO_H  DIO = 1

    #define DIO_L  DIO = 0

    void TM1650_Set(uchar add,uchar dat);

    uchar Scan_Key(void);

    uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9显示代码

    void main()

    {

    uchar key;

    TM1650_Set(0x48,0x51);//为5级亮度,开显示八段显示方式,后一个字节中高位用于亮度,低位用于七段或八段显示方式和开关显示

    //如:0x71为七级亮度,八段显示方式,开显示;0x79为为七级亮度,七段显示方式,开显示

    TM1650_Set(0x68,CODE[0]);

    TM1650_Set(0x6A,CODE[5]);

    TM1650_Set(0x6C,CODE[1]);

    TM1650_Set(0x6E,CODE[4]);

    while(1) ;

    {

    key = Scan_Key();

    //第一个按键按下

    if(key == 0x44)  //此键值和数据手册上对应

    {

    TM1650_Set(0x6E,CODE[1]);//显示1

    }

    //第二个按键按下

    if(key == 0x4c)

    {

    TM1650_Set(0x6E,CODE[2]);

    }

    //第三个按键按下

    //TM1650_Set(0x6E,CODE[3]);

    }

    }

    void Delay_us(uint i) //us延时

    {

    for(;i>0;i--)

    {

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    }

    }

    void I2CStart(void)//开始信号

    {

    CLK_H;

    DIO_H;

    Delay_us(5);

    DIO_L;

    }

    void I2Cask(void) //ACK信号

    {

    uchar 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(uchar oneByte) //写一个字节高位在前,低位在后

    {

    uchar 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;

    }

    }

    uchar Scan_Key(void)  // 按键扫描

    {

    uchar i;

    uchar rekey;

    I2CStart();

    I2CWrByte(0x49);//读按键命令

    I2Cask();

    //DIO_H;

    for(i=0;i<8;i++)

    {

    CLK_H;

    rekey = rekey<<1;

    if(DIO)

    {

    rekey++;

    }

    Delay_us(5);

    CLK_L;

    }

    I2Cask();

    I2CStop();

    return(rekey);

    }

    void TM1650_Set(uchar add,uchar dat) //数码管显示

    {

    //写显存必须从高地址开始写

    I2CStart();

    I2CWrByte(add); //第一个显存地址

    I2Cask();

    I2CWrByte(dat);

    I2Cask();

    I2CStop();

    }

    更多相关内容
  • TM1650代码记录(基于51单片机)

    千次阅读 2021-12-25 08:59:39
    TM1650代码记录(基于51单片机)

    一、TM1650

    0、介绍

    功能特点:

    TM1650用于驱动共阴极显示器
    两种显示模式:8段×4位和7段×4位
    段驱动电流大于25mA,位驱动电流大于150mA
    提供8级亮度控制
    键盘扫描:7×4bit内部集成三极管驱动
    高速两线式串行接口
    内置时钟振荡电路
    内置上电复位电路
    支持2.8V-5.5V电源电压
    提供DIP16及SOP16封装
    

    1、典型应用电路

    典型应用电路

    2、原理图

    原理图

    3、PCB

    PCB

    4、实物图

    实物图1
    实物图2
    实物图3

    5、键盘扫描码

    键盘扫描码
    哔哩哔哩演示视频:TM1650数码管显示及按键扫描

    二、代码记录

    1、C文件:

    头文件引用、定义数组、定义引脚

    #include "allhead.h"
    
    // ------------------------------------------------------------
    // IO口模拟I2C通信
    // SCL_T接P3^3
    // SDA_T接P3^4
    // ------------------------------------------------------------
    sbit SCL_T = P3^3; //串行时钟
    sbit SDA_T = P3^4; //串行数据
    
    /*********************TM1650数码管显示数组************************************/
    unsigned char code dig1[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
    //0、1、2、3、4、5、6、7、8、9、-//不带小数点
    
    unsigned char code dig2[11]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xc0};
    //0、1、2、3、4、5、6、7、8、9、-//带小数点
    
    unsigned char key_data = 0;	//键盘扫描码
    

    IIC起始位:

    /**********************************************
    //TM Start//起始位
    **********************************************/
    void TM_Start()
    {
    	SCL_T = 1;
    	SDA_T = 1;
    	Delay5us_TM();
    	SDA_T = 0;
    } 
    

    IIC结束位:

    /**********************************************
    //TM Stop//结束位
    **********************************************/
    void TM_Stop()
    {
    	SCL_T = 1;
    	SDA_T = 0;
    	Delay5us_TM();
    	SDA_T = 1;
    } 
    

    ACK信号:

    /**********************************************
    //TM Ack//ACK信号
    **********************************************/
    void TM_Ack()
    {
    	unsigned char timeout = 1;
    	SCL_T = 1;
    	Delay5us_TM();
    	SCL_T = 0;
    	while((SDA_T) && (timeout <= 100))
    	{
    		timeout++;
    	}
    	Delay5us_TM();
    	SCL_T = 0;
    }
    

    写一个字节:

    /**********************************************
    // 通过总线写一个字节
    **********************************************/
    void Write_TM_Byte(unsigned char TM_Byte)
    {
    	unsigned char i;
    	SCL_T = 0;
    	Delay1us_TM();
    	for(i=0;i<8;i++)
    	{
    		if(TM_Byte & 0x80)
    			SDA_T = 1;
    		else
    			SDA_T = 0;
    		SCL_T = 0;
    		Delay5us_TM();
    		SCL_T = 1;
    		Delay5us_TM();
    		SCL_T = 0;
    		TM_Byte <<= 1;
    	}
    }
    

    读一个字节:

    /**********************************************
    // 通过总线读一个字节
    **********************************************/
    unsigned char Read_TM_Byte()
    {
    	unsigned char i;
    	unsigned char j;
    	unsigned char TM_Byte;
    
    	for(i=0;i<8;i++)
    	{
    		SCL_T = 0;
    		Delay5us_TM();
    
    		TM_Byte <<= 1;
    
    		j = SDA_T;
    
    		TM_Byte += j;
    
    		SCL_T = 1;
    		Delay5us_TM();
    	}
    
    	SCL_T = 0;
    	Delay1us_TM();
    
    	return TM_Byte;
    }
    

    TM1650写数据:

    /*********************TM1650写数据************************************/
    void TM_WrDat(unsigned char add,unsigned char dat)
    {
    	TM_Start();
    	Write_TM_Byte(add);//显存地址
    	TM_Ack();
    	Write_TM_Byte(dat);//显示数据
    	TM_Ack();
    	TM_Stop();
    }
    

    TM1650写命令:

    /*********************TM1650写命令************************************/
    void TM_WrCmd(unsigned char Bri)
    {
    	TM_Start();
    	Write_TM_Byte(0x48);//显示模式
    	TM_Ack();
    	Write_TM_Byte(Bri);
    	TM_Ack();
    	TM_Stop();
    }
    

    TM1650初始化:

    /*********************TM1650初始化************************************/
    void TM_Init()
    {
    	TM_WrCmd(0x11);//1级亮度//8段显示//开显示
    	TM_WrDat(0x68,0xff);//DIG1
    	TM_WrDat(0x6a,0xff);//DIG2
    	TM_WrDat(0x6c,0xff);//DIG3
    	TM_WrDat(0x6e,0xff);//DIG4
    }
    

    TM1650显示(可自行修改):

    /*********************TM1650显示**************************************/
    void Dis_TM(unsigned char dig1,unsigned char dig2,unsigned char dig3,unsigned char dig4)
    {
    	TM_WrDat(0x68,dig1);//DIG1
    	TM_WrDat(0x6a,dig2);//DIG2
    	TM_WrDat(0x6c,dig3);//DIG3
    	TM_WrDat(0x6e,dig4);//DIG4
    }
    

    TM1650读按键:

    /*********************TM1650读按键************************************/
    void TM_ReCmd()
    {
    	TM_Start();
    	Write_TM_Byte(0x49);//读取模式
    	TM_Ack();
    	key_data = Read_TM_Byte();//读取键盘扫描码
    	TM_Ack();
    	TM_Stop();
    }
    

    TM1650读处理(显示键盘扫描码和显示按键位置二选一)
    显示键盘扫描码:

    /*********************TM1650读处理************************************/
    void Read_TM()
    {
    //数码管显示键盘扫描码
    	unsigned char a = 0;
    	unsigned char b = 0;
    	unsigned char c = 0;
    
    	TM_ReCmd();//TM1650读按键
    
    	a = key_data/100;
    	b = key_data/10%10;
    	c = key_data%10;
    	Dis_TM(dig1[0],dig1[a],dig1[b],dig2[c]);	//数码管显示键盘扫描码
    }
    

    显示按键位置:

    /*********************TM1650读处理************************************/
    void Read_TM()
    {
    //数码管显示按键位置
    	unsigned char a = 0;
    	unsigned char b = 0;
    
    	TM_ReCmd();//TM1650读按键
    
    	switch(key_data)
    	{
    		//第一行
    		case 0x44:	a = 1;	b = 1;	break;
    		case 0x4c:	a = 1;	b = 2;	break;
    		case 0x54:	a = 1;	b = 3;	break;
    		case 0x5c:	a = 1;	b = 4;	break;
    		case 0x64:	a = 1;	b = 5;	break;
    		case 0x6c:	a = 1;	b = 6;	break;
    		case 0x74:	a = 1;	b = 7;	break;
    
    		//第二行
    		case 0x45:	a = 2;	b = 1;	break;
    		case 0x4d:	a = 2;	b = 2;	break;
    		case 0x55:	a = 2;	b = 3;	break;
    		case 0x5d:	a = 2;	b = 4;	break;
    		case 0x65:	a = 2;	b = 5;	break;
    		case 0x6d:	a = 2;	b = 6;	break;
    		case 0x75:	a = 2;	b = 7;	break;
    
    		//第三行
    		case 0x46:	a = 3;	b = 1;	break;
    		case 0x4e:	a = 3;	b = 2;	break;
    		case 0x56:	a = 3;	b = 3;	break;
    		case 0x5e:	a = 3;	b = 4;	break;
    		case 0x66:	a = 3;	b = 5;	break;
    		case 0x6e:	a = 3;	b = 6;	break;
    		case 0x76:	a = 3;	b = 7;	break;
    
    		//第四行
    		case 0x47:	a = 4;	b = 1;	break;
    		case 0x4f:	a = 4;	b = 2;	break;
    		case 0x57:	a = 4;	b = 3;	break;
    		case 0x5f:	a = 4;	b = 4;	break;
    		case 0x67:	a = 4;	b = 5;	break;
    		case 0x6f:	a = 4;	b = 6;	break;
    		case 0x77:	a = 4;	b = 7;	break;
    
    		default:	a = 0;	b = 0;	break;
    	}
    
    	Dis_TM(0x00,dig1[a],dig1[10],dig2[b]);	//数码管显示按键位置
    }
    

    TM1650延时函数:

    /*********************TM1650驱动程序用的延时程序************************************/
    void Delay1us_TM()		//@24.000MHz
    {
    	unsigned char i;
    
    	i = 6;
    	while (--i);
    }
    
    
    void Delay5us_TM()		//@24.000MHz
    {
    	unsigned char i;
    
    	i = 38;
    	while (--i);
    }
    

    2、H文件

    #ifndef _TM1650_H_
    #define _TM1650_H_
    /*************************************************/
    //数码管显示数组
    extern unsigned char code dig1[11];	//无小数点
    extern unsigned char code dig2[11];	//有小数点
    extern unsigned char key_data;	//键盘扫描码
    
    //TM1650延时函数
    void Delay1us_TM();		//@24.000MHz
    void Delay5us_TM();		//@24.000MHz
    
    //TM1650外调函数
    void TM_Init();//TM1650初始化
    void Dis_TM(unsigned char dig1,unsigned char dig2,unsigned char dig3,unsigned char dig4);//TM1650四位显示
    void Read_TM();//TM1650读处理
    
    /*************************************************/
    #endif
    

    三、结束语

    该代码测试运行环境:
    基于51单片机
    主控:STC8G1K17
    晶振:24Mhz(内部晶振)
    主板:控制板-2-20mm-V4.0

    哔哩哔哩演示视频:TM1650数码管显示及按键扫描

    哔哩哔哩:风筝见证-雪夜
    单片机QQ交流群:210560687
    欢迎大家加入,一起交流学习,一起进步

    展开全文
  • STM32中使用TM1650的.C文件,可以直接使用。
  • 基于TM1650,DS3231,STC51LE,四位数码管的小时钟,可以实现时间显示和设置、日期显示和设置、指定日期计数
  • 基于STM32F103的TM1650控制共阴极8段数码管,亲测可以正常使用
  • 智能暖风机软件实现之利用TM1650实现显示功能前言一、智能暖风机的整体功能设定二、面板显示的方案制定1.面板显示原理2.软件方案设定三、功能实现1.代码实现技术支持 前言 前面我们已经实现了暖风机的外设驱动,...


    前言

    前面我们已经实现了暖风机的外设驱动,本文主要内容是实现暖风机的面板显示功能,采用TM1650芯片作为数码管的驱动芯片。


    一、智能暖风机的整体功能设定

    • 智能暖风机的设定功能如下表,我们将整个暖风机拆分成几个模块,逐个实现功能;本文实现暖风机的面板显示功能,暖风机在工作时要显示当前室温以及亮起相应的状态灯,在进行设备定时和设备设温时面板要显示定时的时间和设定的温度值。
    功能说明
    开关触摸按键:1个
    按键控制,app控制
    控制暖风机开关。
    目前开发的开启有三种方式:
    1.App面板控制
    2:按键控制
    3:定时控制
    模式触摸按键:1个
    按键控制,app控制
    1:风扇功能:只吹风,不制热。
    2:1档加热:风扇+加热1
    3:2档加热:风扇+加热2(档位更高)
    定时触摸按键:1个
    按键控制,app控制
    倒计时默认枚举值有cancel, 1h, 2h, 3h, 4h, 5h, 6h,7h, 8h。
    倒计时功能针对暖风机开关。
    app暖风机倒计时剩余时间。
    灯光触摸按键:1个
    按键控制,app控制
    4种照明模式:
    1 rgb1
    2 rgb2
    3 rgb3
    4 rgb4
    设温触摸按键:1个
    按键控制,app控制
    默认温度设置区间为15-40℃,客户可以自行调整温度设定区间。
    温度显示硬件:断码显示
    按键控制,app控制
    只是在设定的时候显示
    设备上和当前温度显示复用,app单独显示
    设备:温度设定时,显示设定温度,误操作3秒后显示当前室温
    摇头触摸按键:1个
    按键可控制,app可控制。
    开/关
    待机记忆按键,app,主动操作开关键关机为待机状态。
    再开启后恢复上一次设置:
    温度设置:上一次设置
    温度显示:当前环境温度
    灯光模式:上一次设置
    设备定时关:默认关闭
    app定时关:默认关闭。
    app定时开:上一次设置。
    断电记忆断电后为断电状态,再上电恢复上一次设置:
    开关状态:默认关
    温度设置:上一次设置
    温度显示:当前环境温度
    灯光模式:上一次设置
    设备定时关:默认关闭
    app定时关:默认关闭。
    app定时开:上一次设置。

    二、面板显示的方案制定

    1.面板显示原理

    本案例中面板由两个数码管和7个LED状态灯组成,驱动芯片选择TM1650。

    • 显示电路如下:

    在这里插入图片描述

    • TM1650驱动模块说明

      TM1650 是一种带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用电路。

       两种显示模式:8段×4位和7段×4位

       段驱动电流大于25mA,位驱动电流大于150mA

       提供8级亮度控制

       IIC通信控制

    寄存器名称寄存器地址
    显示设置寄存器(亮度设置、开关显示设置、7段/8段显示)0x48
    显存地址DIG10x68
    显存地址DIG20x6A
    显存地址DIG30x6C
    显存地址DIG40x6E

    其中显示设置寄存器的配置说明如下:

    B7B6B5B4B3B2B1B0功能说明
    X000XX亮度设置8级
    X001XX亮度设置1级
    X010XX亮度设置2级
    X011XX亮度设置3级
    X100XX亮度设置4级
    X101XX亮度设置5级
    X110XX亮度设置6级
    X111XX亮度设置7级
    X07/8段显示控制位8段显示方式
    X17/8段显示控制位7段显示方式
    X0开启/关闭显示位关显示
    X1开启/关闭显示位开显示

    打×的位可以为1,也可以为0,建议写0。

    • 对显存地址的写时序
      在这里插入图片描述

    控制流程是以IIC时序发送要写的寄存器地址,再发送要写的数据,例:

    address : 0x48 //控制寄存器地址
    data:	  0x0a //8级亮度 开显示 7段显示方式
    
    address : 0x68 //显存地址DIG1
    data:	  0x7f //7段全亮
    

    完整的写时序:
    在这里插入图片描述

    2.软件方案设定

    • 面板显示嵌入式方案设定
      前面已经实现了暖风机的温度采集功能,现在要将采集的温度显示到面板上,SOC按照IIC时序向TM1650发送显示命令控制数码管亮起相应的数字控制状态指示灯LED亮起,实现面板显示功能。
      通信引脚设定:

      SDA1	| P26	
      SCL1	| P24
      

    三、功能实现

    1.代码实现

    • 在之前开发的基础上增加程序,增加tm1650.c文件和其头文件,目前整个工程的文件结构如下:
    ├── src	
    |    ├── tuya_drive
    |    |  	└── b3950
    |    |    		└── b3950.c           //温度传感器驱动相关
    |    |  	└── tm1650
    |    |    		└──  tm1650.c           
    |    |  	└── gpio_control
    |    |    		└── gpio_control.c    
    |    |  	└── timer
    |    |    		└── timer.c           //定时器相关
    |    ├── tuya_device.c             //应用层入口文件
    |    ├── tuya_thread.c             //主要线程处理文件
    |    └── tuya_dp_process.c            //dp数据触发的主要应用文件
    |
    ├── include				//头文件目录
    |    ├── tuya_drive_h
    |    |  	└── b3950_h
    |    |    		└── b3950.h        
    |    |  	└── tm1650_h
    |    |    		└──  tm1650.h           
    |    |  	└── gpio_control_h
    |    |    		└── gpio_control.h        
    |    |  	└── timer_h
    |    |    		└── timer.h           
    |    ├── tuya_device.h           
    |    ├── tuya_thread.h       
    |    └── tuya_dp_process.h       
    |
    └── output              //编译产物
    

    其中tm1650.c文件中的内容主要是驱动tm1650芯片的代码。

    tm1650.c代码及说明如下:

    #include "tm1650.h"
    typedef struct {
        tuya_i2c_t    *i2c;
    } tm1650_dev_t;
    /*============================ PROTOTYPES ====================================*/
    void tm1650_led_init(void);
    void tm1650_init(tm1650_dev_t *dev);
    void tm1650_close(void);
    void TM1650_Write(uint8_t addr, uint8_t data, tm1650_dev_t *dev);
    void TM1650_SetDisplay(uint8_t brightness, uint8_t mode, uint8_t state);
    void TM1650_SetNumber(uint8_t index, uint8_t mode,uint8_t num);
    /*============================ IMPLEMENTATION ================================*/
    static tm1650_dev_t tm1650_dev;
    static uint8_t s_7number[10] = {0x5F,0x03,0x6E,0x6B,0x33,0x79,0x7D,0x0B,0x7F,0x7B};   // 7段显示方式0~9
    static uint8_t s_8number[10] = {0xDF,0x83,0xEE,0xEB,0xB3,0xF9,0xFD,0x8B,0xFF,0xFB};   // 8段显示方式0~9
    /*状态指示灯:cool hot1 hot2 cool+shake hot1+shake hot2+shake set_temperature set_time_hour close */
    static uint8_t s_7status[10] = {0x23,0x32,0x2a,0x63,0x72,0x6a,0x02,0x04,0x00};   
    /**
     * @Function: tm1650_led_init
     * @Description: tm1650_led display init
     * @Input: none
     * @Output: none
     * @Return: none
     * @Others: 
     */
    void tm1650_led_init(void)
    {
    	/*SCL_PIN:PA24 SDA_PIN:PA26*/
        tuya_i2c_sw_cfg_t   sw_cfg;
        TUYA_I2C_SW_CFG_INIT(&sw_cfg, TUYA_PA24, TUYA_PA26, 1);
        tuya_sw_i2c_register(TUYA_I2C0, &sw_cfg);
        tm1650_init(&tm1650_dev);
    
    }
    /**
     * @Function: tm1650 init
     * @Description: Equip with IIC equipment and set the gray level of digital tube
     * @Input: none
     * @Output: none
     * @Return: none
     * @Others: 
     */
    void tm1650_init(tm1650_dev_t *dev)
    {
        uint8_t buffer[2];
    	//! looking for IIC handle
        dev->i2c = tuya_driver_find(TUYA_DRV_I2C, TUYA_I2C0);
        //! no device addr
        TUYA_I2C_MASTER_CFG(dev->i2c, 0x00);
        tuya_i2c_init(dev->i2c);
    
        buffer[0] = 0x48;             //! register addr
        buffer[1] = 0x71;      //! power set
    
        tuya_i2c_master_send(dev->i2c, 0x00, TUYA_I2C_NO_START | TUYA_I2C_WR, buffer, 2);
    }
    /**
     * @Function: tm1650_close
     * @Description: Turn off the digital display
     * @Input: none
     * @Output: none
     * @Return: none
     * @Others: 
     */
    void tm1650_close(void)
    {
        TM1650_Write(0x68, 0x00, &tm1650_dev);
        TM1650_Write(0x6a, 0x00, &tm1650_dev);
        TM1650_Write(0x6e, 0x00, &tm1650_dev);
    }
    
    /**
     * @Function: TM1650_Write
     * @Description: Write data to TM1650
     * @Input: addr:register addr   data: 
     * @Output: none
     * @Return: none
     * @Others: 
     */
    void TM1650_Write(uint8_t addr, uint8_t data, tm1650_dev_t *dev)
    {          
        uint8_t     buffer[2];
        buffer[0] = addr;   //! register addr
        buffer[1] = data;      //! Transmitted data
        tuya_i2c_master_send(dev->i2c, 0x00, TUYA_I2C_NO_START | TUYA_I2C_WR, buffer, 2);
    }
    
    /**
     * @Function: TM1650_SetDisplay
     * @Description: Setting display parameters
     * @Input: brightness:1-8   mode: Paragraph 7/Paragraph 8   state :display on/off
     * @Output: none
     * @Return: none
     * @Others: 
     */
    void TM1650_SetDisplay(uint8_t brightness, uint8_t mode, uint8_t state)
    {       
        if(state)
        {
            if(mode == 7)                                                   // 7段显示方式
            {
                TM1650_Write(0x48, brightness*16 + 1*4 + 1, &tm1650_dev);
            }
            else if(mode == 8)                                              // 8段显示方式
            {
                TM1650_Write(0x48, brightness*16 + 1, &tm1650_dev);                      
            }
        }
        else
        {
            TM1650_Write(0x48, 0x00,&tm1650_dev);                                       // 关闭显示
        }
    }
    
    
    /**
     * @Function: TM1650_SetNumber
     * @Description: display num
     * @Input: index:Which number  mode: Paragraph 7/Paragraph 8   num :Display number
     * @Output: none
     * @Return: none
     * @Others: 
     */
    void TM1650_SetNumber(uint8_t index, uint8_t mode, uint8_t num)
    {
        uint8_t indexAddr = 0;
        uint8_t numValue = 0;
        
        if(index == 1)
        {
            indexAddr = 0x68;
        }
        else if(index == 2)
        {
            indexAddr = 0x6A;
        }
        else if(index == 3)
        {
            indexAddr = 0x6C;
        }
        else if(index == 4)
        {
            indexAddr = 0x6E;
        }
        
        if(mode == 7)                                                       // 7段显示方式
        {
            numValue = s_7number[num];
        }
        else if(mode == 8)                                                  // 8段显示方式
        {
            numValue = s_8number[num];                      
        }
        
        TM1650_Write(indexAddr, numValue, &tm1650_dev);
    }
    /**
     * @Function: display_num
     * @Description: display num
     * @Input: num :Display number
     * @Output: none
     * @Return: none
     * @Others: 
     */
    void display_num(uint8_t num)
    {
        uint8_t num_1 = 0;
        uint8_t num_10 = 0;
        num_1 = num%10;
        num_10 = (num%100)/10;
        TM1650_SetNumber(1, 7, num_10);
        TM1650_SetNumber(2, 7, num_1);
    }
    /**
     * @Function: display_status
     * @Description: led_display_work_status
     * @Input: status :work_status
     * @Output: none
     * @Return: none
     * @Others: 
     */
    void display_status(uint8_t status)
    {
        TM1650_Write(0x6E, status, &tm1650_dev);
    }
    
    • TM1650的驱动工作已经完成,tm1650_init()函数调用后就已经进行了数码管的亮度设置,后面在定时采集温度的线程中调用display_num(temperature)即可显示温度。
      tuya_thread.c增加的代码及说明如下:上报温度信息的线程中每10秒采集一次温度信息并在显示面板进行显示
    void update_temperature_thread(void)
    {
        static int last_temper = 0;
        while(1)
        {
            tuya_hal_semaphore_wait(g_temper_binsemap);
            last_temper = cur_temper_get();
            if(last_temper > 50)
            {
                last_temper = 50;
            }
            else if(last_temper < -20)
            {
                last_temper = -20;
            }
            temper_s.value = last_temper;
            dp_memory_s.temperature_value = last_temper;
    
            PR_DEBUG("CURRENT TIME : %d",timercount);
            PR_DEBUG("last_time : %d",dev_key_s.last_time_count);
            //开关开启才会显示,dev_key_s.display_lock初始值为0,后面逻辑控制会用到
            if((switch_s.power == 1) && (dev_key_s.display_lock == 0)){
                display_num(dp_memory_s.temperature_value);
                //根据暖风机的工作状态,开启状态灯
                display_status(dp_memory_s.status);
                report_one_dp_status(DP_TEMPER);
                //如果开启倒计时关闭,将会上传所剩的倒计时时间
                report_one_dp_status(DP_SHUTDOWN_TIME);
            }
    
        }
    
    }
    
    • 此时一个暖风机的显示功能就已经实现了,其他功能实现请见后续文章。

    技术支持

    您可以通过以下方法获得涂鸦的支持:

    -涂鸦IoT智能平台
    Demo中心

    展开全文
  • STM32的TM1650程序.zip

    2019-11-25 14:34:05
    基于STM32F103的TM1650数码管驱动的程序,C语言文件,包含TM1650的技术文档(datasheet)
  • 本例程基于STM32F103C8T6单片机,驱动了TM1637数码管进行0-9加点与不加点的数据显示。
  • tm1650.rar

    2020-04-13 16:12:16
    TM1650真是一款性价比很高的芯片,一个芯片就能够驱动4位8段数码管以及按键扫描。本程序使用合泰单片机驱动,模拟IIC驱动,已在项目验证过
  • 数码管驱动芯片TM1616 TM1618 TM1620驱动代码TM16XX通用驱动,STM32驱动代码
  • LED 驱动代码 FOR TM1688 LED 驱动
  • 数码管显示模块tm1650

    2020-08-25 23:12:59
    提供按键与数码管显示的解决方案,使用tm1650,可以减少对单片机IO口资源的占用,有利于产品开发。数码管显示程序更加简化,代码移植性强。
  • 嵌入式驱动程序(5-3)点灯大师③之TM1650 作为一个嵌入式工程师,“点灯”是必备技能,哈哈哈(手动斜眼笑),除了普通IO口可以控制led灯亮灭之外,还有很多驱动ic,只需要2或3根IO线就可以控制几十盏灯。所以会出...

    嵌入式驱动程序(5-3)点灯大师③之TM1650

    作为一个嵌入式工程师,“点灯”是必备技能,哈哈哈(手动斜眼笑),除了普通IO口可以控制led灯亮灭之外,还有很多驱动ic,只需要2或3根IO线就可以控制几十盏灯。所以会出一系列“点灯”文章。励志成为一个“点灯”大师。

    点灯大师③之TM1650

    1. 资料

    TM1650.pdf提取码:gik3

    2. 基本知识点

    • 两线接口(CLK,DIO)

    3. 函数功能

    /
    //从TM1650读取一个字节
    unsigned char TM1650_ReadOneByte(TM1650_CONFIG_t tm)
    {
    	unsigned char i;
    	unsigned char data=0;
    	//DAT设置成输入
    	tm.DAT_SET_INPUT();	
    	_Delay_(1);
    	
    	//拉高时钟信号
    	tm.CLK_IO_HIGH();	
    	_Delay_(1);	
    	for(i = 0;i<8;i++)
    	{	
    		data <<= 1;
    		
    		//拉低时钟,下降沿读取信号
    		tm.CLK_IO_LOW();
    		_Delay_(1);
    		
    		if(tm.DAT_STA())
    		{
    			//高电平
    			data++;
    		}				
    		_Delay_(1);
    		
    		tm.CLK_IO_HIGH();
    		_Delay_(1);
    	}
    	_Delay_(1);
        _Delay_(1);
    	_Delay_(1);
        _Delay_(1);
    	
    	return data;
    }
    
    /
    //向TM1650写入一个字节
    void TM1650_WriteOneByte(TM1650_CONFIG_t tm, unsigned char dat)
    {
    	unsigned char i;
    	//DAT设置成输出
    	tm.DAT_SET_OUTPUT();	
    	_Delay_(1);
    	
    	//拉低时钟信号
    	tm.CLK_IO_LOW();
    	_Delay_(1);
    	
        for(i=0; i < 8; i++)
        {		
            if(dat & 0x80)
                tm.DAT_IO_HIGH();
            else
                tm.DAT_IO_LOW();
    		_Delay_(1);
    				
    		tm.CLK_IO_HIGH();
    		_Delay_(1);		
    		
    		tm.CLK_IO_LOW();
    		_Delay_(1);
    
            dat <<= 1;
        }		
    	
        _Delay_(1);
        _Delay_(1);
    }
    
    /
    //开始信号
    void TM1650_Start(TM1650_CONFIG_t tm)
    {
    	//DAT设置成输出
    	tm.DAT_SET_OUTPUT();
    	
    	//数据脚高电平
    	tm.DAT_IO_HIGH();_Delay_(1);
    	
    	//时钟脚高电平
    	tm.CLK_IO_HIGH();_Delay_(1);
    		
    	//时钟脚为高电平时,数据脚拉低表示IIC启动
    	tm.DAT_IO_LOW();_Delay_(1);
    		
    	//时钟脚低电平	
    	tm.CLK_IO_LOW();_Delay_(1);
    }
    
    /
    //结束信号
    void TM1650_Stop(TM1650_CONFIG_t tm)
    {
    	//DAT设置成输出
    	tm.DAT_SET_OUTPUT();
    	
    	//时钟脚低电平
    	tm.CLK_IO_LOW();_Delay_(1);
    	
    	//数据脚低电平
    	tm.DAT_IO_LOW();_Delay_(1);
    	
    	//时钟脚高电平
    	tm.CLK_IO_HIGH();_Delay_(1);
    	
    	//时钟脚为高电平时,数据脚拉高表示IIC停止
    	tm.DAT_IO_HIGH();_Delay_(1);
    	
    	//时钟脚低电平
    	tm.CLK_IO_LOW();_Delay_(1);
    }
    
    /
    //等待应答
    void TM1650_WaitAck(TM1650_CONFIG_t tm)
    {
    	unsigned char temp = 0;
    	
    	//DAT设置成输入
    	tm.DAT_SET_INPUT();	
    	
    	//等待应答
    	do{
    		temp++;
    		
    	}while(temp<200 && tm.DAT_STA());	
    	
    	//时钟脚高电平
    	tm.CLK_IO_HIGH();_Delay_(1);
    	_Delay_(1);
    	//时钟脚低电平	
    	tm.CLK_IO_LOW();_Delay_(1);
    	_Delay_(1);
    }
    
    /
    //应答信号
    void TM650_Ack(TM1650_CONFIG_t tm)
    {
    	//数据脚设置成输出模式
    	tm.DAT_SET_OUTPUT();
    	
    	//时钟脚低电平
    	tm.CLK_IO_LOW();_Delay_(1);	
    	
    	//数据脚低电平
    	tm.DAT_IO_LOW();_Delay_(1);
    	
    	//时钟脚高电平
    	tm.CLK_IO_HIGH();_Delay_(1);
    	
    	//时钟脚低电平
    	tm.CLK_IO_LOW();_Delay_(1);	
    }
    
    /
    //向TM1650写入命令
    void TM1650_WriteCommand(TM1650_CONFIG_t tm, unsigned char comm)
    {		
    	//开始信号
    	TM1650_Start(tm);
    		
    	//写指令
    	TM1650_WriteOneByte(tm,0x48);
    	
    	//等待应答
    	TM1650_WaitAck(tm);
    		
    	//写指令
    	TM1650_WriteOneByte(tm,comm);
    	
    	//等待应答
    	TM1650_WaitAck(tm);
    	
    	//结束信号
    	TM1650_Stop(tm);
    }
    
    /
    //向TM1650写入显示
    void TM1650_Display(TM1650_CONFIG_t tm, unsigned char* data)
    {	
    	unsigned char i=0;
    
    	for(i=0;i<4;i++)
    	{	
    		//开始信号
    		TM1650_Start(tm);
    	
    		//写地址
    		TM1650_WriteOneByte(tm,0x68+2*i);
    		
    		//等待应答
    		TM1650_WaitAck(tm);
    		
    		//写数据
    		TM1650_WriteOneByte(tm,*(data+i));
    				
    		//等待应答
    		TM1650_WaitAck(tm);		
    		
    		//结束信号
    		TM1650_Stop(tm);		
    	}
    }
    
    
    /
    //向TM1650读键值
    unsigned char TM1650_KeyScan(TM1650_CONFIG_t tm)
    {
    	unsigned char data =0 ;
    	
    	//开始信号
    	TM1650_Start(tm);
    		
    	//写指令
    	TM1650_WriteOneByte(tm,0x49);
    	
    	//等待应答
    	TM1650_WaitAck(tm);
    	
    	//读键值
    	data = TM1650_ReadOneByte(tm);
    	
    	TM650_Ack(tm);
    	
    	//结束信号
    	TM1650_Stop(tm);
    
    	return data;
    }
    
    
    /
    //TM1650轮询处理
    void TM1650_process(void)
    {
    	unsigned char i;
    	
    	//设置8级亮度,8段显示
    	TM1650_WriteCommand(tm1650, PULSE_08_8|B3_8S_4G|B0_DISP_ON);
    	
    	//全亮
    	for(i=0;i<4;i++)
    		drv_tm1650_buf[i] = 0xff;
    	
    	//全灭
    	for(i=0;i<4;i++)
    		drv_tm1650_buf[i] = 0x00;
    	
    	TM1650_Display(tm1650, drv_tm1650_buf);
    	
    	
    	//读取键值
    	key_tm1650_value = TM1650_KeyScan(tm1650);
    }
    
    void TM1650_init(void)
    {	
    
    }
    

    4. 说明

    • 代码仅供参考。

    5. 代码下载

    TM1650代码提取码:vjnq

    我的个人博客网址:一个点的频率 希望大家关注一下,谢谢!!!

    展开全文
  • STM32cube 控制 AIP650 TM1650

    千次阅读 2022-03-22 15:29:23
    本文介绍如何使用STM32cube 控制AIP650和TM1650两款芯片。
  • STM32 TM1650数码管显示与按键识别

    千次阅读 2021-01-30 21:27:48
    STM 32TM1650 控制程序(可移植) 这代码弄了好几天才弄好,现在给大家分享一下 #include "tm1650.h" void SDA_IN(void) { GPIO_InitTypeDef GPIO_InitStructa; GPIO_InitStructa.GPIO_Pin = TM1650_SDA_pin; ...
  • TM1621代码

    2014-08-05 10:42:09
    TM1621使用代码,实测可用。TM1621使用代码,实测可用。
  • TM1620驱动代码TM1620驱动代码TM1620驱动代码
  • 文章目录1、特性描述1.1、芯片管脚分布1.2、芯片管脚说明2、功能特点3、功能描述4、TM1650 采用 I2C串行传输协议通讯5、TM1650 读按键数据时序6、TM1650 写寄存器时序7、一个完整的写显示时序8、实验目的9、代码实现...
  • STM32_TM1650数码管显示代码,stm32数码管显示数字,CC++源码.zip
  • stm32驱动TM1650 四位数码管

    千次阅读 2021-01-05 10:27:52
    #include "TM1650.H" //written by JY-MCU,QQ:179383020 //Contact:QQ:179383020,Website:http://jy-mcu.taobao.com //#ifndef _TM1650_H //#define _TM1650_H //#include <avr/io.h> //#include <util/...
  • TM1650芯片使用经验

    万次阅读 2019-12-11 21:45:54
    TM1650使用经验TM1650芯片功能TM1650芯片引脚TM1650通讯协议TM1650使用电路TM1650底层编程向TM1650发送指令编程 TM1650芯片功能 TM1650 是一种带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用电路。内部集成...
  • TM1638控制共阳数码管显示的例子网上不是太多,所以做这一块的时候研究了一段时间,我把自己做的传上来,想给可能会用到的朋友提供一些参照。程序正常使用,测试没有问题。
  • 随着家电行业的发展,...通过电路分析,我们可以看到荣事达的这一款暖风机采用的是一个8位两位共阴极的数码管,来显示一些数据参数,使用7个LED指示灯,显现当前状态,使用一个MT1650驱动芯片搭配MCU完成面板的显示。
  • 使用TM1650/AIP650作为输入检测芯片,TM1650和AIP650在引脚和功能上完全相同,两个芯片都是可以控制4个8段数码管或者扫描4*7矩阵按键。在读取数据的协议上,两种芯片的读取时序略有不同,但在控制命令上,是大致相同...
  • TM1628_TM1628_

    2021-10-02 00:26:12
    TM1628驱动 显示任意数字 C51
  • TM1652.zip

    2019-12-17 17:01:02
    采用最新系列STC8系列单片机,通过普通IO口模拟串口发送指令到TM1652,可改任意IO,配置灵活方便,方便移植,内部RC晶振11.0592M
  • NTP TM1637数码管电子时钟 ESP8266驱动TM1637数码管 CLK---D1 DIO---D2
  • 折腾了四五个小时,官方给的datasheet有不少的问题,这里纠正一下...下面贴上代码 c文件: #include "TUBE_KEY.h" #include "LED.h" #include "delay.h" #define SCL_Set (GPIOB->BSRR = 1<<5) #def...
  • tm1650的特性 按键读写时序图 数据命令设置 程序代码编写 添加设备树 驱动编写 匹配设备节点 文件探索 杂项设备 文件操作集 键值读取接口 IIC读取接口 上层应用代码 编写Makefile文件 测试步骤 编译...
  • 4位数码管模块TM1637倒计时arduino代码,使用TM1637库实现倒计时20秒,给大家一个参考

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,110
精华内容 42,844
关键字:

tm1650代码