51单片机学习--LED点阵屏显示图形动画

在这里插入图片描述
为了通用性考虑,需要把用到的几个口用特殊位声明来重新命名,由于RCLK在头文件中已有定义,所以这里把P3^5声明成RCK吧。。这样的做法可以提高可读性

sbit RCK = P3^5;  //RCLK
sbit SCK = P3^6;  //SRCLK
sbit SER = P3^4;

在这里插入图片描述



接下来编写74HC595的输入函数
在这里插入图片描述

void _74HC595_WriteByte(unsigned char Byte)
{unsigned char i;for(int i = 0; i < 8; i ++) {SER = Byte & (0x80 >> i); //一个数据赋到一位上,结果非0即1,相当于取Byte的第i + 1位赋给SERSCK = 1; //移位1次SCK = 0; //手动恢复}}void main()
{SCK = 0; //移位初始是0while(1){}
}

执行完八次循环后数据就会存到移位寄存器里面了,接下来要输出只需要给RCLK一个高电平即可
给个完整代码

#include <REGX52.H>sbit RCK = P3^5;
sbit SCK = P3^6;
sbit SER = P3^4;void _74HC595_WriteByte(unsigned char Byte)
{unsigned char i;for(i = 0; i < 8; i ++) {SER = Byte & (0x80 >> i); //一个数据赋到一位上,结果非0即1,相当于取Byte的第i + 1位赋给SERSCK = 1; //移位1次SCK = 0; //手动恢复}RCK = 1; //输出RCK = 0; //手动恢复
}void main()
{P0 = 0;SCK = 0; //移位初始是0RCK = 0; //锁存初始是0_74HC595_WriteByte(0xf0);while(1){}
}

输入了0xf0即为1111 0000 ,而P0全部置0,所以呈现出一半一半的现象!
效果
接下来需要更具体地来控制LED点阵屏:D0~D7来源于移位寄存器,只需要像之前控制矩阵键盘一样通过扫描每行或者扫描每列的方式来编写即可
在这里插入图片描述

void MatrixLED_ShowColumn(unsigned char Column, Data) 
{_74HC595_WriteByte(Data); //依次扫描每一列P0 = ~(0x80 >> Column); //打开第Column列}

Data对应D7~D0 ,Column是要打开的某一列(0~7列)
比如在main中执行函数MatrixLED_ShowColumn(0, 0xAA);
0xAA = 1010 1010 ,列Column = 0;效果如下:
在这里插入图片描述



接下来实现一下在LED点阵屏显示一个爱心图形
先在Excel画好,算出它的Data
在这里插入图片描述

#include <REGX52.H>
#include "Delay.h"sbit RCK = P3^5;
sbit SCK = P3^6;
sbit SER = P3^4;#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); //一个数据赋到一位上,结果非0即1,相当于取Byte的第i + 1位赋给SERSCK = 1; //移位1次SCK = 0; //手动恢复}RCK = 1; //输出RCK = 0; //手动恢复
}/*** @ brief LED点阵屏亮灯显示一列数据* @ param Column 列数 0~7 从左往右* @ param Data 选择列显示的数据 高位在上,1亮,0灭* @ retval 无*/
void MatrixLED_ShowColumn(unsigned char Column, Data) 
{_74HC595_WriteByte(Data);//依次扫描每一列MATRIX_LED_PORT = ~(0x80 >> Column); //打开第Column列 ,位选Delay(1);MATRIX_LED_PORT = 0xFF; //位清零
}void main()
{SCK = 0; //移位初始是0RCK = 0; //锁存初始是0while(1){MatrixLED_ShowColumn(0, 0x78);MatrixLED_ShowColumn(1, 0x84);MatrixLED_ShowColumn(2, 0x42);MatrixLED_ShowColumn(3, 0x21);MatrixLED_ShowColumn(4, 0x21);MatrixLED_ShowColumn(5, 0x42);MatrixLED_ShowColumn(6, 0x84);MatrixLED_ShowColumn(7, 0x78);}
}

在这里插入图片描述
最后把main里面开始的两句写成MatrixLED的初始化函数,一起封装成MatrixLED模块,以下是封装好的MareixLED.c 文件:要注意位声明和重定义都需要写在这个文件里面,同时也需要调用Delay模块

#include <REGX52.H>
#include "Delay.h"sbit RCK = P3^5;
sbit SCK = P3^6;
sbit SER = P3^4;#define MATRIX_LED_PORT   P0/*** @ brief 点阵屏初始化* @ param 无* @ retval 无*/
void MatrixLED_Init()
{SCK = 0; //移位初始是0RCK = 0; //锁存初始是0
}/*** @ brief 74HC595写入一个字节* @ param 要写的字节* @ retval 无*/
void _74HC595_WriteByte(unsigned char Byte)
{unsigned char i;for(i = 0; i < 8; i ++) {SER = Byte & (0x80 >> i); //一个数据赋到一位上,结果非0即1,相当于取Byte的第i + 1位赋给SERSCK = 1; //移位1次SCK = 0; //手动恢复}RCK = 1; //输出RCK = 0; //手动恢复
}/*** @ brief LED点阵屏亮灯显示一列数据* @ param Column 列数 0~7 从左往右* @ param Data 选择列显示的数据 高位在上,1亮,0灭* @ retval 无*/
void MatrixLED_ShowColumn(unsigned char Column, Data) 
{_74HC595_WriteByte(Data);//依次扫描每一列MATRIX_LED_PORT = ~(0x80 >> Column); //打开第Column列 ,位选Delay(1);MATRIX_LED_PORT = 0xFF; //位清零
}

静态图像显示搞定了,接下来实现简单的动画,一个流动字幕!利用文字取模软件来得到Data并存到main的数组里

#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"unsigned Animation[] = {
/*--  调入了一幅图像:这是您新建的图像  --*/
/*--  宽度x高度=32x8  --*/
0x00,0xFF,0x40,0x20,0x10,0x08,0x04,0x02,0xFF,0x00,0x00,0x9F,0x00,0x00,0x3C,0x42,
0x81,0x81,0x81,0x42,0x00,0x00,0x00,0xFF,0x91,0x91,0x91,0x91,0x81,0x00,0x00,0x00,
};void main()
{MatrixLED_Init();while(1){MatrixLED_ShowColumn(0, Animation[0]);MatrixLED_ShowColumn(1, Animation[1]);MatrixLED_ShowColumn(2, Animation[2]);MatrixLED_ShowColumn(3, Animation[3]);MatrixLED_ShowColumn(4, Animation[4]);MatrixLED_ShowColumn(5, Animation[5]);MatrixLED_ShowColumn(6, Animation[6]);MatrixLED_ShowColumn(7, Animation[7]);}
}

在这里插入图片描述

这样做可以显示出第一帧的图像,只要每次都偏移8位,就能实现一张张图片的逐帧动画,但这里我就写个简单的每次偏移一位的流动动画

#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"unsigned Animation[] = {
/*--  调入了一幅图像:这是您新建的图像  --*/
/*--  宽度x高度=32x8  --*/
0x00,0xFF,0x40,0x20,0x10,0x08,0x04,0x02,0xFF,0x00,0x00,0x9F,0x00,0x00,0x3C,0x42,
0x81,0x81,0x81,0x42,0x00,0x00,0x00,0xFF,0x91,0x91,0x91,0x91,0x81,0x00,0x00,0x00,
};void main()
{unsigned char i = 0, offset = 3, Count = 0;MatrixLED_Init();while(1){for( i = 0; i < 8; i ++) {MatrixLED_ShowColumn(i, Animation[i + offset]);}Count ++;if(Count > 5) Count = 0, offset ++; //一帧图像扫描(停留)五遍以后再偏移一位if(offset > (32 - 8)) {offset = 0;}; //到末尾重复播放}
}

这里设定的Count的判断条件越大,一帧的画面就停留越久,流动字幕速度越慢
Offset是偏移量

当动画素材比较多时,数组Animation会比较占内存,此时可以在数组名前加上关键字code ,这样就能把这些数据放到内存更大的flash里面,但是要注意如果加上关键字code,那么数组里的元素就不能更改了
在这里插入图片描述

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

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

相关文章

dflow工作流使用1——架构和基本概念

对于容器技术、工作流等概念完全不懂的情况下理解dflow的工作方式会很吃力&#xff0c;这里记录一下个人理解。 dflow涉及的基本概念 工作流的概念很好理解&#xff0c;即某个项目可以分为多个步骤&#xff0c;每个步骤可以实现独立运行&#xff0c;只保留输入输出接口&#x…

【方法】Excel表格如何拆分数据?

当需要把多个数据逐个填到Excel单元格的时候&#xff0c;我们可以利用Excel的数据拆分功能&#xff0c;可以节省不少时间。 小编以下面的数据为例&#xff0c;看看如何进行数据拆分。 首先&#xff0c;要选择数字所在的单元格&#xff0c;然后依次点击菜单栏中的“数据”>…

Spring中的事务

一、为什么需要事务&#xff1f; 事务定义 将一组操作封装成一个执行单元&#xff08;封装到一起&#xff09;&#xff0c;要么全部成功&#xff0c;要么全部失败。 为什么要用事务&#xff1f; 比如转账分为两个操作&#xff1a; 第一步操作&#xff1a; A 账户 -100 元…

jsqlparser 安装和使用

jsqlparser是sql语句解析工具&#xff0c;可以解析sql并分析语法。 安装 <dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>4.3</version> </dependency>使用 String s …

【数据结构】快速排序

快速排序是一种高效的排序算法&#xff0c;其基本思想是分治法。它将一个大问题分解成若干个小问题进行解决&#xff0c;最后将这些解合并得到最终结果。 快速排序的主要思路如下&#xff1a; 选择一个基准元素&#xff1a;从待排序的数组中选择一个元素作为基准&#xff08;…

Spring指定bean在哪个应用加载

1.背景 某项目,spring架构,有2个不同的WebAppApplication入口,大部分service类共用,小部分类有区别,只需要在一个应用中加载,不需要在另一个应用中加载. 2.实现代码 自定义限制注解 package mis.shared.annotation;import java.lang.annotation.ElementType; import java.lan…

springboot+maven插件调用mybatis generator自动生成对应的mybatis.xml文件和java类

mybatis最繁琐的事就是sql语句和实体类&#xff0c;sql语句写在java文件里很难看&#xff0c;字段多的表一开始写感觉阻力很大&#xff0c;没有耐心&#xff0c;自动生成便成了最称心的做法。自动生成xml文件&#xff0c;dao接口&#xff0c;实体类&#xff0c;虽一直感觉不太优…

skywalking全链路追踪

文章目录 一、介绍二、全链路追踪1. 测试1 - 正常请求2. 测试2 - 异常请求 三、过滤非业务请求链路1. 链路忽略插件2. 配置3. 测试 一、介绍 在上一篇文章skywalking安装教程中我们介绍了skywalking的作用以及如何将其集成到我们的微服务项目中。本篇文章我们介绍在微服务架构…

router 跳转打开新窗口

let url router.resolve({name: screen, })?.hrefwindow.open(url, _black)注意&#xff1a;新窗口无法全屏 参考链接&#xff1a;https://stackoverflow.com/questions/29281986/run-a-website-in-fullscreen-mode/30970886#30970886

数据库索引失效的情况

1.对添加了索引的字段进行函数运算 2.如果是字符串类型的字段&#xff0c;如果不加单引号也会导致索引失效 3.如果最索引字段使用模糊查询&#xff0c;如果是头部模糊索引将失效&#xff0c;如果是尾部模糊索引则正常 4.如果使用or分割符&#xff0c;如果or前面的条件中的列有…

基于Yolov2深度学习网络的车辆检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1. 卷积神经网络&#xff08;CNN&#xff09; 4.2. YOLOv2 网络 4.3. 实现过程 4.4. 应用领域 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心…

使用css和js给按钮添加微交互的几种方式

使用css和js给按钮添加微交互的几种方式 在现实世界中&#xff0c;当我们轻弹或按下某些东西时&#xff0c;它们会发出咔嗒声&#xff0c;例如电灯开关。有些东西会亮起或发出蜂鸣声&#xff0c;这些响应都是“微交互”&#xff0c;让我们知道我们何时成功完成了某件事。在本文…

【Winform学习笔记(五)】引用自定义控件库(dll文件)

引用自定义控件库dll文件 前言正文1、生成dll文件2、选择工具箱项3、选择需要导入的dll文件4、确定需要导入的控件5、导入及使用 前言 在本文中主要介绍 如何引用自定义控件库(dll文件)。 正文 1、生成dll文件 通过生成解决方案 或 重新生成解决方案 生成 dll 文件 生成的…

如何发布自己的npm包

发布一个简单的npm包 首先创建一个文件夹&#xff08;唯一的命名&#xff09;创建package.json包&#xff0c;输出npm init&#xff0c;一直回车就好。创建index.js文件&#xff0c;向外暴露方法。 将包上传或更新到 npm 执行登录命令&#xff1a;npm login 登录npm官网&…

Java中的SPI机制与扫描class原理

文章目录 前言ClassLoaderJAVA SPI机制Spring SPI机制示例原理 如何加载jar包里的class 前言 Java的SPI机制与Spring中的SPI机制是如何实现的&#xff1f; ClassLoader 这里涉及到了class Loader的机制&#xff0c;有些复杂&#xff0c;jdk中提供默认3个class Loader&#x…

AP AUTOSAR在软件定义汽车生态系统中的角色

AP AUTOSAR在软件定义汽车生态系统中的角色 AP AUTOSAR是AUTOSAR(汽车开放系统架构)的最新版本之一,它是一种面向服务的软件平台,旨在满足未来汽车电子系统的需求,特别是高性能计算、高带宽通信、软件无线更新(OTA)等方面。 AP AUTOSAR在软件定义汽车生态系统中扮演着…

docker 部署mysql 5.6集群

docker搭建mysql的集群&#xff08;一主双从&#xff09; 1.拉取镜像 docker pull mysql:5.6 2.启动master容器 docker run -it -d --name mysql_master -p 3306:3306 --ip 192.168.162.100 \ -v /data/mysql_master/mysql:/var/lib/mysql \ -v /data/mysql_master/conf.d…

【无标题】云原生在工业互联网的落地及好处!

什么是工业互联网&#xff1f; 工业互联网&#xff08;Industrial Internet&#xff09;是新一代信息通信技术与工业经济深度融合的新型基础设施、应用模式和工业生态&#xff0c;通过对人、机、物、系统等的全面连接&#xff0c;构建起覆盖全产业链、全价值链的全新制造和服务…

Scrum是什么意思,Scrum敏捷项目管理工具有哪些?

一、什么是Scrum&#xff1f; Scrum是一种敏捷项目管理方法&#xff0c;旨在帮助团队高效地开展软件开发和项目管理工作。 Scrum强调迭代和增量开发&#xff0c;通过将项目分解为多个短期的开发周期&#xff08;称为Sprint&#xff09;&#xff0c;团队可以更好地应对需求变…

聊聊混合动力汽车和纯电骑车的优势和劣势

混合动力汽车和纯电动骑车是两种不同的交通工具&#xff0c;它们都有各自的优势和劣势。本文将分别探讨混合动力汽车和纯电动骑车的优势和劣势&#xff0c;并为文章提供三个备选的好听的标题。 混合动力汽车是一种结合了内燃机和电动机的汽车&#xff0c;它可以同时利用燃油和电…