TM1650数码管(类IIC驱动)

2023-11-01

目录

一、TM1650简介

        1、特性描述

        2、功能特点

二、IIC(Inter-Integrated Circuit BUS)结构解析

        1、IIC协议介绍

        2、多主机IIC总线结构

         3、信号概念

 三、TM1650数码管的工作

四、编写代码


一、TM1650简介

        1、特性描述

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

        2、功能特点

                a:支持2.8V-5.5V电源电压

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

                c:提供8级亮度控制

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

                e:类IIC通信机制,使用相同时序,没有从机地址

二、IIC(Inter-Integrated Circuit BUS)结构解析

        1、IIC协议介绍

        I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 

        软件IIC:软件IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,用软件控制管脚状态以模拟I2C通信波形,软件模拟寄存器的工作方式。

        硬件IIC:一块硬件电路,硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,硬件(固件)I2C是直接调用内部寄存器进行配置。

        2、多主机IIC总线结构

 每个主机都有7bit地址,最后一位是读写位(1或0),而TM1650数码管使用的是类IIC通信,所以不带从机地址。

         3、信号概念

                a:起始信号

                b:应答信号(低位有效)

                c:停止信号

 SDA时序图

         上图主机向从机发送一个起始条件,然后主机进行一个写访问,ACK作为从机向主机发送一个应答信号,低位有效,WORD ADDRESS表示主机告诉从机我待会要访问哪块存储地址,从机再给出应答,然后向从机发送数据,每发送一个字节,从机给出应答。最后在发送一个停止信号。

 开始信号和停止信号

 ACK应答信号(ACK处在第九时钟周期,也可以看作为第九位)

 数据有效性(SCL为高电平时,SDA只能有一种状态,要么高电平,要么低电平)

 三、TM1650数码管的工作

 可以看到,上面的时序图和iic来讲是一样的,包含一个开始信号,停止信号和ACK应答机制。

起始信号>>地址码(1字节)>>ACK应答信号>>数码管段数据(1字节)>>ACK应答信号>>结束信号

上面是设置亮度的发送的数据格式:前四位(B7-B4)是设置亮度的级别的。B3(设置数码管的段位),B0设置显示的开关。

68HL===68 H:16进制 L:低位      68HU===68 H:16进制 U:高位

通过数据手册得知

        0x68 //第一个数码管的地址

        0x6a //第二个数码管的地址

        0x6c //第三个数码管的地址

        0x6e //第四个数码管的地址

        T0x48 //设置亮度地址

四、编写代码

编程环境:keil5   STM32f103c8t6

numTM1650.c

/*
    此模块是数码管模块
    共阴数码管
    TM1650是一个用IIC协议驱动的模块
    此模块SDA接PB13,SCL接PB12,由于PB12,PB13口没有IIC外设复用,因此需要通过GPIO口模拟出IIC的通    信协议驱动
*/

#include "delay.h"
#include "numTM1650.c"

uint8_t data_num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字的段码
uint8_t data_alphabet[6]={0x77,0x7c,0x39,0x5e,0x79,0x71}; //英文a-f的段码

uint8_t display_address[4]={0x6e,0x6c,0x6a,0x68}; //数码管的段地址
uint8_t display_brightness[8]={0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x01}; //亮度设置,分别代表从0-7级别的亮度


void TM1650_Init(void)//TM1650模块端口GPIO初始化
{
	GPIO_InitTypeDef  GPIO_InitStruct;//定义一个GPIO结构体变量
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//打开GPIO B组时钟
	
	GPIO_InitStruct.GPIO_Pin	= GPIO_Pin_12|GPIO_Pin_13;  		//引脚12,引脚13
	GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_Out_PP;	//推挽输出
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz; //速度	 
	
	GPIO_Init(GPIOB, &GPIO_InitStruct);	
}

void Iic_Mode(GPIOMode_TypeDef Mode)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	
	GPIO_InitStruct.GPIO_Pin	= GPIO_Pin_13;		//引脚13
	GPIO_InitStruct.GPIO_Mode	= Mode;	//输出模式
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz;	//50MHZ
	GPIO_Init(GPIOB, &GPIO_InitStruct);

}

void TM1650_start(void)    //开始信号
{    
    Iic_Mode(GPIO_Mode_OUT);
	TM1650_SCL_1;
	TM1650_SDA_1;
	delay_us(5);
	TM1650_SDA_0;
	delay_us(5);
    TM1650_SCL_0;
    delay_us(5);
}

void TM1650_stop(void)    //停止信号
{
    Iic_Mode(GPIO_Mode_OUT);

    TM1650_SCL_1;
    TM1650_SDA_0;
    delay_us(5);
    TM1650_SDA_1;
    delay_us(5);
    
}

void TM1650_send(uint8_t data)    //传输数据
{
    Iic_Mode(GPIO_Mode_OUT);
    uint8_t i;
    TM1650_SCL_0;
    TM1650_SDA_0;
    delay_us(5);
    for(i=7; i>=0; i--)
    {
        if(data&(1<<i))    //根据图判断SDA为高电平还是低电平,高位到低位操作
            TM1650_SDA_1;    
        else
            TM1650_SDA_0;
        delay_us(5);

        TM1650_SCL_1;
        delay_us(5);
        TM1650_SCL_0;
        delay_us(5);
    }
}

uint5_t TM1650_ack(void)
{
    Iic_Mode(GPIO_Mode_IN);
    uint ack = 0;
    TM1650_SCL_0;
    delay_us(5);
    TM1650_SCL_1;
    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13))   //读取引脚(SDA)当前状态是高还是低
        ack = 1;        //无应答

    TM1650_SCL_0;
    delay_us(5);
    
    return ack;
}

void Write_DATA(unsigned char add,unsigned char DATA)		//指定地址写入数据
{
	TM1650_start();//启动信号
	TM1650_send(add);//发送地址
	TM1650_ACK(); //应答信号
	TM1650_send(DATA);//写入数据
	TM1650_ACK(); //应答信号
	TM1650_stop(); //停止信号
}

void Display_Init(void) //显示设备的初始化
{
	delay_ms(500); //需要延时400ms等待芯片的启动
	Write_DATA(TIM_COMMAND,display_brightness[7]); //显示最大亮度
	Write_DATA(DIS_ADD_1,data_null);		//显示无
	Write_DATA(DIS_ADD_2,data_null);
	Write_DATA(DIS_ADD_3,data_null);
	Write_DATA(DIS_ADD_4,data_null);
}

void Show_Num(uint16_t num,uint8_t dp)
{
	uint8_t buff = 0;
	uint8_t i;
	if(num <= 9999) //数字在合适范围
	{
		for(i = 0;i <4; i++)
		{
			buff = num % 10;
			if((dp&0x01) == 1)	//该位为1的话就显示小数点
			{
				Write_DATA(display_address[i],data_num[buff]|data_dp);
			}
			else
			{
				Write_DATA(display_address[i],data_num[buff]);
			}
			num /= 10;
			dp = dp >> 1;
		}
	}
}
void Display_Change_Brightness(uint8_t num) 	//修改亮度,亮度范围0-7,0代表最低亮度,7代表最高亮度
{
	if(num < 8)
	{
        //TIM_COMMAND(.h文件定义)				0x48 //显存地址
        //display_brightness                    亮度

		Write_DATA(TIM_COMMAND,display_brightness[num]); //默认为最大亮度
	}
}

numTM1650.h

#ifndef NUMTM1650_H
#define NUMTM1650_H
#include "stm32f10x.h"

#define TM1650_SCL_1  GPIO_SetBits(GPIOB,GPIO_Pin_12)
#define TM1650_SCL_0  GPIO_ResetBits(GPIOB,GPIO_Pin_12)

#define TM1650_SDA_1  GPIO_SetBits(GPIOB,GPIO_Pin_13)
#define TM1650_SDA_0  GPIO_ResetBits(GPIOB,GPIO_Pin_13)

#define  data_dp 							0x80
#define  DIS_ADD_1							0x68 //第一个数码管的地址
#define  DIS_ADD_2							0x6a //第二个数码管的地址
#define  DIS_ADD_3							0x6c //第三个数码管的地址
#define  DIS_ADD_4							0x6e //第四个数码管的地址

#define  TIM_COMMAND						0x48 //显存地址
#define  data_null					    	0x00  //不显示

void TM1650_Init(void);//TM1650模块端口GPIO初始化 
void Iic_Mode(GPIOMode_TypeDef Mode);
void TM1650_start(void);
void TM1650_stop(void);
void TM1650_ack(void);
void TM1650_send(uint8_t data);
void Write_DATA(unsigned char add,unsigned char DATA);
void Display_Init(void);
void Show_Num(uint16_t num,uint8_t dp);
void Display_Change_Brightness(uint8_t num)


#endif

以上就是我的理解,作为初学者,容易疏忽遗漏,希望各位大佬对我多多指教,互相学习 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TM1650数码管(类IIC驱动) 的相关文章

  • nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 的解决办法

    问题概述 在基于微服务架构风格的项目开发过程中 为了提高快速开发的目的 提高开发效率 集成了 MyBatisPlus 对于 MyBatisPlus 封装的 CRUD API 接口已经非常强大了 但是有时还是需要使用其动态 SQL 的拼接 在
  • 性能测试之性能优化篇

    目录 为什么进行性能测试 性能测试的目的 服务性能优化的思考 衡量系统性能常用的指标 系统性能计数器 性能测试分类 如何合理的规划我们的架构性能 最后拿数据说话 性能优化原则 性能优化的方法 性能优化的分层思想 所有的优化都会对系统性能产生
  • flask 文件 服务器,flask服务器文件上传云

    flask服务器文件上传云 内容精选 换一换 弹性云服务器支持通过内网访问OBS OBS可供用户存储任意类型的数据 将图片 视频等数据存储至OBS后 在ECS上可以访问OBS 下载桶中的图片或视频等数据 通过内网访问OBS 可以避免因网络不

随机推荐

  • ASP.NET中JSON的序列化和反序列化

    在项目开发过程中 发现需要用到JSON序列化 反序列化的问题 所有 在网上找到了一下这篇文章 摘录了下来 摘自 http www cnblogs com zhaozhan archive 2011 01 09 1931340 html JS
  • 使用ijkplayer播放4k视频卡顿的解决方法

    使用ijkplayer播放4k视频卡顿的解决方法 使用硬解码 ijkMediaPlayer setOption IjkMediaPlayer OPT CATEGORY PLAYER mediacodec 1
  • PAT甲级1135

    红黑树的特点 1 根节点是黑色 2 如果一个节点是红色那么他的两个子节点都是红色 3 任意从根节点到叶子结点的路径上 所有的路径经过的黑色节点数相同 4 红黑树是二叉搜索树 算法 1 根节点是否为黑色 2 红色节点的两个子节点是不是都是黑色
  • JS 数组或对象的遍历(for、for...in、for...of、foreach)

    转载自 JavaScript 比较for for in for of forEach的区别 非早起选手的博客 CSDN博客 目录 一 for 二 for in 三 for of 四 forEach 五 小结 一 for 最原始的方法 用来遍
  • 【在线教育】- 前端环境搭建&讲师CURD前端实现

    在线教育 一 在线教育前端环境搭建 1 1 vue element admin 概述 1 2 vue element admin master安装 1 3 vue element template介绍 了解 1 4 vue element
  • 牛客面试高频算法题js(输出二叉树的右视图、岛屿数量、矩阵的最小路径和、字符串出现次数的TopK问题、二叉树根节点到叶子节点的所有路径和)

    NC136 输出二叉树的右视图 描述 请根据二叉树的前序遍历 中序遍历恢复二叉树 并打印出二叉树的右视图 数据范围 0 le n le 100000 n 10000 要求 空间复杂度 O n O n 时间复杂度 O n O n 如输入 1
  • html跳转页面到自己写的另一个页面,非js

    最简单的跳转页面 记录给渣渣的自己 很low的两个html界面1和2 在1页面上设置一个button 按下按钮 跳转至自己写的2界面 代码如下 div class wrapper div class container h1 Welcome
  • Sqli-labs 15-19

    15关 在输入框内测试Username asd Password 123并点击提交后发现并没有什么卵用 在Username处尝试万能钥匙1 or 1 1 发现成功登录了 接下来看源码分析问题 由于红下划线处的username uname 所
  • 移动app开发如何做接口的版本控制

    移动app为什么要做版本控制 应用升级无法做到全部升级 比如某应用现行1 1版本 某次开发升级后 版本变为1 2 除app界面变化外 后台接口也发生了变化 然而不是所有的用户都在第一时间升级了app 或者由于版本推送不及时 用户忽略更新等原
  • 2020浙江大学软件学院预推免经验

    个人背景 本人为末流211计算机科学与技术专业 且专业排名于保研名额末尾 但是综合排名在中上肯定有保研资格 本科学校最后是以综合排名上报学信网的 而预推免和夏令营对方学校对看的一般是专业排名 预推免报名时本科学校已经出了推免名单了 所以预推
  • Datadog 能成为最大的云监控厂商吗

    Datadog 原本是一家名不见经传的云监控公司 于 2019年9月19日 登陆纳斯达克 上市首日即突破 80亿 美金 上市前还搞了个小插曲 思科在 IPO 前夕提出 70亿美元 全面收购要约 被 Datadog 董事会断然拒绝 时至今日
  • leetcode 55. 跳跃游戏

    一 题意 给定一个非负整数数组 nums 你最初位于数组的第一个下标 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标 二 解法 贪心算法 解法1 计算出 i n u m s
  • Qt程序启动画面播放(gif与swf两种动画格式) - 路上的脚印

    学习Qt有一段时间了 发现一个小问题 网上关于Qt的资料或者总结性的学习及应用文章有点少 比如 Qt完整的API 程序运行之前的启动画面如何按理想效果播放等 每次想在项目中添加一些应用的时候 总是找不到好的书籍或文章可以马上学习 上手 今天
  • 淘宝、1688、京东、拼多多,抖音五个平台的区别分析

    淘宝 淘宝是中国最大的C2C电子商务平台 也是消费者购物的首选平台 淘宝上的商品种类繁多 价格实惠 同时还有很多优惠活动和促销活动 让消费者可以以较低的价格购买到高质量的商品 1688 1688是中国最大的批发市场之一 有数百万的商家在上面
  • Qt为release中可执行程序添加库进行打包并结合inno setup打包生成exe安装文件

    Qt为release中可执行程序添加库进行打包并结合inno setup打包生成exe安装文件 文章目录 Qt为release中可执行程序添加库进行打包并结合inno setup打包生成exe安装文件 一 Qt为release中可执行程序添
  • fedora11下gmlive0.22beta源代码安装

    1 解决依赖问题 否则会出现问题 No package gtkmm 2 4 found No package libglademm 2 4 found 安装依赖包 yum install gtkmm24 dev yum insttall l
  • C# 海康人脸识别设备初开发(二)话不多说以下完整例子

    demo截图 demo下载地址 https download csdn net download qq 16632449 11002228 以下完善了计划权限 可以参考下 其他的没了 如果提示错误23 基本是设备不支持 那你就要去问下海康的
  • Spring boot定时任务@Scheduled

    文章目录 1 前言 2 pom包配置 3 启动类启用定时 4 创建定时任务实现类 5 补充 cron表达式 6 遇到的坑 1 前言 Scheduled 参数可以接受两种定时的设置 一种是我们常用的cron 6 一种是 fixedRate 6
  • C++11:委派构造函数

    委派构造函数
  • TM1650数码管(类IIC驱动)

    目录 一 TM1650简介 1 特性描述 2 功能特点 二 IIC Inter Integrated Circuit BUS 结构解析 1 IIC协议介绍 2 多主机IIC总线结构 3 信号概念 三 TM1650数码管的工作 四 编写代码