51单片机入门_江协科技_21~22_OB记录的笔记

21. LED点阵屏

  • 21.1. LED点阵屏介绍
    •LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等
    •LED点阵屏分类
    按颜色:单色、双色、全彩
    按像素:88、1616等(大规模的LED点阵通常由很多个小点阵拼接而成)
    在这里插入图片描述

  • 21.2. 显示原理
    在这里插入图片描述

    •LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已
    •LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同
    •LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示

21.3. 74HC595
•74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于IO口扩展。
在这里插入图片描述

  • 21.4. 开发板引脚对应关系
    在这里插入图片描述

  • 21.5. C51的sfr、sbit
    •sfr(special function register):特殊功能寄存器声明
    例:sfr P0 = 0x80;
    声明P0口寄存器,物理地址为0x80

    •sbit(special bit):特殊位声明
    例:sbit P0_1 = 0x81; 或 sbit P0_1 = P0^1;
    声明P0寄存器的第1位

    •可位寻址/不可位寻址:在单片机系统中,操作任意寄存器或者某一位的数据时,必须给出其物理地址,又因为一个寄存器里有8位,所以位的数量是寄存器数量的8倍,单片机无法对所有位进行编码,故每8个寄存器中,只有一个是可以位寻址的。对不可位寻址的寄存器,若要只操作其中一位而不影响其它位时,可用“&=”(一般用于对某一位进行清零)、“|=”(一般用于对某一位进行置1)、“^=”(对某一位进行取反)的方法进行位操作。

22. LED点阵屏显示图形&动画

  • 22.1. 为防止和之前数码管类似的动态显示扫描过程中的重影和串位问题,每次段选位选中加入延时和位清零;

    • 段选+位选 (加入:延时+位清零) 段选+位选 (加入:延时+位清零)
    • 以上逻辑实现扫描显示;
  • 22.2. 基于上述逻辑,8x8点阵屏测试程序显示一个对角线的LED程序为:

#include <REGX52.h>
#include "delay_xms.h"sbit RCK=P3^5; //RCLK 串行寄存器时钟,上升沿有效 SH_CP
sbit SCK=P3^6; //SRCLK 串行输入时钟,上升沿有效 ST_CP
sbit SER=P3^4; //SER 串行数据输入 DSvoid _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;
}void MatrixLED_ShowColumn(unsigned char Column,Data) //Column是列数据,Data数据
{_74HC595_WriteByte(Data);//数据存入DataP0=~(0x80>>Column);delay_xms(1); //延时P0=0xff; //位清零}void main()
{SCK=0;RCK=0;while(1){MatrixLED_ShowColumn(0,0x80);MatrixLED_ShowColumn(1,0x40);MatrixLED_ShowColumn(2,0x20);MatrixLED_ShowColumn(3,0x10);MatrixLED_ShowColumn(4,0x08);MatrixLED_ShowColumn(5,0x04);MatrixLED_ShowColumn(6,0x02);MatrixLED_ShowColumn(7,0x01);}}
 Proteus仿真测试结果如下:

在这里插入图片描述

  • 22.3. 点阵屏显示笑脸
    作者用excel先将笑脸图形用excel填充,再手动计算出16位进制数值:
    在这里插入图片描述

    示例程序为:

	 #include <REGX52.h>
#include "delay_xms.h"sbit RCK=P3^5; //RCLK 串行寄存器时钟,上升沿有效 SH_CP
sbit SCK=P3^6; //SRCLK 串行输入时钟,上升沿有效 ST_CP
sbit SER=P3^4; //SER 串行数据输入 DSvoid _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;
}void MatrixLED_ShowColumn(unsigned char Column,Data) //Column是列数据,Data数据
{_74HC595_WriteByte(Data);//数据存入DataP0=~(0x80>>Column);delay_xms(1); //延时P0=0xff; //位清零}void main()
{SCK=0;RCK=0;while(1){MatrixLED_ShowColumn(0,0x3c);MatrixLED_ShowColumn(1,0x42);MatrixLED_ShowColumn(2,0xa9);MatrixLED_ShowColumn(3,0x85);MatrixLED_ShowColumn(4,0x85);MatrixLED_ShowColumn(5,0xa9);MatrixLED_ShowColumn(6,0x42);MatrixLED_ShowColumn(7,0x3c);}}

proteus测试没问题;

在这里插入图片描述

  • 22.4. 为方便动画制作,需要用到取模软件简化动画制作过程,参考如下链接CSDN中的博文学习比较方便:
    https://blog.csdn.net/sinat_41752325/article/details/134923671?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171230294316800226592558%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=171230294316800226592558&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-134923671-null-null.142v100pc_search_result_base4&utm_term=8x8%E7%82%B9%E9%98%B5%E5%8F%96%E5%AD%97%E6%A8%A1%E8%BD%AF%E4%BB%B6&spm=1018.2226.3001.4187

  • 22.5. 示例动画程序显示Hello!如下;
    模块化 Matrix_LED.c程序如下

#include <REGX52.h>
#include "delay_xms.h"
#define MATRIX_LED_PORT P0sbit RCK=P3^5; //RCLK 串行寄存器时钟,上升沿有效 SH_CP
sbit SCK=P3^6; //SRCLK 串行输入时钟,上升沿有效 ST_CP
sbit SER=P3^4; //SER 串行数据输入 DS/*** @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 点阵屏初始化* @param 无* @retval 无 */void MatrixLED_Init()
{SCK=0;RCK=0;
}/*** @brief LED点阵屏显示一列数据* @param Column 要选择的列,范围:0~7,0在最左边* @param Data 选择列显示的数据,高位在上,1为亮,0为灭* @retval 无*/void MatrixLED_ShowColumn(unsigned char Column,Data) //Column是列数据,Data数据
{_74HC595_WriteByte(Data);//数据存入DataMATRIX_LED_PORT=~(0x80>>Column);delay_xms(1); //延时MATRIX_LED_PORT=0xff; //位清零}
	模块化 Matrix_LED.h程序如下
#ifndef _MATRIX_LED_H_ 
#define _MATRIX_LED_H_  void MatrixLED_ShowColumn(unsigned char Column,Data);
void MatrixLED_Init();#endif
主程序如下:
	#include <REGX52.h>
#include "delay_xms.h"
#include "Matrix_LED.h"unsigned char Animation[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x0E,0x15,0x15,0x0C,0x00,0x7E,0x01,0x02,0x00,0x7E,0x01,0x02,0x00,0x06,0x09,0x09,0x06,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};//定义数组存取所有的Data,前后0x00用于滚动显示的连贯性;void main()
{unsigned char i,offset=0,Count=0;//offset用于位移量控制,Countvoid MatrixLED_Init();while(1){for(i=0;i<8;i++){//delay_xms(2);	//用于让显示速度变慢的测试		MatrixLED_ShowColumn(i,Animation[i+offset]);}Count++;if(Count>10){Count=0;offset++;if(offset>32){offset=0;}}}
}

Proteus测试结果正确:
在这里插入图片描述

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

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

相关文章

Leetcode 64. 最小路径和

心路历程&#xff1a; 第一反应像是一个回溯问题&#xff0c;但是看到题目中要求最值&#xff0c;大概率是一道DP问题。并且这里面的递推关系也很明显。 这里面边界条件可以有多种处理方法。 解法&#xff1a;动态规划 class Solution:def minPathSum(self, grid: List[List…

六、企业级架构缓存篇之memcached

一、memcached概述 1、网站架构优化流程&#xff1a; LNMP架构中网站应用访问流程&#xff1a; 浏览器 (app) → web 服务器 → 后端服务 (php) → 数据库 (mysql) 访问流程越多&#xff0c;访问速度越慢&#xff0c;出现问题的几率也越大。 网站访问流程优化思路&#xff1…

【机器学习】如何通过群体智慧解决机器学习的挑战“

机器学习的发展日新月异&#xff0c;但其成功实施的关键之一仍然是获取高质量的、标注良好的数据集。在这篇文章中&#xff0c;我们将探讨如何通过群体智慧来构建和改善机器学习的数据集&#xff0c;尤其是通过reCAPTCHA和带有目的的游戏&#xff08;Games with a Purpose, GWA…

比nestjs更优雅的ts控制反转策略-依赖查找

一、Cabloy5.0内测预告 Cabloy5.0采用TS对整个全栈框架进行了脱胎换骨般的大重构&#xff0c;并且提供了更加优雅的ts控制反转策略&#xff0c;让我们的业务开发更加快捷顺畅 1. 新旧技术栈对比&#xff1a; 后端前端旧版js、egg2.0、mysqljs、vue2、framework7新版ts、egg3…

Web大并发集群部署之集群介绍

一、传统web访问模型 传统web访问模型完成一次请求的步骤 1&#xff09;用户发起请求 2&#xff09;服务器接受请求 3&#xff09;服务器处理请求&#xff08;压力最大&#xff09; 4&#xff09;服务器响应请求 传统模型缺点 单点故障&#xff1b; 单台服务器资源有限&…

Prometheus+grafana环境搭建MongoDB(docker+二进制两种方式安装)(五)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前四篇mongodb的exporter坑也挺多总结一下各种安装方式&#xff0c;方便后续考古。 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabb…

【关于窗口移动求和的两种计算方法】

窗口移动计算方法 例子方法1方法2运行结果: 例子 在很多算法中都会涉及到窗口滑动&#xff0c;比如基于新息序列更新的自适应卡尔曼滤波器算法中便会使用到。 已知一个数列&#xff1a;OCV [1;2;3;4;5;6;7;8;9;10;11;12;13;14;15]&#xff0c;定义窗口长度为5&#xff0c;每次…

小林coding图解计算机网络|TCP篇06|如何理解TCP面向字节流协议、为什么UDP是面向报文的协议、如何解决TCP的粘包问题?

小林coding网站通道&#xff1a;入口 本篇文章摘抄应付面试的重点内容&#xff0c;详细内容还请移步&#xff1a;小林coding网站通道 文章目录 如何理解UDP 是面向报文的协议如何理解字节流如何解决粘包固定长度的消息 特殊字符作为边界自定义消息结构 如何理解UDP 是面向报文的…

Hadoop-入门

资料来源&#xff1a;尚硅谷-Hadoop 一、Hadoop 概述 1.1 Hadoop 是什么 1&#xff09;Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 2&#xff09;主要解决&#xff1a;海量数据的存储和海量数据的分析计算问题。 3&#xff09;广义上来说&#xff0c;Hadoop…

深入浅出 -- 系统架构之分布式常见理论概念

随着计算机科学和互联网的发展&#xff0c;分布式场景变得越来越常见&#xff0c;能否处理好分布式场景下的问题&#xff0c;成为衡量一个工程师是否合格的标准。本文我们介绍下分布式系统相关的理论知识&#xff0c;这些理论是我们理解和处理分布式问题的基础。 CAP理论 CAP…

深入理解选择排序:算法原理、Java实现与性能优劣

算法学习的重要性 在程序员的世界里&#xff0c;算法就如同一座桥梁&#xff0c;连接着问题与解决方案&#xff0c;是实现优秀程序的关键。 掌握算法&#xff0c;就能够在面对各种问题时&#xff0c;找到最合适的解决方法&#xff0c;以最少的时间和空间&#xff0c;实现最优的…

Android数据存储技术

一、文件存储 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"android:layout_width"match_parent"android:layout_height"match_parent" ><EditTextandroid:id&qu…

mac 切换 jdk

查看 mac 上都有哪些版本 /usr/libexec/java_home -V看准版本切换 按前缀切换 比如 export JAVA_HOME/usr/libexec/java_home -v 1.8这样会随机一个 1.8 的 如果想再确定一个比如 openjdk export JAVA_HOME/usr/libexec/java_home -v 1.8.0_292这个方式是临时的&#xff0c…

【力扣刷题日记】1421.净现值查询

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1421.净现值查询 表&#xff1a;NPV 列名类型idintyearintnpvint (id, year) 是该表主键(具有唯一值的列的…

用友NC Cloud importhttpscer 任意文件上传漏洞复现

0x01 产品简介 用友 NC Cloud 是一种商业级的企业资源规划云平台,为企业提供全面的管理解决方案,包括财务管理、采购管理、销售管理、人力资源管理等功能,基于云原生架构,深度应用新一代数字技术,打造开放、 互联、融合、智能的一体化云平台,支持公有云、混合云、专属云…

AI绘画:实例-利用Stable Diffusion ComfyUI实现多图连接:区域化提示词与条件设置

在Stable Diffusion ComfyUI中&#xff0c;有一种高级技巧可以让用户通过细致的区域化提示词来控制图像的不同部分&#xff0c;从而实现多图连接的效果。这种方法允许艺术家在同一画布上展现多个场景&#xff0c;创造出富有层次和故事性的图像。以下是实现这一效果的详细步骤。…

Leetcode链表刷题总结(Java版)

链表 1、移除链表元素&#xff08;考虑全情况&#xff09; 问题需求&#xff1a;根据给定的val值&#xff0c;移除链表中值是这个val的节点 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 这里有一个问题就是&#xff0c;如果需要被移除的节点不是中间的某个节点…

Tuxera2023 NTFS for Mac下载,安装和序列号激活

对于必须在Windows电脑和Mac电脑之间来回切换的Mac朋友来说&#xff0c;跨平台不兼容一直是一个巨大的障碍&#xff0c;尤其是当我们需要使用NTFS格式的硬盘在Windows和macOS之间共享文件时。因为Mac默认不支持写入NTFS磁盘。 为了解决这一问题&#xff0c;很多朋友会选择很便捷…

【Java基础知识总结 | 第十篇】HashSet底层实现原理

文章目录 10.HashSet底层实现原理10.1HashSet特点10.2HashSet源码10.3 add流程10.4总结 10.HashSet底层实现原理 10.1HashSet特点 存储对象&#xff1a;HashSet 存储对象采用哈希表的方式&#xff0c;它不允许重复元素&#xff0c;即集合中不会包含相同的元素。当向 HashSet …

数据挖掘中的PCA和KMeans:Airbnb房源案例研究

目录 一、PCA简介 二、数据集概览 三、数据预处理步骤 四、PCA申请 五、KMeans 聚类 六、PCA成分分析 七、逆变换 八、质心分析 九、结论 十、深入探究 10.1 第 1 步&#xff1a;确定 PCA 组件的最佳数量 10.2 第 2 步&#xff1a;使用 9 个组件重做 PCA 10.3 解释 PCA 加载和特…