STM32F103学习笔记(5)——数码管驱动TM1650使用

发布者:innovation2最新更新时间:2025-02-21 来源: jianshu关键字:STM32F103  数码管驱动  TM1650 手机看文章 扫描二维码
随时随地手机看文章

一、简介

TM1650 是一种带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用电路。内部集成有 MCU 输入输出控制数字接口、数据锁存器、LED 驱动、键盘扫描、辉度调节等电路。TM1650 性能稳定、质量可靠、抗干扰能力强,可适用于 24 小时长期连续工作的应用场合。

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

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

  • 提供8级亮度控制

  • 键盘扫描:7×4bit内部集成三极管驱动

  • 高速两线式串行接口

  • 内置时钟振荡电路

  • 内置上电复位电路

  • 支持2.8V-5.5V电源电压

  • 提供DIP16及SOP16封装

二、硬件连接

功能口引脚
SCLPB.6
SDAPB.5

三、添加I2C驱动

查看 STM32F103学习笔记(1)——FreeRTOS下模拟I2C


四、移植文件

注意:以下出现缺失common.h文件错误,去除即可。uint8改为uint8_t或unsigned char或自己宏定义
链接:https://pan.baidu.com/s/1p0n8_7ynqQ7d5EqgODwKMA  提取码:47gn
将 board_i2c.c、board_i2c.h、board_tm1650.c 、 board_tm1650.h 四个文件加入到工程


4.1 board_tm1650.c

/*********************************************************************

 * INCLUDES

 */

#include 'stdlib.h'

#include 'stm32f10x.h'


#include 'board_i2c.h' 

#include 'board_tm1650.h' 

#include 'common.h'


/*********************************************************************

 * LOCAL VARIABLES

 */                                     

static uint8 s_7number[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};   // 7段显示方式0~9

static uint8 s_8number[10] = {0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};   // 8段显示方式0~9


/*********************************************************************

 * PUBLIC FUNCTIONS

 */

/**

 @brief 写显存

 @param addr -[in] 写入地址

 @param data -[in] 写入数据

 @return 无

*/

void TM1650_Write(uint8 addr, uint8 data)

{          

    IIC2_Start();                                                       // 发送起始信号

    IIC2_SendByte(addr);                                                // 写地址

    IIC2_WaitAck();                                                     // 等待应答

    IIC2_SendByte(data);                                                // 写入数据

    IIC2_Ack();                                                         // 发送应答

    IIC2_Stop();                                                        // 发送停止信号   

}


/**

 @brief 显示设置

 @param brightness -[in] 亮度1~8级

 @param mode -[in] 7/8段显示方式

 @param state -[in] 开启/关闭显示

 @return 无

*/

void TM1650_SetDisplay(uint8 brightness, uint8 mode, uint8 state)

{       

    if(state)

    {

        if(mode == 7)                                                   // 7段显示方式

        {

            TM1650_Write(0x48, brightness*16 + 1*4 + 1);

        }

        else if(mode == 8)                                              // 8段显示方式

        {

            TM1650_Write(0x48, brightness*16 + 1);                      

        }

    }

    else

    {

        TM1650_Write(0x48, 0x00);                                       // 关闭显示

    }

}


/**

 @brief 显示数字

 @param index -[in] 第几个数

 @param mode -[in] 7/8段显示方式

 @param num -[in] 显示数

 @return 无

*/

void TM1650_SetNumber(uint8 index, uint8 mode, uint8 num)

{

    uint8 indexAddr = 0;

    uint8 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);

}


4.2 board_tm1650.h

#ifndef _BOARD_TM1650_H_

#define _BOARD_TM1650_H_


/*********************************************************************

 * INCLUDES

 */

#include 'stm32f10x.h'


#include 'common.h'


/*********************************************************************

 * DEFINITIONS

 */


/*********************************************************************

 * API FUNCTIONS

 */

void TM1650_Write(uint8 addr, uint8 data);

void TM1650_SetDisplay(uint8 brightness, uint8 mode, uint8 state);

void TM1650_SetNumber(uint8 index, uint8 mode, uint8 num);


#endif /* _BOARD_TM1650_H_ */


五、API调用

需包含头文件 board_tm1650.h

TM1650_Write

功能写显存
函数定义void TM1650_Write(uint8 addr, uint8 data)
参数addr:写入地址
data:写入数据
返回

TM1650_SetDisplay

功能显示设置
函数定义void TM1650_SetDisplay(uint8 brightness, uint8 mode, uint8 state)
参数brightness:写入地址
mode:7/8段显示方式
state:开启/关闭显示
返回

TM1650_SetNumber

功能显示数字
函数定义void TM1650_SetNumber(uint8 index, uint8 mode, uint8 num)
参数index:第几个数
mode:7/8段显示方式
num:显示数
返回


六、使用例子

6.1 显示104.3

uint8_t i2cDevice = IIC_CheckDevice(0x48);            // 初始化I2C,并检测是否有设备

if(!i2cDevice)

{

    printf('---- TM1650 OK ----rn');  

}   

else

{

    printf('---- TM1650 ERROR ----rn');  


TM1650_SetDisplay(3, 8, 1);

TM1650_SetNumber(1, 7, 1);

TM1650_SetNumber(2, 7, 0);

TM1650_SetNumber(3, 8, 4);

TM1650_SetNumber(4, 7, 3);


关键字:STM32F103  数码管驱动  TM1650 引用地址:STM32F103学习笔记(5)——数码管驱动TM1650使用

上一篇:STM32F103学习笔记(6)——4G Cat.1模块EC200S使用
下一篇:STM32F103学习笔记(4)——LCD段码屏HT1621使用

推荐阅读最新更新时间:2026-03-25 11:25

TM1650模块单片机源程序(子函数)
单片机源程序如下: #include STC12C5A.h #include tm1650.h void Delay_us(uint i) //us延时 { for(;i 0;i--) { _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
[单片机]
STM32 I2C写入驱动数码管显示实验
实验环境 Matlab版本: 2021b 操作系统 :Win10专业版 硬件平台 :YF-STM32-ALPHA 1R4 实验内容 :I2C驱动数码管芯片显示‘0’~‘A’字符 模型与原理图 本次实验所用到的simulink模型如图5.2所示,电路原理图如图5.3所示,实验效果为数码管从‘0’~‘A’轮流显示,如图5.1所示。 图5.1 数码管驱动显示实验效果 图5.2 数码管显示I2C驱动模型 图5.3 CH422G共阴数码管电路连接 基础模型介绍与分析 1、数码管简介 数码管简单来说就是将多个LED有规律的排列在一起,实验中用到的数码管外观如图5.4所示,其型号为:FJ3461AH,三维尺寸:30.00mmx1
[单片机]
STM32 I2C写入<font color='red'>驱动</font><font color='red'>数码管</font>显示实验
一种基于51单片机利用74HC595驱动数码管的技术
基于51单片机利用八个数码管花样显示如下: xxx11xxx→xx2222xx→x333333x→44444444→x555555x→xx6666xx→x777777x→88888888 每个状态各一秒,显示反复循环,其中x表示对应的数码管熄灭 问题补充:是共阳极的数码管,利用595芯片驱动的。采用C语言。 =================================================== 最佳答案:程序设计完毕,采用PROTEUS仿真截图如下。 程序如下: //============================================= #include #define uint uns
[单片机]
一种基于51单片机利用74HC595<font color='red'>驱动</font><font color='red'>数码管</font>的技术
用单片机AT89C51驱动两位数码管显示00--99依次循环程序代码
;两位数码管显示00--99依次循环 org 0000h a_bit equ 20h ;数码管个位数存放内存位置 b_bit equ 21h ;数码管十位数存放内存位置 temp equ 22h ;计数器数值存放内存位置 star: mov temp,#0 ;初始化计数器,从0开始 stlop: acall display;调用显示子程序 inc temp;对计数器加1 mov a,temp cjne a,#100,next ;判断计数器是否满100? mov temp,#0;满100就清零重新开始 next: ljmp stlop;不满就循环执行 ;显示子程序 display: mov a,temp ;将temp中的十六
[单片机]
8051单片机实战分析(以STC89C52RC为例) | 05 - 静态数码管驱动
1 数码管介绍 数码管是给我们展示数据或者信息的电子器件,它是最原始以及成本比较低。以下是数码管的实物图: 1.1 数码管的段选与位选 以下是数码管的每一段所对应的位置: 从图可以看出来,数码管共有 a、b、c、d、e、f、g、dp 这么 8 个段,而实际上,这 8 个段每一段都是一个 LED 小灯,所以一个数码管就是由 8个 LED 小灯组成的。注意 dp 这个段,它是表示一个小数点!我们看一下数码管内部结构的示意图: 数码管分为共阳和共阴两种: 共阴数码管就是 8 只 LED 小灯的阴极是连接在一起的,阴极是公共端,由阳极来控制单个小灯的亮灭。 同理共阳数码管就是阳极接在一起。 看到这里我们就不难猜出,所谓的
[单片机]
8051单片机实战分析(以STC89C52RC为例) | 05 - 静态<font color='red'>数码管</font><font color='red'>驱动</font>
8051单片机实战分析(以STC89C52RC为例) | 06 - 动态数码管驱动
1 动态扫描 那什么是动态扫描呢? 举个例子:有 2 个数码管,我们要显示“12”这个数字,可以先让高位的位选三极管导通,然后控制段选让其显示“1”,延时一定时间后再让低位的位选三极管导通,然后控制段选让其显示“2”。把这个流程以一定的速度循环运行就可以让数码管显示出“12”,由于交替速度非常快,人眼识别到的就是“12”这两位数字同时亮了。 在多个数码管显示数字的时候,我们可以轮流点亮数码管(一个时刻内只有一个数码管是亮的),利用人眼的视觉暂留现象(也叫余辉效应),就可以做到看起来是所有数码管都同时亮了,这就是动态显示,也叫做动态扫描。 那么一个数码管需要点亮多长时间呢?也就是说要多长时间完成一次全部数码管的扫描呢(很
[单片机]
8051单片机实战分析(以STC89C52RC为例) | 06 - 动态<font color='red'>数码管</font><font color='red'>驱动</font>
HC595驱动数码管
74HC595是一个8位串行输入、并行输出的位移缓存器 引脚定义 Q0~Q7:并行输出 Q7’:串行输出 SH_CP:移位寄存器时钟输入 ST_CP:存储寄存器时钟输入 DS:串行输入 原理图 举例 共阴极数码管控制 #define uchar unsigned char void LED_Display(void); // LED显示 void LED_OUT(uchar X); // 点亮数码管每一段 // LED字模表 unsigned char code LED_0F = { //0 1 2 3 4 5 6 7 8 9 A b C d
[单片机]
HC595<font color='red'>驱动</font><font color='red'>数码管</font>
ATmega16开发板教程(3)——74HC595驱动数码管显示
4、数码管显示 数码管驱动电路采用2片74HC595芯片进行IO扩展,仅仅只需3Pin即可驱动需要16位引脚的数码管。74HC595是一个8位串行输入、并行输出的位移缓存器。 只有对74HC595的工作原理和时序要了解清楚,才能更好的理解和编程。 工作原理: Ø1、74HC595是串行输入,即将一个字节Byte的数据通过8次以高低电平的形式送到数据引脚DS,且高字节先入,低字节后入,类似于堆栈; Ø2、那么数据什么时候进入呢?需要SCK(SH_CP)时钟上升沿来讲8位bit数据移入到移位寄存器中; 直接编程讲解: 如图,首先假设wei变量=01101001,然后取出最高位,那么&0x80,得到0,那么执行e
[单片机]
ATmega16开发板教程(3)——74HC595<font color='red'>驱动</font><font color='red'>数码管</font>显示
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved