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.rhkb.cn/news/76796.html

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

相关文章

AI 绘画Stable Diffusion 研究(三)sd模型种类介绍及安装使用详解

本文使用工具&#xff0c;作者:秋葉aaaki 免责声明: 工具免费提供 无任何盈利目的 大家好&#xff0c;我是风雨无阻。 今天为大家带来的是 AI 绘画Stable Diffusion 研究&#xff08;三&#xff09;sd模型种类介绍及安装使用详解。 目前&#xff0c;AI 绘画Stable Diffusion的…

vue+neo4j(neo4j desktop安装和使用)

vueneo4j&#xff08;neo4j desktop安装和使用&#xff09; 本文目录 vueneo4j&#xff08;neo4j desktop安装和使用&#xff09;官网下载安装基本使用创建项目新增数据库连接数据库 使用cypher构建简单知识图谱创建节点创建关系删除节点及关系查询节点和关系 数据导出为json文…

SpringCloudAlibaba之Sentinel(一)流控篇

前言&#xff1a; 为什么使用Sentinel&#xff0c;这是一个高可用组件&#xff0c;为了使我们的微服务高可用而生 我们的服务会因为什么被打垮&#xff1f; 一&#xff0c;流量激增 缓存未预热&#xff0c;线程池被占满 &#xff0c;无法响应 二&#xff0c;被其他服务拖…

LeetCode--剑指Offer75(3)

目录 题目描述&#xff1a;剑指 Offer 20. 表示数值的字符串&#xff08;中等&#xff09;题目接口解题思路什么是有限状态自动机&#xff1f;如何使用&#xff1f; 代码 PS: 题目描述&#xff1a;剑指 Offer 20. 表示数值的字符串&#xff08;中等&#xff09; 请实现一个函数…

Windows7+内网, 安装高版本nodejs,使用vite+vue3+typescript开发项目

前言&#xff1a;vite只支持高版本的nodejs&#xff0c;而高版本的nodejs只支持windows8及以上&#xff0c;且vite还对浏览器版本有兼容问题。以下均为vite官网截图 1、安装好低版本的nodejs win7系统建议安装13.及以下&#xff0c;我的是12.12.0这个版本。nodejs低版本官网下载…

【前端】搭建Vue3框架

目录 一、搭建准备二、node.js安装1、下载并安装2、配置默认安装目录和缓存日志目录①、创建默认安装目录和缓存日志目录&#xff08;我的node.js目录在D盘&#xff0c;所以直接在node.js文件夹下创建&#xff09;②、执行命令&#xff0c;配置默认安装目录和缓存日志目录到刚才…

Java ThreadPoolExecutor,Callable,Future,FutureTask 详解

目 录 一、ThreadPoolExecutor类讲解 1、线程池状态 五种状态 2、ThreadPoolExecutor构造函数 2.1&#xff09;线程池工作原理 2.2&#xff09;KeepAliveTime 2.3&#xff09;workQueue 任务队列 2.4&#xff09;threadFactory 2.5&#xff09;handler 拒绝策略 3、常…

【JMeter】 使用Synchronizing Timer设置请求集合点,实现绝对并发

目录 布局设置说明 Number of Simulated Users to Group Timeout in milliseconds 使用时需要注意的点 集合点作用域 实际运行 资料获取方法 布局设置说明 参数说明&#xff1a; Number of Simulated Users to Group 每次释放的线程数量。如果设置为0&#xff0c;等同…

【css】使用float实现水平导航栏

该实例使用float 浮动实现元素浮动在水平方向&#xff0c;从而实现水平导航栏效果。 overflow: hidden&#xff1a;当不给父级元素设置高度的时候&#xff0c;其内部元素浮动后会导致下面的元素顶上去&#xff0c;这是因为子元素浮动后&#xff0c;子元素脱离标准流&#xff0…

深度学习——注意力机制、自注意力机制

什么是注意力机制&#xff1f; 1.注意力机制的概念&#xff1a; 我们在听到一句话的时候&#xff0c;会不自觉的捕获关键信息&#xff0c;这种能力叫做注意力。 比如&#xff1a;“我吃了100个包子” 有的人会注意“我”&#xff0c;有的人会注意“100个”。 那么对于机器来说…

C语言:相交链表

Lei宝啊&#xff1a;个人主页 愿美好与我们不期而遇 题目&#xff1a; 描述 给你两个单链表的头节点 headA和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 接口 struct ListNode *getIntersectionNode (str…

与“云”共舞,联想凌拓的新科技与新突破

伴随着数字经济的高速发展&#xff0c;IT信息技术在数字中国建设中起到的驱动和支撑作用也愈发凸显。特别是2023年人工智能和ChatGPT在全球的持续火爆&#xff0c;更是为整个IT产业注入了澎湃动力。那么面对日新月异的IT信息技术&#xff0c;再结合疫情之后截然不同的经济环境和…

springboot+vue网红酒店客房预定系统的设计与实现_ui9bt

随着计算机技术发展&#xff0c;计算机系统的应用已延伸到社会的各个领域&#xff0c;大量基于网络的广泛应用给生活带来了十分的便利。所以把网红酒店预定管理与现在网络相结合&#xff0c;利用计算机搭建网红酒店预定系统&#xff0c;实现网红酒店预定的信息化。则对于进一步…

当你软件测试遇上加密接口,是不是就不能测了?

相信大家在工作中做接口测试的时候&#xff0c;肯定会遇到一个场景&#xff0c;那就是你们的软件&#xff0c;密码是加密存储的。 那么这样的话&#xff0c;我们在执行接口的时候&#xff0c;对于密码的处理就开始头疼了。 所以&#xff0c;本文将使用jmeter这款java开源的接…

Pytorch Tutorial【Chapter 3. Simple Neural Network】

Pytorch Tutorial【Chapter 3. Simple Neural Network】 文章目录 Pytorch Tutorial【Chapter 3. Simple Neural Network】Chapter 3. Simple Neural Network3.1 Train Neural Network Procedure训练神经网络流程3.2 Build Neural Network Procedure 搭建神经网络3.3 Use Loss …

海外应用商店优化实用指南之关键词

和SEO一样&#xff0c;关键词是ASO中的一个重要因素。就像应用程序标题一样&#xff0c;在Apple App Store和Google Play中处理应用程序关键字的方式也有所不同。 关键词研究。 对于Apple&#xff0c;我们的所有关键词只能获得100个字符&#xff0c;Google Play没有特定的关键…

【新版系统架构补充】-传输介质、子网划分

传输介质 双绞线&#xff1a;无屏蔽双绞线UTP和屏蔽双绞线STP&#xff0c;传输距离在100m内 网线安装标准&#xff1a; 光纤&#xff1a;由纤芯和包层组成&#xff0c;分多模光纤MMF、单模光纤SMF 无线信道&#xff1a;分为无线电波和红外光波 通信方式和交换方式 单工…

做测试8年,33岁前只想追求大厂高薪,今年只求稳定收入

疫情3年&#xff0c;每一个行业的危机&#xff0c;每一个企业的倒下&#xff0c;背后都是无数人的降薪、降职和失业。这也暴露了人生的残酷真相&#xff1a;人活一辈子&#xff0c;总有“丰年”和“荒年” 优秀的测试既过得了丰年&#xff0c;也受得住荒年 一个测试宝妈&…

数据结构: 线性表(带头双向循环链表实现)

之前一章学习了单链表的相关操作, 但是单链表的限制却很多, 比如不能倒序扫描链表, 解决方法是在数据结构上附加一个域, 使它包含指向前一个单元的指针即可. 那么怎么定义数据结构呢? 首先我们先了解以下链表的分类 1. 链表的分类 链表的结构非常多样, 以下情况组合起来就有…