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…

ps教程谁教的好

在Photoshop&#xff08;PS&#xff09;教程方面&#xff0c;有多位老师被推荐为教学水平较高。以下是一些被提及的老师&#xff1a; 敬伟&#xff1a;被认为是很多人的PS启蒙老师&#xff0c;提供基本功能介绍与高级效果案例&#xff0c;教学风格被认为是免费且不拖沓的。1…

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

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

开发语言漫谈-C语言

个人认为C语言是最伟大的开发语言&#xff08;没有之一&#xff09;。C语言开创了高级语言的新时代。比C更低级的是汇编语言&#xff0c;这个东西就是反人类的玩意。之后的语言或多或少都受C语言的影响。更神奇的是直到现在&#xff0c;C语言还有生命力。C语言的发明人丹尼斯里…

比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…

使用阿里云试用Elasticsearch学习:1.4 基础入门——映射和分析

当摆弄索引里面的数据时&#xff0c;我们发现一些奇怪的事情。一些事情看起来被打乱了&#xff1a;在我们的索引中有12条推文&#xff0c;其中只有一条包含日期 2014-09-15 &#xff0c;但是看一看下面查询命中的 总数 &#xff08;total&#xff09;&#xff1a; GET /_searc…

如何利用GitHub和jsDelivr托管图片cdn

1、背景 https://cdn.jsdelivr.net/gh/axh2018/axh2018.github.io/medias/banner/6.jpg 这个链接是如何生成的&#xff1f;免费吗&#xff1f; 2、解决 这个链接看起来是使用了 jsDelivr 服务来托管在 GitHub 上的静态文件。jsDelivr 是一个免费的开源 CDN (Content Deliver…

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

窗口移动计算方法 例子方法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 是面向报文的…

MFC中数据转化

目录 1.CString数据转化为int类型数据 2.int类型转化为CString类型数据 3.MFC中CString数据类型 转换为std::string数据类型 4.MFC中std::string数据类型 转换为CString数据类型 1.CString数据转化为int类型数据 在MFC中&#xff0c;将CString类型数据转换为int类型数据&a…

Hadoop-入门

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

数据结构--最长公共前缀

数据结构–最长公共前缀 方法一&#xff1a; 分析 首先找到最小长度的字符串&#xff0c;然后把其与每一个与每一个字符串查找索引&#xff0c;判断其是不是第一个(索引为0)&#xff0c;若其是&#xff0c;则计数的加一&#xff0c;当计数等于字符数组长度&#xff0c;即每个…

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

随着计算机科学和互联网的发展&#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) 是该表主键(具有唯一值的列的…