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

news2025/2/24 21:03:51

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 串行数据输入 DS

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;
}

void MatrixLED_ShowColumn(unsigned char Column,Data) //Column是列数据,Data数据
{
	_74HC595_WriteByte(Data);//数据存入Data
	P0=~(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 串行数据输入 DS

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;
}

void MatrixLED_ShowColumn(unsigned char Column,Data) //Column是列数据,Data数据
{
	_74HC595_WriteByte(Data);//数据存入Data
	P0=~(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 P0

sbit 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);//数据存入Data
	MATRIX_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用于位移量控制,Count
	void 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.coloradmin.cn/o/1572203.html

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

相关文章

通过Omnet++官网tictoc教程学习在Omnet++中构建和运行仿真 Part1Part2

introduce开始模型介绍构建项目添加 NED 文件添加C 文件添加 omnetpp.ini总结 运行仿真启动仿真程序运行仿真调试运行时错误崩溃断点调试下一事件 调试/运行 日志序列图可视化 Omnet官网 TicToc教学 introduce 在 Omnet安装完成后&#xff0c;samples/tictoc 中有该例子的完整…

windows部署Jenkins并远程部署tomcat

目录 1、Jenkins官网下载Jenkins 2、安装Jenkins 3、修改Home directory 4、插件安装及系统配置 5、Tomcat安装及配置 5.1、修改配置文件,屏蔽以下代码 5.2、新增登录用户 5.3、编码格式修改 5.4、启动tomcat 6、Jenkins远程部署war包 6.1、General配置 6.2、Sourc…

基于卷积神经网络的大米品种分类系统(pytorch框架)【python源码+UI界面+前端界面+功能源码详解】

功能演示&#xff1a; 大米品种分类系统&#xff0c;基于vgg16&#xff0c;resnet50卷积神经网络&#xff08;pytorch框架&#xff09;_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积神经网络的大米品种分类系统是在pytorch框架下实现的&#xff0c;系统中有两…

Redis中的持久化

持久化 .RDB手动触发save命令bgsave命令 自动触发bgsave的具体流程RDB的处理保存压缩校验 RDB的优缺点 AOF命令写入文件同步重写机制启动时恢复数据 本章重点回顾 . RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发 手动触发…

电子积木方案开发商

东莞市酷得智能科技有限公司电子积木方案开发商 提供消费电子解决方案、提供IC技术支持&#xff0c;全国线上线下服务 积木小车底层驱动开发过程主要涉及到以下几个方面&#xff1a; 首先&#xff0c;需要对小车底盘结构、硬件、模块等有深入的了解。底盘承载着机器人定位、导…

nvm保姆级安装使用教程

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

数据采集与整理:知识图谱的根基

数据采集与整理&#xff1a;知识图谱的根基 一、 引言 在今天的数据驱动的世界中&#xff0c;知识图谱已经成为了连接复杂信息的关键工具。它们不仅推动了人工智能的发展&#xff0c;还改变了我们管理和利用知识的方式。然而&#xff0c;任何优秀的知识图谱都离不开一个核心的…

武汉星起航:跨境电商领域的领航者,助力全球贸易新篇章

自2017年以来&#xff0c;武汉星起航一直专注于亚马逊自营店铺&#xff0c;积累了宝贵的经验。2020年正式成立后&#xff0c;公司以跨境电商为核心&#xff0c;致力于为合作伙伴提供深入的合作模式。武汉星起航凭借其卓越的服务和实战经验&#xff0c;已成功助力众多创业者实现…

C# 分布式自增ID算法snowflake(雪花算法)

文章目录 1. 概述2. 结构3. 代码3.1 IdWorker.cs3.2 IdWorkerTest.cs (测试) 1. 概述 分布式系统中&#xff0c;有一些需要使用全局唯一ID的场景&#xff0c;这种时候为了防止ID冲突可以使用36位的UUID&#xff0c;但是UUID有一些缺点&#xff0c;首先他相对比较长&#xff0c…

画图理解JVM相关内容

文章目录 1. JVM视角下&#xff0c;内存划分2. 类内存分布硬核详解1. 获取堆内存参数2. 扫描堆内存&#xff0c;定位实例3. 查看实例所在地址的数据4. 找到实例所指向的类信息的地址5. 查看class信息6. 结论 3. Java的对象创建流程4. 垃圾判别算法4.1 引用计数法4.2 可达性分析…

DRF:认证(单视图或全局设置认证方案和源码分析、设置多个认证方案、如何设置不允许匿名访问)

概念&#xff1a;request.user、request.auth、认证方案authentication_classes 官网原文&#xff1a; 验证始终在视图的最开始进行&#xff0c;在执行权限和限制检查之前以及允许任何其他代码继续执行之前。 request.user 属性通常被设置为contrib.auth 包中 User 类的一个…

数学知识--(欧拉函数,快速幂,扩展欧几里得算法)

本文用于记录个人算法竞赛学习&#xff0c;仅供参考 目录 一.欧拉函数 二.欧拉函数模板 三.用筛法求每个数的欧拉函数 四.快速幂 五.扩展欧几里得算法 六.用扩展欧几里得算法求线性同余方程 一.欧拉函数 即有一个数n&#xff0c; n通过质因数分解得到 通过欧拉函数有 证明&…

Java 程式 main 方法传参数

Java 程式运行时如果需要传递参数时&#xff0c;常用的方法有两种&#xff1a; 使用 Program Arguments 来传递值使用 VM Arguments 来传递值 1、使用 Program Arguments 来传递值 使用 Program Arguments 来传递值时&#xff0c;main 方法的写法如下&#xff1a; public st…

Linux 常用命令(持续更新中...)

1. ls 查看文件列表命令 语法&#xff1a; ls [-a -l -h] [Linux路径] -a -l -h 是可选的选项 &#xff08;-h需配合-l命令一起使用&#xff09;Linux路径是此命令可选的参数 ls #查看当前目录所有非隐藏文件(平铺方式显示) ls -a #查看当前目录下所有文件 …

Web 后台项目,权限如何定义、设置、使用:菜单权限、按钮权限 ts element-ui-Plus

Web 后台项目&#xff0c;权限如何定义、设置、使用&#xff1a;菜单权限、按钮权限 ts element-ui-Plus 做一个后台管理项目&#xff0c;里面需要用到权限管理。这里说一下权限定义的大概&#xff0c;代码不多&#xff0c;主要讲原理和如何实现它。 一、权限管理的原理 权限…

Polardb MySQL 产品架构及特性

一、产品概述; 1、产品族 参考&#xff1a;https://edu.aliyun.com/course/3121700/lesson/341900000?spma2cwt.28120015.3121700.6.166d71c1wwp2px 2、polardb mysql架构优势 1&#xff09;大容量高弹性&#xff1a;最大支持存储100T&#xff0c;最高超1000核CPU&#xff0…

55、美国德克萨斯大学奥斯汀分校、钱德拉家族电气与计算机工程系:通过迁移学习解决BCI个体差异性[不得不说,看技术还得是老美]

2024年2月5日跨被试最新文章&#xff1a; 德州州立大学奥斯汀分校研究团队最近的一项研究成果&#xff0c;通过非侵入式的脑机接口&#xff0c;可以让被试不需要任何校准就可以使用脑机接口设备&#xff0c;这意味着脑机接口具备了大规模被使用的潜力。 一般来说&#xff0c;…

哈希-字母异位词分组

字母异位词&#xff0c;词频一样&#xff0c;但是顺序不一样&#xff0c;可以进行排序&#xff0c;获取一个key&#xff0c;放在map中即可。 class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> ma…

彩虹聚合DNS管理系统v1.0全新发布

聚合DNS管理系统&#xff08;https://github.com/netcccyun/dnsmgr&#xff09;可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&#xff0c;每个用户可分配不同的…

STM32CubeIDE基础学习-舵机控制实验

STM32CubeIDE基础学习-舵机控制实验 文章目录 STM32CubeIDE基础学习-舵机控制实验前言第1章 硬件介绍第2章 工程配置2.1 基础工程配置部分2.2 生成工程代码部分 第3章 代码编写第4章 实验现象总结 前言 SG90、MG996舵机在机器人领域用得非常多&#xff0c;因为舵机有内置控制电…