TM1650数码管(类IIC驱动)

这篇具有很好参考价值的文章主要介绍了TM1650数码管(类IIC驱动)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、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总线结构

tm1650,STM32硬件,单片机,嵌入式硬件

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

         3、信号概念

                a:起始信号

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

                c:停止信号

tm1650,STM32硬件,单片机,嵌入式硬件

 SDA时序图

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

tm1650,STM32硬件,单片机,嵌入式硬件

 开始信号和停止信号

tm1650,STM32硬件,单片机,嵌入式硬件

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

tm1650,STM32硬件,单片机,嵌入式硬件

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

 三、TM1650数码管的工作

tm1650,STM32硬件,单片机,嵌入式硬件

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

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

tm1650,STM32硬件,单片机,嵌入式硬件

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

tm1650,STM32硬件,单片机,嵌入式硬件

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

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

tm1650,STM32硬件,单片机,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-559085.html

到了这里,关于TM1650数码管(类IIC驱动)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机使用TM1638驱动的数码管键盘模块

    前几天差不多把清翔的视频教程写完了,然后玩了两天,这次准备把以前买的TM1638芯片驱动的数码管按键模块用在51单片机上。 这个模块我在pdd上买的,用了2块的优惠券后付款7元包邮,价格还行吧,对比了下这个价格几乎就是最低价了。TM1638芯片都要1块多,再加上PCB,焊接

    2024年02月03日
    浏览(82)
  • Arduino UNO驱动TM1637四位时钟数码管显示时间

    TM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。  显示模式(8 段×6 位),支持共阳数码管输出  键扫描(8×2bit),增强型抗干扰按键识别电路  辉度调节电路(占空比

    2024年02月12日
    浏览(33)
  • GD32E230C8T6《调试篇》之 (软件) IIC通信(主机接收从机) + GN1650驱动芯片 + 按键 + 4位8段数码管显示 (成功)

    IIC也称I2C,是一个多主从的串行总线,由飞利浦公司发明的通讯总线,属于半双工同步传输类总线,仅由两条线就能完成多机通讯,一条SCL时钟线,另外一条双向数据线SDA,IIC总线要求每个设备SCL/SDA线都是漏极开路模式,因此必须带上拉电阻才能正常工作。I2C协议占用引脚少

    2024年01月21日
    浏览(26)
  • ARM开发之基于IIC协议的TM1650驱动实现(模拟IIC实现)

    目录 一、内存映射 1、什么是内存映射?为什么要内存映射? 2、gec6818如何进行内存映射?(相关的函数) 3、内存映射代码 : 二、模拟IIC的底层代码实现 1、配置输入输出方向 2、拉高拉低引脚 3、获得总线传回的数据 4、协议的实现 三、TM1650的使用 1、TM1650简介 2、TM1650怎

    2024年02月12日
    浏览(29)
  • ESP32C3 LuatOS TM1650①驱动测试

    合宙TM1650驱动资料 TM1650.lua源码 TM1650 ESP32C3 SCL GPIO5 SDA GPIO4

    2024年02月07日
    浏览(46)
  • STM32HAL库驱动数码管

    本文档创建于2023年3月7日 本文记录了我学习数码管驱动的过程,实际是微机原理课上留的一个作业。 本文作者:RobotFreak 本文参考《NANO_STM32F103开发指南-HAL库版本_V2.0》,正点原子官网可下载。 数码管,也称LED数码管,按发光二极管单元连接方式可分为“共阳极数码管”和“

    2024年02月08日
    浏览(29)
  • STM32使用HAL库驱动TA6932数码管驱动芯片

    8段16位,支持共阴共阳LED数码管。 推挽配置即可。 1、使用TA6932_Init进行初始化 2、使用TA6932_Disp(uint8_t *_ucPtr,uint8_t _ucLenth)进行显示,_upPtr指针指向段码,_ucLenth为显示长度,不超过16位。

    2024年02月07日
    浏览(34)
  • STM32 数码管显示

    一 认识二级管 常用的二级管分为两种 1,(b)图共阴极结构:是把所有 LED 的阴极作为公共端(COM) 连起来,接低电平,通常接地。通过控制每一个 LED 的阳极电平使其发光或熄灭,阳极为高电平时LED 发光,为低电平时 LED熄灭。如显示数字0时,a、b、ad.e、t端为高电平,其他各

    2024年02月08日
    浏览(39)
  • STM32 调试TM7711驱动原理图驱动代码

    本文使用工程代码如下 (1条消息) STM32调试TM7711驱动原理图驱动源代码,参考如下博客,有原理图设计资源-CSDN文库 项目选用TM7711,还是很令人吃惊的,主要是有如下几个理由 第一就是便宜 第二精度高 STM32的ADC精度不够,才12bit,TM7711的精度可以,可以提供单通道 24bit 高精度

    2024年01月16日
    浏览(39)
  • STM32-GPIO数码管动态显示

    目录 一、数码管原理 1、LED数码管的结构 2、LED数码管工作原理 3、数码管动态显示 1)动态显示的概念 2)动态显示的接口 二、代码的实现 三、仿真结果展示   本篇文章将继续进一步了解GPIO外设输出模式 知道这一部分的朋友可以直接点击目录部分跳过这段跳过 ,这里介绍

    2023年04月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包