MAX7219(模拟SPI)驱动灯环的简单应用

文章目录

  • 一、MAX7219是什么?
  • 二、使用步骤
    • 1.硬件
      • 1.1 引脚说明
      • 1.2 应用电路
        • 1.2.1 驱动数码管
        • 1.2.2 驱动点阵
    • 2.软件
      • 2.1 时序
      • 2.2 寄存器
        • 2.2.1 掉电寄存器
        • 2.2.2 译码模式寄存器
        • 2.2.3 亮度寄存器
        • 2.2.4 扫描寄存器
        • 2.2.5 显示测试寄存器
      • 2.3 初始化
      • 2.4 控制左侧灯环特定位置中的LED灯的状态
      • 2.5 控制右侧灯环特定位置中的LED灯的状态
  • 三、总结


一、MAX7219是什么?

MAX7219是一个集成化的串行输入/输出共阴极显示驱动芯片,它一般驱动8位数字的7段数码管或者连接8*8点阵又或者是64个独立的LED。它可以通过亮度寄存器来设置LED的电流,又或者是通过硬件上修改V+和ISET直接的电阻阻值大小来设置。同时,它还拥有译码模式寄存器,可以选择采用BCD译码或不采用。

有些人可能不清楚什么是BCD译码,下面简单解释下,
BCD译码 是一种将二进制数转换成BCD(Binary-Coded Decimal)格式的过程。BCD码是一种特殊的二进制编码方式,用于表示十进制数,其中每一位十进制数由4位二进制数表示,范围从0到9。例如,十进制数13在BCD码中表示为0001 0011。BCD码的优点是可以直接对每个十进制位进行处理,而无需进行二进制到十进制的转换,这在数字显示、计算机存储和控制系统等领域中具有重要意义。

二、使用步骤

1.硬件

1.1 引脚说明

在这里插入图片描述

在这里插入图片描述

1.2 应用电路

1.2.1 驱动数码管

MAX7219通过加在V+和ISET之间的一个外部电阻来控制显示亮度,段驱动电流一般是流入ISET端电流的100倍,这里用的电阻是9.53K,它设定的段电流为40mA。显示亮度也可以通过亮度寄存器来设置。

MAX7219的SPI只需要用到串行信号时钟CLK,片选信号CS以及主机输出从机输入数据DIN(MOSI),和常规相比少了个主机输入从机输出DO(MISO)。

在这里插入图片描述

1.2.2 驱动点阵

和上面的驱动数码管相比,无非就是把接在数码管的段和位接到了88点阵的行列上,88点阵其实就是64个LED组成,之前我的一篇文章有提及到,感兴趣可以自行去看下基于51单片机的点阵显示的proteus仿真(附源码)

这里级联没有涉及,先不讲。
在这里插入图片描述

2.软件

2.1 时序

在这里插入图片描述
对MAX7219来说,串行数据在DIN输入16为数据包,无论LOAD端处于何种状态,在时钟的上升沿数据均移入到内部16位移位寄存器。无论数据输入或输出CS必须为低电平,然后数据在LOAD/CS上升沿被载入数据寄存器或控制寄存器。LOAD/CS端在第16个时钟的上升沿同时或之后,下个时钟上升沿之前变为高电平,否则数据将会丢失。在DIN端的数据传输到移位寄存器在16.5个时钟周期之后出现在DOUT端。在时钟的下降沿数据将被输出。

数据位标记位D0-D15(如下表1所示)。其中D8-D11为寄存器地址位,D0-D7为数据位,D12-D15为无效位。在传输过程中,首先接收到的是D15位。是非常重要的一位(MSB)。

在这里插入图片描述

示例代码如下:

/******************************************************************************** 函数名:Write_Max7219_Date* 描述  :向Max7219写入数据* 输入  :addr地址,dat数据* 输出  :void* 调用  :内部调用* 备注  :
*******************************************************************************/
void Write_Max7219_Date(uint8_t addr,uint8_t dat)
{uint8_t i;	SPI2_CLK_LOW();		SPI2_CS_LOW();//拉低CS,选中器件	//发送地址for(i=0;i<8;i++){if(addr & 0x80){SPI2_SI_HIGH();			}else{SPI2_SI_LOW();					}addr <<= 1;SPI2_CLK_HIGH();	SPI2_CLK_LOW();					}//发送数据for(i=0;i<8;i++){if(dat & 0x80){SPI2_SI_HIGH();			}else{SPI2_SI_LOW();					}dat <<= 1;SPI2_CLK_HIGH();	SPI2_CLK_LOW();					}	SPI2_CS_HIGH();//发送结束,上升沿锁存数据	SPI2_CLK_LOW();			SPI2_SI_LOW();	
}

2.2 寄存器

MAX7219如下表所示有14个可寻址的数据寄存器和控制寄存器。数据寄存器由一个在片上的8X8的双向SRAM来实现。它们可以直接寻址所有只要在V+大于2V的情况下每个数据都可以独立的修改或保持。控制寄存器包括译码模式、显示亮度、扫描限制、掉电模式、显示测试五个寄存器。

在这里插入图片描述

示例代码如下:

/* Defines ------------------------------------------------------------------*/
#define DIG0_Registe  0x01//选位0寄存器
#define DIG1_Registe  0x02//选位1寄存器
#define DIG2_Registe  0x03//选位2寄存器
#define DIG3_Registe  0x04//选位3寄存器
#define DIG4_Registe  0x05//选位4寄存器
#define DIG5_Registe  0x06//选位5寄存器
#define DIG6_Registe  0x07//选位6寄存器
#define DIG7_Registe  0x08//选位7寄存器#define DECODE_MODE   0x09//译码模式寄存器
//0x00:7-0不采用译码
//0x01:0采用BCD译码,7-1不采用
//0x0F:3-0采用BCD译码,7-4不采用
//0xFF:7-0采用BCD译码
//当选择BCD译码模式时,译码器只对数据的低四位进行译码(D3-D0),D4-D6为无效位。D7位用来设置小数点,不受译码器的控制且为高电平。
//当选择不译码时,数据的八位与MAX7219的各段线上的信号一致。#define INTENSITY    0x0A//亮度寄存器
//亮度等级设置 0x00-0x0F 设置电流为最大电流的 1/32 - 31/32(间隔2/32)
//也可以通过硬件来改变,修改V+和ISET之间的电阻阻值大小,最小阻值为9.53kΩ,它设定段电流为40mA。#define SCAN_LIMIT   0x0B//扫描寄存器
//0x00:只显示数字0
//0x01:显示数字0&1
//0x02:显示数字0,1,2
//0x03:显示数字0,1,2,3
//0x04:显示数字0,1,2,3,4
//0x05:显示数字0,1,2,3,4,5
//0x06:显示数字0,1,2,3,4,5,6
//0x07:显示数字0,1,2,3,4,5,6,7#define SHUTDOWN 0x0C//掉电寄存器
//0x00:掉电模式
//0x01:正常模式#define DISPLAY_TEST  0x0F//显示测试寄存器
//0x00:正常模式
//0x01:显示测试模式
2.2.1 掉电寄存器

可以从下表看出掉电寄存器的地址位0x0C,写入数据0x00表示掉电模式,写入数据0x01表示正常模式。

在这里插入图片描述

示例代码如下:

#define SHUTDOWN 0x0C//掉电寄存器
//0x00:掉电模式
//0x01:正常模式Write_Max7219_Date(SHUTDOWN,0x01);//掉电模式:0;普通模式:1	
2.2.2 译码模式寄存器

可以从下表看出译码模式寄存器的地址位0x09,写入数据0x00表示不采用BCD译码,这里我实际电路接的是16个独立的LED组成的灯环,所有选择非译码模式。

在这里插入图片描述

示例代码如下:


#define DECODE_MODE   0x09//译码模式寄存器
//0x00:7-0不采用译码
//0x01:0采用BCD译码,7-1不采用
//0x0F:3-0采用BCD译码,7-4不采用
//0xFF:7-0采用BCD译码
//当选择BCD译码模式时,译码器只对数据的低四位进行译码(D3-D0),D4-D6为无效位。D7位用来设置小数点,不受译码器的控制且为高电平。
//当选择不译码时,数据的八位与MAX7219的各段线上的信号一致。Write_Max7219_Date(DECODE_MODE,0x00);//译码方式:非BCD译码
2.2.3 亮度寄存器

可以从下表看出亮度寄存器的地址位0x0A,根据写入数据多少来设置亮度也就是电流的大小。
在这里插入图片描述
示例代码如下:

#define INTENSITY    0x0A//亮度寄存器
//亮度等级设置 0x00-0x0F 设置电流为最大电流的 1/32 - 31/32(间隔2/32)
//也可以通过硬件来改变,修改V+和ISET之间的电阻阻值大小,最小阻值为9.53kΩ,它设定段电流为40mA。Write_Max7219_Date(INTENSITY,0x0C);//亮度
2.2.4 扫描寄存器

可以从下表看出扫描寄存器的地址位0x0B,根据写入数据多少来设置扫描数量。

在这里插入图片描述
示例代码如下:

#define SCAN_LIMIT   0x0B//扫描寄存器
//0x00:只显示数字0
//0x01:显示数字0&1
//0x02:显示数字0,1,2
//0x03:显示数字0,1,2,3
//0x04:显示数字0,1,2,3,4
//0x05:显示数字0,1,2,3,4,5
//0x06:显示数字0,1,2,3,4,5,6
//0x07:显示数字0,1,2,3,4,5,6,7Write_Max7219_Date(SCAN_LIMIT,0x07);//扫描界限:8个数码管显示	
2.2.5 显示测试寄存器

可以从下表看出显示测试存器的地址位0x0F,写入数据0x00表示正常模式,写入数据0x01表示显示测试模式,如果选择显示测试模式,灯会全部点亮。

在这里插入图片描述
示例代码如下:

#define DISPLAY_TEST  0x0F//显示测试寄存器
//0x00:正常模式
//0x01:显示测试模式Write_Max7219_Date(DISPLAY_TEST,0x00);//显示测试:1;测试结束,正常显示:0	

2.3 初始化

示例代码如下:

/******************************************************************************** 函数名:User_Max7219_Init* 描述  :MAX7219配置初始化* 输入  :void* 输出  :void* 调用  :初始化* 备注  :
*******************************************************************************/
void User_Max7219_Init(void)
{User_SPI2_Init();//SPI引脚配置初始化	Write_Max7219_Date(SHUTDOWN,0x01);//掉电模式:0;普通模式:1	Write_Max7219_Date(DISPLAY_TEST,0x00);//显示测试:1;测试结束,正常显示:0			Write_Max7219_Date(DECODE_MODE,0x00);//译码方式:非BCD译码Write_Max7219_Date(SCAN_LIMIT,0x07);//扫描界限:8个数码管显示	Write_Max7219_Date(INTENSITY,0x0C);//亮度
}

2.4 控制左侧灯环特定位置中的LED灯的状态

示例代码如下:

/******************************************************************************** 函数名:ConLeft* 描述  :控制左侧灯环特定位置中的LED灯的状态* 输入  :num代表要控制的LED灯的位置,status代表LED灯的状态,0表示关闭,1表示打开* 输出  :void* 调用  :内部调用* 备注  :
*******************************************************************************/
void ConLeft(uint8_t num, uint8_t Status)	// num 从 0 开始 (中间位置)
{if ( ( Status != 0 ) &&	( Status != 1 ) ){Sendstr_U1 ( "*_ERR: Status$" );return;}if ( num > 15 ){Sendstr_U1 ( "*_ERR: num > 15$" );num = 15;}if ( Status == 0 ){LeftStatus &= ( ~ ( 0x0001 << num ) );Left_RegVal[ ( num >> 2 )] &= ( ~Left_Val[num] );}else{LeftStatus |= ( 0x0001 << num );Left_RegVal[ ( num >> 2 )] |= ( Left_Val[num] );}Write_Max7219_Date ( Left_Reg[num], Left_RegVal[ ( num >> 2 )] );
}

2.5 控制右侧灯环特定位置中的LED灯的状态

示例代码如下:

/******************************************************************************** 函数名:ConRight* 描述  :控制右侧灯环特定位置中的LED灯的状态* 输入  :num代表要控制的LED灯的位置,status代表LED灯的状态,0表示关闭,1表示打开* 输出  :void* 调用  :内部调用* 备注  :
*******************************************************************************/
void ConRight(uint8_t num, uint8_t Status )	// num 从 0 开始 (中间位置)
{if ( ( Status != 0 ) &&	( Status != 1 ) ){Sendstr_U1 ( "*_ERR: Status$" );return;}if ( num > 15 ){Sendstr_U1 ( "*_ERR: num > 15$" );num = 15;}if ( Status == 0 ){RightStatus &= ( ~ ( 0x0001 << num ) );Right_RegVal[ ( num >> 2 )] &= ( ~Right_Val[num] );}else{RightStatus |= ( 0x0001 << num );Right_RegVal[ ( num >> 2 )] |= ( Right_Val[num] );}Write_Max7219_Date ( Right_Reg[num], Right_RegVal[ ( num >> 2 )] );
}

三、总结

今天主要讲了MAX7219(模拟SPI)驱动灯环的简单应用。

感谢你的观看!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大厂起诉了,协商拿了2N,整理点经验心得给大家,关于离职时如何让自己利益最大化!...

离职时&#xff0c;如何让自己的利益最大化&#xff1f; 一位跟大厂仲裁&#xff0c;并通过协商拿到2n的网友分享了自己的经验心得&#xff0c;干货满满&#xff0c;下面是要点总结&#xff1a; 1.大部分裁员都是违法裁员&#xff0c;应该给2n&#xff0c;但公司不会承认&…

【代码随想录——贪心算法——二周目】

1.买卖股票的最佳时间② 思路&#xff1a;构建每两天之间的利润之差&#xff0c;如果是正数则一直累加即可。 体现出来场景是&#xff0c;如果理论一直为正&#xff0c;则说明我们需要一直持有股票。当出现负数时&#xff0c;代表我们应该在前一天卖出。当出现正数时我们应该在…

【耗时十个小时】程序员最趁手的SVM算法,学完你会哭着感谢努力的自己!

❤ 纯 干 货 ❤ 在这之前咱们已经接触了 各个算法的优缺点的总结&#xff0c;以及8个回归类算法、7个正则化算法的总结、5 个集成算法模型的全部总结&#xff01; 感兴趣的可以翻到之前看看~ 咱们今天就大概一起学习一下关于SVM的方方面面。 线性支持向量机 非线性支持向量…

【全开源】Java同城服务同城信息同城任务发布平台小程序APP公众号源码

&#x1f4e2; 连接你我&#xff0c;让任务触手可及 &#x1f31f; 引言 在快节奏的现代生活中&#xff0c;我们时常需要寻找一些便捷的方式来处理生活中的琐事。同城任务发布平台系统应运而生&#xff0c;它为我们提供了一个高效、便捷的平台&#xff0c;让我们能够轻松发布…

ATA-2081高压放大器选型时注意事项是什么

高压放大器是一类特殊设计的放大器&#xff0c;用于放大高电压信号。在选择高压放大器时&#xff0c;需要考虑多个因素&#xff0c;以确保所选设备符合应用需求并能够提供稳定、可靠的性能。下面安泰电子官网将详细介绍在高压放大器选型过程中需要注意的关键事项。 一、电压范围…

【机器学习数据挖掘】基于自回归积分滑动平均模型的疫情分析报告 附完整python代码

资源地址&#xff1a;Python数据分析大作业 2000字 图文分析文档 疫情分析完整python代码 数据分析 数据来自法国疫情数据 数据预处理 建立模型 模型预测 资源地址&#xff1a;Python数据分析大作业 2000字 图文分析文档 疫情分析完整python代码 代码详解 完整代码文件 主…

luckysheet的使用

前言 公司新需求要一个在线的excel编辑器 一、luckysheet是什么&#xff1f; LuckySheet是一款基于Web的在线表格组件&#xff0c;一款纯前端类似excel的在线表格&#xff0c;功能强大、配置简单、完全开源结合Vue3可以实现数据的动态展示和编辑&#xff0c;为用户提供良好的…

2024年澳大利亚科学院新增院士名单和两位华人学者简介

近日&#xff0c;澳大利亚科学院公布了2024年新当选的24位院士名单&#xff0c;他们也是访问学者、博士后及联合培养博士们关注的目标导师。为此知识人网小编推出该文&#xff0c;以飨读者。 5月 23 日&#xff0c;2024年澳大利亚科学院&#xff08;the Australian Academy of…

【企业开发】大屏的响应式处理

【企业开发】大屏的响应式处理 如图&#xff1a; 响应式工具封装 // 等比缩放方式屏幕适配 export function screenAdaptive(designWidth 1920, designHeight 1080) {const screenWidth document.documentElement.clientWidth || document.body.clientWidthconst screenHeig…

【数据结构】 排序算法总结,直接选择排序详解!

文章目录 1. 排序几个重点概念的理解2. 排序算法的分析&#x1f427;3.直接选择排序 1. 排序几个重点概念的理解 2. 排序算法的分析&#x1f427; 3.直接选择排序 &#x1f427; begin 有可能就是 maxi &#xff0c;所以交换的时候&#xff0c;要及时更新 maxi &#x1f34e;…

java同步

Java中的同步是指在多线程编程中&#xff0c;用来控制多个线程对共享资源的访问&#xff0c;以避免数据不一致的问题。Java提供了多种同步机制来确保线程安全。以下是Java同步的详细讲解&#xff1a; 1. synchronized关键字 synchronized关键字是Java中最常见的同步机制&…

计算机专业本科就业还是考研?考研有哪些热门方向?

考研并不是一个逃避就业的避难所&#xff0c;也不是一个简单的提升待遇的手段。考研是提升自我的途径&#xff0c;特别是对于那些对特定技术领域有浓厚兴趣并愿意深入研究的人来说 一个本科生能够认真学三年&#xff0c;那么他们所掌握的技能和知识不应该逊色于那些通过短期培…

Solidworks 提取模型中的零件,并组合成一个新的零件,放入特征库

对方发来一个STP文件&#xff0c;其中有模型的部分零件想为我所用。 Shift键鼠标左键 选取需要的零件 在选好零件上右键&#xff0c;选择“孤立” 左边找到部件&#xff0c;ctrl左键选中&#xff0c;选择“插入到新零件” 点 绿色 勾 就选择保存类型&#xff0c;完成 。 打开这…

Pyinstaller安装与使用

一、Pyinstaller简介 PyInstaller将Python应用程序冻结(打包)独立可执行文件中。它可以构建较小的可执行文件,它是完全多平台的,并且使用OS支持来加载动态库,从而确保完全兼容。 二、Pyinstaller安装 1、下载安装 首先安装“pip install pywin32” 其次“pip install …

设备维修管理系统

设备维修管理系统是一个集故障处理、巡检处理、设备管理、维修管理、系统管理以及手机客户端功能等六大功能于一体的信息化管理系统。该系统旨在实现设备管理的科学化、规范化和网络化&#xff0c;通过整合设备维修的各个环节和流程&#xff0c;提高设备维修的效率和质量&#…

网络安全||信息加解密技术以及密钥管理技术

一、信息加解密技术 对称加密 对称加密&#xff08;又称为私人密钥加密/共享密钥加密&#xff09;&#xff1a;加密与解密使用同一密钥。特点&#xff1a;加密强度不高&#xff0c;但效率高&#xff1b;密钥分发困难。&#xff08;大量明文为了保证加密效率一般使用对称加密&…

GAT1399协议分析(二)--注册流程分析

一、官方流程说明 二、官方流程解析 1 : 发起方向接收方发送注册 HTTP POST 请求/VIID/System/Register。 2: 接收方向发送方发送响应401 Unauthorized, 并在响应的消息头 WWW-Authenticate 字段中给 出适合发送方的认证机制和参数。 3: 发起方重新向接收方发送注册 HTTP POST…

单实例11.2.0.4迁移到11.2.0.4RAC_使用rman异机恢复

保命法则&#xff1a;先备份再操作&#xff0c;磁盘空间紧张无法备份就让满足&#xff0c;给自己留退路。 场景说明&#xff1a; 1.本文档的环境为同平台、不同版本&#xff08;操作系统版本可以不同&#xff0c;数据库版本相同&#xff09;&#xff0c;源机器和目标机器部分…

解锁阿里巴巴API接口的无限可能:打造你的电商、物流、支付新纪元

Alibaba API接口是Alibaba平台对外开放的一系列编程接口&#xff0c;开发者可以通过这些接口访问Alibaba平台的数据和功能&#xff0c;如商品搜索、订单管理、支付接口等。这些接口基于HTTP/HTTPS协议&#xff0c;支持多种编程语言和数据格式&#xff08;如JSON、XML等&#xf…

【设计模式】JAVA Design Patterns——Observer(观察者模式)

&#x1f50d;目的 定义一种一对多的对象依赖关系这样当一个对象改变状态时&#xff0c;所有依赖它的对象都将自动通知或更新。 &#x1f50d;解释 真实世界例子 在遥远的土地上生活着霍比特人和兽人的种族。他们都是户外生活的人所以他们密切关注天气的变化。可以说他们不断地…