MAX7219驱动数码管学习记录(有源码)

news2024/12/27 15:03:19

一、7219datasheet阅读

1.引脚定义:

重点介绍5个引脚

1.DIN:

        串行数据总线输入引脚,每个时钟的上升沿将数据移入至芯片内部的移位寄存器中

2.DIG0-DIG7:

        共阴极管的GND连接的便是DIG0-7,该引脚起作用时,便输出低电平,即共阴极数码管的GND端为低电平。不起作用时为高电平,即数码管无法被点亮。

3. LOAD:

        装载信号(LOAD),在load的上升沿,16位数据被锁存器锁存,数据不发生变化        

4.CLK 

        串行时钟输入,在每次CLK的上升沿,数据被移位至MAX7219内部的移位寄存器,配合上述的LOAD信号,便可以将数据锁存;下降沿时,数据从DOUT引脚输出(用于级联的情况)。

5.SEGA-SEGG,DP :

        数码管的7段(a,b,c,d,e,f)以及一个小数点dp的驱动信号,当功能关闭时,段(seg)输出低电平,即无法点亮(由于是共阴极接法,前期已经将DIG置为低电平,只有当SEG为高电平时才能使得数码管内部的发光二极管点亮)

2. 串行数据格式:

        前面提到,一次交互我们需要发送16位数据(2个字节),由上图可以看出,高字节表示着需要操作的寄存器地址,低字节表示写入的数据。对于7219来说,无论load何种状态,数据都会由于CLK的上升沿被移入数据寄存器。在发送完16位数据之后,一定要使得LOAD产生上升沿,否则在下一个CLK到来之后,移位寄存器的数据便会丢失。同时,对于数据格式来说,发送的数据总是MSB。

3.数据和控制寄存器 

        上表列出了14个可寻址的寄存器(8个数据寄存器和5个控制寄存器),控制寄存器由一个8*8的SRAM组成,控制寄存器由译码模式寄存器,亮度控制寄存器,扫描位数限制寄存器,关机控制寄存器,显示测试寄存器(所以LED全亮)组成。通过上述表可以看出,每个寄存器实地址由一位16进制数(4位二进制)组成,这样对应了前面数据格式中高8位中只有4位数据是有效的。

        对于数据寄存器digit0-digit7便对应八位数码管,在该寄存器上写入相应的数据即可点亮对应的数码管。

4. 译码寄存器

        该寄存器可以设定对输入的数据进行BCD译码。注意,由于BCD是通过四位二进制数来表示一位十进制数,因此对于输入的数据,译码寄存器只会将第四位当作BCD码,而不关心其他高位,并将这四位数进行译码得到对应的二进制数。对于第八位数据(D7),这一位是单独设置的,并不参与译码,当数据为高是,小数点自然点亮

5.扫描位数限制寄存器

        该寄存器用来配置显示数码管的个数,即0x00-0x07。

6.亮度设置寄存器 

        数值越大,数码管越亮

二、代码编写

1.初始化工作 

1.定义引脚

        这里的load和cs是相同含义

#define clk GPIO_Pin_0
#define load  GPIO_Pin_1
#define din GPIO_Pin_2

#define LOAD(x) 	GPIO_WriteBit (GPIOB,load,(BitAction)x);
#define CLK(x) 	    GPIO_WriteBit (GPIOB,clk ,(BitAction)x);
#define DIN(x) 		GPIO_WriteBit (GPIOB,din ,(BitAction)x);

2.写一个字节

        原理即为不断翻转CLK电平,使得移位寄存器工作将其读入

void MAX7219_WriteByte (uint8_t byte)
{
	for(int i =0;i<8;i++)
	{
		CLK(0);
		DIN(byte&0x80);
		byte=byte<<1;
		CLK(1);
	}
}

3.写寄存器

        通过此前分析可知,MAX7219为16位传输方式,且先发寄存器地址,再发数据,注意这里先拉低load引脚,等待16位数据传输完毕后,在将load拉高,使得数据锁存。

void MAX7219_WriteReg(uint8_t Reg,uint8_t data)
{
	LOAD(0);
	MAX7219_WriteByte (Reg);
	MAX7219_WriteByte (data);
	LOAD(1);
}

4.数码管显示

        由手册可知,小数点是单独配置的,只需要将最高位置1即可

/**
  * 函    数 显示内容 该函数为在BCD译码下的显示
  * 参    数 uint8_t location:在几位显示 1~8。
  * 参    数 uint8_t num:显示的数字(0~9,Line,E,H,L,P,blank)
  * 参    数 uint8_t dot: 是否需要小数点
  */
void MAX7219_ShowNum(uint8_t location,uint8_t num,uint8_t dot)
{
	if(dot==0)	MAX7219_WriteReg (location,num);
	else	
	{
		num |=0x80;
		MAX7219_WriteReg (location,num);		
	}
}

/**
  * 函    数 MAX7219_Clear 数码管清屏
  */
void MAX7219_Clear(void)
{
	for(int i=1;i<=8;i++)
	{
		MAX7219_ShowNum(i,blank,0);
	}
}

5.引脚初始化

        思路是先把5个控制寄存器配置好。

/**
  * 函    数 初始化MAX7219
  * 参    数 uint8_t BCD:D7~D0控制对于的数码管参与BCD译码。
  * 参    数 uint8_t Intensity:控制数码管的亮度 0~15(0表示熄灭)
  * 参    数 uint8_t DisplayNum: 数码管显示的个数:1~8
  */
void MAX7219_Init (uint8_t BCD,uint8_t Intensity,uint8_t DisplayNum)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init (GPIOB,&GPIO_InitStructure );

	/*先配置五个控制寄存器*/
	MAX7219_WriteReg (0x0c,0x01);//设置为正常模式
	MAX7219_WriteReg (0x09,BCD);//设置BCD译码,8个数码管均使用BCD译码
	MAX7219_WriteReg (0x0a,Intensity);//设置亮度
	
	DisplayNum-=1;
	MAX7219_WriteReg (0x0b,DisplayNum);//8个数码管参与显示
	
	MAX7219_WriteReg (0x0f,0x01);//测试模式,所有数码管全亮
	delay_ms(5000);
	MAX7219_WriteReg (0x0f,0x00);//正常显示模式
	
	MAX7219_Clear();//再清屏
}

2.实际应用——秒表

1.配置定时器,开启中断计时

uint16_t time;
uint16_t count;

void Timer_Init(uint16_t ARR,uint16_t PSC)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
	
	TIM_TimeBaseInitTypeDef Tim4_InitStructure;
	Tim4_InitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
	Tim4_InitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
	Tim4_InitStructure.TIM_Period=ARR;
	Tim4_InitStructure.TIM_Prescaler=PSC;
	Tim4_InitStructure.TIM_RepetitionCounter=0x00;
	TIM_TimeBaseInit(TIM4,&Tim4_InitStructure);
	TIM_ClearFlag(TIM4, TIM_FLAG_Update); //清除由于初始化而置的标志位
	TIM_Cmd(TIM4,ENABLE);
	
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
	
	NVIC_InitTypeDef TIM4_IT_InitStructure;
	TIM4_IT_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
	TIM4_IT_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	TIM4_IT_InitStructure.NVIC_IRQChannelPreemptionPriority=4;
	TIM4_IT_InitStructure.NVIC_IRQChannelSubPriority=4;
	NVIC_Init(&TIM4_IT_InitStructure);
}
void TIM4_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET)
	{
		count ++;
		if(count==100)
		{
			count=0;
			time++;
		}
		TIM_ClearITPendingBit(TIM4,TIM_IT_Update);

	}
}

2.数码管显示

/**
  * 函    数 秒表
  * 参    数 定时器总时间
  */
void MAX7219_Stopwatch(uint16_t time)
{
		uint16_t times=time;
		uint16_t weishu;
		weishu=1+log10(times);
		for(int i=weishu;i>0;i--)
		{
			if(i==2) MAX7219_ShowNum(i,times/(int)(pow(10,i-1)),1);
			else 	 MAX7219_ShowNum(i,times/(int)(pow(10,i-1)),0);
			times=times%(int)pow(10,i-1);
		}
}

三、结果

源码自取

链接:https://pan.baidu.com/s/1y_ins_xLHj9oJFgG9AhzLw?pwd=hcoi 
提取码:hcoi

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

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

相关文章

SSM学习——Spring JDBC

Spring JDBC 概念 Spring的JDBC模块负责数据库资源管理和错误处理&#xff0c;简化了开发人员对数据库的操作。 Spring JDBC通过配置数据源和JDBC模板来配置。 针对数据库操作&#xff0c;Spring框架提供了JdbcTemplate类&#xff0c;它是Spring框架数据抽象层的基础&#…

【学习】渗透测试有哪些重要性

随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显。渗透测试作为网络安全防御的重要手段之一&#xff0c;旨在模拟黑客攻击&#xff0c;发现并修复潜在的安全漏洞&#xff0c;提高网络系统的安全性。本文将介绍渗透测试的概念、重要性、实施步骤及实践案例&#xff0c;…

echarts快速入门

文章目录 一、echarts下载1.1、下载说明1.2、使用说明 二、绘制一个简单图表 一、echarts下载 echarts是百度研发团队开发的一款报表视图JS插件&#xff0c;功能十分强大&#xff0c;可在echart官网下载源码&#xff08;一个echarts.min.js文件&#xff09;进行使用。 1.1、…

Star GAN论文解析

论文地址&#xff1a;https://arxiv.org/pdf/1912.01865v1.pdf https://openaccess.thecvf.com/content_cvpr_2018/papers/Choi_StarGAN_Unified_Generative_CVPR_2018_paper.pdf 源码&#xff1a;stargan项目实战及源码解读-CSDN博客 1. 概述 在传统方法中&#x…

R语言技能 | 不同数据类型的转换

原文链接&#xff1a;R语言技能 | 不同数据类型的转换 本期教程 写在前面 今天是4月份的第一天&#xff0c;再过2天后再一次迎来清明小假期。木鸡大家是否正常放假呢&#xff1f; 我们在使用R语言做数据分析时&#xff0c;会一直对数据进行不同类型的转换&#xff0c;有时候…

揭秘视觉Transformer之谜,TokenTM新法,全面提升模型解释性能

引言&#xff1a;揭示视觉Transformer的解释挑战 在计算机视觉应用中&#xff0c;Transformer模型的流行度迅速上升&#xff0c;但对其内部机制的后置解释仍然是一个未探索的领域。视觉Transformers通过将图像区域表示为转换后的tokens&#xff0c;并通过注意力权重将它们整合起…

一篇文章带你掌握二叉树(附带二叉树基本操作完整代码演示,和两种思路)

【本长内容】 1. 掌握树的基本概念 2. 掌握二叉树概念及特性 3. 掌握二叉树的基本操作 4. 完成二叉树相关的面试题练习 1. 树形结构 1.1 概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是…

RK3568平台 Uart驱动框架

一.TTY子系统 在Linux kernel中&#xff0c;tty驱动不像于spi&#xff0c;iic等那么架构简单&#xff0c;它是一个庞大的系统&#xff0c;它的框架大体如下图一。我们作为普通的驱动开发移植人员&#xff0c;不会从零写tty驱动&#xff0c;一般都是厂家根据现有的tty驱动和自家…

SpringBoot整合MyBatis四种常用的分页方式

目录 方式1 一、准备工作 1. 创建表结构 2. 导入表数据 3. 导入pom.xml依赖 4. 配置application.yml文件 5. 创建公用的实体类 项目结构 2. 创建controller层 3. 创建service层 4. 创建mapper层 5. 创建xml文件 6. 使用postman进行测试&#xff0c;测试结果如下…

基于JAVA+SpringBoot+Vue的前后端分离的大学健康档案管理系统

一、项目背景介绍&#xff1a; 随着社会的发展和科技的进步&#xff0c;人们越来越重视健康问题。大学作为培养人才的摇篮&#xff0c;学生的健康状况直接影响到国家的未来。然而&#xff0c;传统的大学健康档案管理方式存在诸多问题&#xff0c;如信息不透明、数据分散、更新不…

从零开始为香橙派orangepi zero 3移植主线linux——2.kernel + rootfs

从零开始为香橙派orangepi zero 3移植主线linux——2.kernel rootfs 参考文章&#xff1a;一、linux kernel移植二、根文件系统2.1 buildroot构建1.修改toolchain下的交叉编译链2.修改系统配置3.去除内置kernel和uboot编译4.添加rootfs.tar格式的输出 2.2 ubuntu-base移植 三、…

WebAuthn:更好地保护线上敏感信息

1. 引言 2023年知乎博客 WebAuthn: 真正的无密码身份认证 总结得很赞。 在数字时代&#xff0c;密码已成为人们日常生活和在线活动中不可或缺的一部分。尽管互联网已经发展了 20 多年&#xff0c;许多方面都有了巨大的改进&#xff0c;但只有密码&#xff0c;还是 20 年前的用…

【数据结构】--- 探索栈和队列的奥秘

关注小庄 顿顿解馋૮(˶ᵔ ᵕ ᵔ˶)ა &#x1f4a1;个人主页&#xff1a;9ilk &#x1f4a1;专栏&#xff1a;数据结构之旅 上回我们学习了顺序表和链表&#xff0c;今天博主来讲解两个新的数据结构 — 栈和队列 &#xff0c; 请放心食用 文章目录 &#x1f3e0; 栈&#x1…

牛客 2024春招冲刺题单 ONT102 牛牛的果实排序【simpe 要知道如何判断是否是质数 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/975a263e2ae34a669354e0bd64db9e2a 核心 需要牢牢记住下面的代码//判断是否为质数public boolean isPrime(int n){if(n1) return false;if(n2 || n3) return true;if(n%6!1 && n%6!5) return false; /…

C++(语法以及易错点2)

1.内联函数 1.1 概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调 用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 ​int ADD(int a,int b) {return ab; }​ 1.2 特性 1. inline是一种以空间换时间…

spring security6重写登陆验证

spring security的认证流程 2. 从文档上可以看出来&#xff0c;UsernamePasswordAuthenticationFilter和AuthenticationManager是认证的关键步骤&#xff0c;/login传过来的username和password由UsernamePasswordAuthenticationFilter接收处理成UsernamePasswordAuthenticatio…

设计模式总结-组合模式

组合设计模式 模式动机模式定义模式结构组合模式实例与解析实例一&#xff1a;水果盘实例二&#xff1a;文件浏览 更复杂的组合总结 模式动机 对于树形结构&#xff0c;当容器对象&#xff08;如文件夹&#xff09;的某一个方法被调用时&#xff0c;将遍历整个树形结构&#x…

基于SSM的品牌银饰售卖平台(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的品牌银饰售卖平台&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring …

LeetCode - 边积分最高的节点

2374. 边积分最高的节点 这是一个有向图&#xff0c;且每个节点都只有一条出边&#xff0c;指向0的边有1&#xff0c;2&#xff0c;3&#xff0c;4 10&#xff0c; 指向7的有5&#xff0c;6 11. 我们只需要一次遍历就可以解决&#xff0c;先搞一张哈希表&#xff0c;k存节点…

docker安装nacos,单例模式(standalone),使用内置的derby数据库,简易安装

文章目录 前言安装创建文件夹docker指令安装docker指令安装-瘦身版 制作docker-compose.yaml文件查看页面 前言 nacos作为主流的服务发现中心和配置中心&#xff0c;广泛应用于springcloud框架中&#xff0c;现在就让我们一起简易的部署一个单例模式的nacos&#xff0c;版本可…