基于MAX7219移位寄存器工作原理及代码分析

2024-01-21 12:40

本文主要是介绍基于MAX7219移位寄存器工作原理及代码分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基于MAX7219移位寄存器工作原理及代码分析

该图为芯片功能图表
首先要明白DIN管脚的含义,其为串行数据输入端口,在时钟上升沿时数据被载入内部的 16 位寄存器。 而CLK即为时钟序列输入端,所以当要输入数据时,先得把CLK脚的电位拉低,输入一位数据后,再把CLK的电位拉高,此时则产生了一个时钟上升沿,使数据被载入,此时用代码表示为(注意:通过时序图可知,CS为低电平时串行数据才会被载入移位寄存器,为高电平时会被锁存。):

void Write_Max7219_byte()         
{ Max7219_CS=0;     //CS=0有效,CS=1锁存  Max7219_CLK=0;Max7219_DIN=0;Max7219_CLK=1;    //通过上升沿把数据送出去,即一个0——1的跳变Max7219_CLK=0;Max7219_DIN=1;Max7219_CLK=1; Max7219_CLK=0;Max7219_DIN=0;Max7219_CLK=1; Max7219_CLK=0;Max7219_DIN=1;Max7219_CLK=1; }

这时会发现,在一个时钟上升沿只能传一位数据,如果想传8位甚至更多数据时,需要多次重复时钟上升的过程,特别繁琐,通过以上代码会发现一个规律,CLk的上升过程是重复的,这时就能够联想到C语言中的For循环,那如何将一字节强制转换成一位来使用呢?C语句又给出了很好的答案,因为串行数据输入端口一次只能读一位,且只能取该字节的最高位,如果强行给一个字节给它,那么它一次也只能读到最高位,可编程过程中就是需要给一位给它,如何读取到后面的字节,这是就巧妙的运用到了移位,可以每次通过左移一位的方式,让输入端口逐个接收,此时代码如下:

void Write_Max7219_byte(uchar DATA)         
{uchar i;    Max7219_CS=0;                   //CS=0有效,CS=1锁存  for(i=8;i>=1;i--){      Max7219_CLK=0;Max7219_DIN=DATA&0x80; //即DATA&10000000DATA=DATA<<1;         //出问题的地方Max7219_CLK=1;       //通过上升沿再把数据送出去}

(1)对Max7219_DIN=DATA&0x80;进行分析:

由于串行数据输入端口一次只能读一位,且只能取该字节的最高位,那么通过与0x80的方式,可以使该字节最高位不变的情况下,后面七位全部置0(1字节强制转换成一位使用的缘故),此时的代码相对来说已经达到了最简。

在这里插入图片描述

二、如何移位

由数据手册知该芯片在传输数据过程中,首先接收到的是 D15 位,那么在传输数据的过程中,先接收到的数据会往后移,可以类比于后面接收的数据把先接收的数据挤了下去,直到填满寄存器为止。

这篇关于基于MAX7219移位寄存器工作原理及代码分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/629581

相关文章

Java 接口定义变量的示例代码

《Java接口定义变量的示例代码》文章介绍了Java接口中的变量和方法,接口中的变量必须是publicstaticfinal的,用于定义常量,而方法默认是publicabstract的,必须由实现类... 在 Java 中,接口是一种抽象类型,用于定义类必须实现的方法。接口可以包含常量和方法,但不能包含实例

Java线程池核心参数原理及使用指南

《Java线程池核心参数原理及使用指南》本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,... 目录一、线程池概述1.1 什么是线程池1.2 线程池的优势二、线程池核心类三、ThreadPoolE

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

Springboot请求和响应相关注解及使用场景分析

《Springboot请求和响应相关注解及使用场景分析》本文介绍了SpringBoot中用于处理HTTP请求和构建HTTP响应的常用注解,包括@RequestMapping、@RequestParam... 目录1. 请求处理注解@RequestMapping@GetMapping, @PostMappin

mybatis-plus分表实现案例(附示例代码)

《mybatis-plus分表实现案例(附示例代码)》MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生,:本文主要介绍my... 目录文档说明数据库水平分表思路1. 为什么要水平分表2. 核心设计要点3.基于数据库水平分表注意事项示例

Nginx服务器部署详细代码实例

《Nginx服务器部署详细代码实例》Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,:本文主要介绍Nginx服务器部署的相关资料,文中通过代码... 目录Nginx 服务器SSL/TLS 配置动态脚本反向代理总结Nginx 服务器Nginx是一个‌高性

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文