51单片机编程基础(C语言):LED点阵屏

点阵屏介绍

 

类似于数码管,要用到肉眼视觉效应。扫描,才能把每一个LED都能选中,从而显示我们想要的图形,否则, 只能一次点亮一个LED,

LED使用

51单片机点阵屏电路图:

实际连接顺序如下图:D0~D7控制行。P07~P00控制列

 D0~D7连接到74HC595上。

 

OE:OutputEnable,代表输出使能

 在介绍 74HC595模块时,首先介绍一下J24模块,要是想使用74HC595模块,就必须要将OE端接到GND端,如图所示,因为OE是低电平有效,所以OE需要接到GND端才能控制点阵屏。

接高电平是控制LED模块,

SRCLR:低电平有效,清空数据,把存入的数据清空,硬件一直把它置1,不需要清空。

SERCLK:上电默认为高电平,初始化时设为低电平。每来一个上升沿移一次位,所以我们移完一次要置0,再置1.这样就可以给一次上升沿。

RCLK:同理,上电默认为高电平,初始化时设为低电平。每来一次上升沿,把数据并行输出

可以多片级联,把QH'连到下一个74HC595SER上,就实现的输出16位。

Byte&0x80 即取出Byte的最高位。SER是一位,Byte&0x80是8位数据。所以单片机有这样的操作

如果SER是一位,给的值不是0,就是1,即非0即1.给2566,也是1.

爱心的代码:

#include <REGX52.H>
#include "Delay.h"sbit RCK=P3^5;		//RCLK
sbit SCK=P3^6;		//SRCLK
sbit SER=P3^4;		//SER#define MATRIX_LED_PORT		P0/*** @brief  74HC595写入一个字节* @param  Byte 要写入的字节* @retval 无*/
void _74HC595_WriteByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){SER=Byte&(0x80>>i);    // 取出每一位数据SCK=1;        // 下移一位SCK=0;}RCK=1;        //传输数据RCK=0;
}/*** @brief  LED点阵屏显示一列数据* @param  Column 要选择的列,范围:0~7,0在最左边* @param  Data 选择列显示的数据,高位在上,1为亮,0为灭* @retval 无*/
void MatrixLED_ShowColumn(unsigned char Column,Data)
{_74HC595_WriteByte(Data);MATRIX_LED_PORT=~(0x80>>Column);    // 将数据显示在相应的列上Delay(1);        // 消隐操作MATRIX_LED_PORT=0xFF;
}void main()
{SCK=0;RCK=0;while(1){MatrixLED_ShowColumn(0,0x30);MatrixLED_ShowColumn(1,0x78);MatrixLED_ShowColumn(2,0x7C);MatrixLED_ShowColumn(3,0x3E);MatrixLED_ShowColumn(4,0x7C);MatrixLED_ShowColumn(5,0x78);MatrixLED_ShowColumn(6,0x30);MatrixLED_ShowColumn(7,0x00);}
}

数码管消隐的目的是为了避免动态显示时出现数字不清晰或出现亮阴影的问题。动态显示利用了人眼的暂留效应,通过快速切换数码管的显示状态来实现多位数字的显示。在动态显示过程中,单片机通过IO口控制数码管的段码,先进行位选,然后发送段码,接着进行延时(通常在1到3毫秒之间),最后关闭位选。这个延时的过程就是消隐作用,它确保了当前位选关闭后,下一位选的段码发送时,当前位的段码不会继续显示,从而避免了显示混乱的情况。如果没有进行消隐,下一位的段码在发送时,当前位的段码仍然会显示,导致视觉上的干扰和不清晰。

实现动态:

#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"
// 通过数组来实现动态效果
unsigned char Animation[] = {
0x30,0x78,
0x7C,0x3E,
0x7C,0x78,
0x30,0x00,
0x30,0x78,
0x7C,0x3E,
0x7C,0x78,
0x30,0x00,	
};void main(){unsigned char i,Offset = 0, Count = 0;MatrixLED_Tnit();    // 初始化while(1){for(i = 0; i < 8; i++){MatrixLED_ShowColumn(i, Animation[i + Offset]);    // 带偏移量的显示数据,实现动态效果}Count++;if(Count > 10){    // 防止越界出现乱码Count = 0;Offset++;if(Offset > 8){Offset = 0;}}}
}

 MatrixLED.c

//MatrixLED.c的代码,.h 的代码应该能够轻易写出
#include <REGX52.H>
#include "Delay.h"sbit RCK = P3^5;	//RCLK
sbit SCK = P3^6;	//SRCLK
sbit SER = P3^4;	//SER#define MATRIX_LED_PORT   P0/*** @brief  74HC595写入一个字节* @param  要写入的字节* @retval */
void _74HC595_WriteByte(unsigned char Byte)
{unsigned char i;// 依次取出每一位for(i = 0; i < 8; i++){SER = Byte & (0x80 >> i);SCK = 1;	//上升沿移位SCK = 0;	}	RCK = 1;	//上升沿锁存RCK = 0;
}/*** @brief  LED点阵屏显示一列数据* @param  Column 要显示的列 , 范围:0~7,0在最左边Data选择列要显示的数据,高位在上,1为亮,0为灭* @retval 无*/
void MatrixLED_ShowColumn(unsigned char Column, unsigned char Data)
{_74HC595_WriteByte(Data);MATRIX_LED_PORT = ~(0x80>>Column);Delay(2);MATRIX_LED_PORT = 0xFF;
}
/*** @brief  点阵屏初始化* @param  无* @retval 无*/
void MatrixLED_Tnit()
{SCK = 0;RCK = 0;
}

  MatrixLED.h

#ifndef __MatrixLED_H__
#define __MatrixLED_H__void _74HC595_WriteByte(unsigned char Byte);
void MatrixLED_ShowColumn(unsigned char Column, unsigned char Data);
void MatrixLED_Tnit();#endif

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

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

相关文章

Java中的乐观锁和悲观锁

使用场景及用法 悲观锁 总是假设最坏的情况&#xff0c;每次去拿数据的时候都认为别人会修改&#xff0c;所以每次在拿数据的时候都会上锁&#xff0c;这样别人想拿这个数据就会阻塞直到它拿到锁&#xff08;共享资源每次只给一个线程使用&#xff0c;其它线程阻塞&#xff0c;…

爱快使用VPN

文章目录 一、VPN服务器1. 各种VPN比较2. PPTP服务端配置3. 创建登录账号4. 创建端口映射5. 设置动态域名 二、Windows客户端1. 连接配置2. 不能连接 Internet 配置 一、VPN服务器 1. 各种VPN比较 PPTPIPSECOpenVPN简介微软推出的VPN协议&#xff0c;占用资源少更高级的VPN协…

php基础学习之分支结构和循环结构(不细讲,来对比一下和两大常用高级编程语言(C++/Java)的细微区别以便记忆)

分支结构 常见分支结构 编程语言常见分支结构有&#xff1a; if语句if-else语句if-elseif-else语句switch语句 其中&#xff0c;除了if-elseif-else语句外&#xff0c;另外3中分支语句在php中和C/Java是一模一样的&#xff01; 而if-elseif-else的唯一不同点就在&#xff0c;【…

Linux查看日志的几种方法总结

摘要 Linux系统中查看日志的命令确实多种多样&#xff0c;每个命令都有其特定的用途和优势。常用的命令有&#xff1a;tail、cat、tac、head、echo&#xff0c;grep、less、awk、sed。 下面我会详细解释这些命令在查看日志时的用法和特点&#xff1a; tail命令&#xff1a; ta…

机器学习:ROC曲线笔记

ROC曲线&#xff08;Receiver Operating Characteristic Curve&#xff09;是一种用于评估二分类模型性能的图形化工具&#xff0c;主要用于展示在不同阈值&#xff08;Threshold&#xff09;下模型的真阳性率&#xff08;True Positive Rate&#xff0c;TPR&#xff09;和假阳…

比亚迪面试

HashMap的底层结构 HashMap 在 Java 中是基于散列算法实现的&#xff0c;其底层主要由数组和链表&#xff08;Java 8 后加入了红黑树&#xff09;构成。当一个元素被加入到 HashMap 中时&#xff0c;会使用散列函数计算出该元素的存储索引&#xff0c;然后将元素存储到对应索引…

elasticSearch使用场景深入详解

Elasticsearch 是一个基于 Lucene 的搜索引擎&#xff0c;它提供了一个分布式、支持多租户的全文搜索引擎&#xff0c;具有 HTTP Web 接口和无模式 JSON 文档。Elasticsearch 是 Elastic Stack 的核心&#xff0c;Elastic Stack 包括 Kibana、Beats 和 Logstash 等组件&#xf…

寒假作业:2024/2/14

作业1&#xff1a;编程实现二维数组的杨辉三角 代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) {int n;printf("please enter n:");scanf("%d",&n);int a…

Windows 安装Redis教程

在Windows系统上安装Redis相对简单&#xff0c;主要步骤包括下载、解压、配置和启动Redis服务。以下是一个详细的安装教程&#xff1a; 1. 下载Redis 访问Redis官方网站下载页面&#xff1a;https://redis.io/download选择适用于Windows的安装包&#xff0c;通常有两个版本&a…

蓝桥杯---奇怪的数列

题目描述 从X星截获一份电码&#xff0c;是一些数字&#xff0c;如下&#xff1a; 13 1113 3113 132113 1113122113 .... YY博士经彻夜研究&#xff0c;发现了规律&#xff1a; 第一行的数字随便是什么&#xff0c;以后每一行都是对上一行“读出来” 比如第2行&#xff0c;是对…

springboot开启mybatis二级缓存

我的项目版本号如下&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.8</version><relativePath/> <!-- lookup parent from reposito…

Redis核心技术与实战【学习笔记】 - 31.番外篇:Redis客户端如何与服务器端交换命令和数据

简述 Redis 使用 RESP 协议&#xff08;Redis Serialzation Protocol&#xff09;协议定义了客户端和服务器端交互的命令、数据的编码格式。在 Redis 2.0 版本中&#xff0c;RESP 协议正式称为客户端和服务器端的标准通信协议。从 Redis 2.0 到 Redis 5.0 &#xff0c;RESP 协…

leetcode:55.跳跃游戏

1.解题思路&#xff1a;贪心算法看最大覆盖范围 2.模拟过程&#xff1a; 1.若数组长度等于1&#xff0c;直接返回True 2.循环遍历覆盖范围&#xff0c;选取最大的覆盖范围&#xff1b;若覆盖范围覆盖到了最后一个元素&#xff0c;直接返回true. 3.代码&#xff1a;(贪心无套…

Python struct.pack/struct.unpack 和 encoding/decoding的区别

一直觉得这两对函数有种微妙的对应&#xff0c;两者都涉及到数据的转换&#xff0c;struct.pack/struct.unpack 在二进制数据和 Python 对象之间进行转换&#xff0c;而 encoding/decoding 在文本数据和字节流之间进行转换 下面理一理它们的区别&#xff1a; 目的和用途&#…

ros自定义msg记录

文章目录 自定义msg1. 定义msg文件2. 修改 package.xml3. 修改 CMakeLists.txt4. message_publisher.py5. message_subscriber.py6. 运行 catkin build 测试 自定义msg ros 版本&#xff1a;kinetic 自定义test包的文件结构如下 |-- test | |-- CMakeLists.txt | |-- msg…

spring注解驱动系列--组件注入

一、spring组件注入的几种方式 1、Bean[导入的第三方包里面的组件] 2、包扫描组件标注注解&#xff08;ComponentScans/ComponentScan Controller/Service/Repository/Component&#xff09; 3、Import[快速给容器中导入一个组件] 4、使用Spring提供的 FactoryBean&#xff08…

Hive3.1.2——企业级调优

前言 本篇文章主要整理hive-3.1.2版本的企业调优经验&#xff0c;有误请指出~ 一、性能评估和优化 1.1 Explain查询计划 使用explain命令可以分析查询计划&#xff0c;查看计划中的资源消耗情况&#xff0c;定位潜在的性能问题&#xff0c;并进行相应的优化。 explain执行计划…

收藏:关于块存储,文件存储和对象存储

在B站上看到”【IT老齐465】“这个系列相当不错&#xff0c;每次的视频15分钟左右&#xff0c;出了400多个了&#xff0c;今天偶然看到&#xff0c;地址是&#xff1a;【IT老齐465】块存储、文件存储、对象存储的关系与区别_哔哩哔哩_bilibili 精彩摘录如下&#xff1a;

掘根宝典之C++有关返回对象的说明

返回指向const对象的引用 如果函数要返回&#xff08;通过调用对象的方法或将对象作为参数&#xff09;传递给他的对象&#xff0c;可以通过返回引用来提高其效率。 下面两种实现都是可以的 //这是可以的 AA MAX(const AA&t) { return t; } //这是不可以的 const AA&…

【运维测试】移动测试自动化知识总结第1篇:移动端测试介绍(md文档已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论移动测试相关知识。主要知识点包括&#xff1a;移动测试分类及android环境搭建&#xff0c;adb常用命令&#xff0c;appium环境搭建及使用&#xff0c;pytest框架学习&#xff0c;PO模式&#xff0c;数据驱动&#xff0…