【proteus 51单片机入门】8*8led点阵

文章目录

  • 前言
  • 如何点亮led点阵
  • 仿真图
  • 代码点亮led
      • 核心代码解析
    • 爱心代码
  • 滚动
  • 总结


前言

在嵌入式系统的开发中,LED点阵显示器是一种常见的显示设备,它可以用来显示各种图形和文字,为用户提供直观的信息反馈。本文将介绍如何使用Proteus软件和51单片机来驱动一个8x8的LED点阵显示器。

Proteus是一款强大的电子设计自动化(EDA)工具,它包含了电路仿真、微处理器仿真、PCB设计等多种功能,非常适合用于嵌入式系统的开发和学习。而51单片机则是一种广泛应用的微控制器,它的编程语言是C语言,易于学习和使用。

在本文中,我们将首先介绍LED点阵显示器的工作原理,然后讲解如何使用Proteus软件和51单片机来驱动LED点阵显示器,包括硬件连接、软件编程等步骤。我们还将提供一些示例代码,帮助读者更好地理解和掌握这个过程。


如何点亮led点阵

LED点阵的工作原理基于电平控制。在一个常见的8x8 LED点阵中,我们有8个行引脚和8个列引脚,总共16个引脚用于控制64个LED灯。

以下是一个简单的例子来说明如何点亮LED点阵中的特定LED:

假设我们有一个8x8的LED点阵,我们想要点亮第一行第一列的LED。我们首先需要确定LED点阵是共阳极还是共阴极:

  • 共阳极:在这种情况下,所有LED的阳极(正极)都连接在一起,形成行或列。要点亮特定的LED,我们需要将其阳极连接的行引脚设置为高电平,将其阴极连接的列引脚设置为低电平。所以,要点亮第一行第一列的LED,我们将第一行引脚设置为高电平,第一列引脚设置为低电平。

  • 共阴极:在这种情况下,所有LED的阴极(负极)都连接在一起,形成行或列。要点亮特定的LED,我们需要将其阴极连接的行引脚设置为低电平,将其阳极连接的列引脚设置为高电平。所以,要点亮第一行第一列的LED,我们将第一行引脚设置为低电平,第一列引脚设置为高电平。

这就是如何通过控制电平来点亮LED点阵中的特定LED。要显示更复杂的图案,我们可以通过快速地改变每一行和每一列的电平,以控制每一个LED的亮度。由于人眼的视觉暂留效应,我们看到的将是一个完整的图案,而不是一闪一闪的LED灯。

仿真图

matrix点阵图搜索方式如下:
在这里插入图片描述
电路图:
在这里插入图片描述
其中,他上面为行,下面为列

代码点亮led

代码概况:

#include <regx52.h>  // 包含51单片机的头文件// 定义LED点阵的行和列对应的端口
#define LED_MATRIX_ROWS P2
#define LED_MATRIX_COLS P1// 延时函数,用于控制LED点阵的刷新速度
void delay(unsigned int ms) {unsigned int i, j;for(i = ms; i > 0; i--)for(j = 120; j > 0; j--);
}// 8x8 LED点阵的显示缓冲区,用于存储要显示的图案
unsigned char led_matrix_buffer[8] = {0};// LED点阵的初始化函数,设置行和列的初始状态
void LedMatrix_Init() {// 将行设置为低电平,列设置为高电平LED_MATRIX_ROWS = 0x00;LED_MATRIX_COLS = 0xFF;
}// LED点阵的刷新函数,用于更新LED点阵的显示
void LedMatrix_Refresh() {unsigned char i;for (i = 0; i < 8; i++) {LED_MATRIX_COLS = ~(1 << i); // 选择当前列LED_MATRIX_ROWS = led_matrix_buffer[i]; // 输出当前列的数据delay(1); // 延时以提供足够的显示时间LED_MATRIX_COLS = 0xFF; // 关闭所有列,准备切换到下一列}
}// 主函数
void main() {LedMatrix_Init(); // 初始化LED点阵led_matrix_buffer[0] = 0xaa; // 设置要显示的图案while (1) {LedMatrix_Refresh(); // 不断刷新LED点阵以显示图案}
}

其中,最重要的就是LedMatrix_Refresh函数与led_matrix_buffer变量

核心代码解析

led_matrix_buffer这个数组每一个元素存一行的led亮灭数据,我们通过写入他到引脚,就可以点亮led了

LedMatrix_Refresh函数:

// LED点阵的刷新函数,用于更新LED点阵的显示
void LedMatrix_Refresh() {unsigned char i;for (i = 0; i < 8; i++) {LED_MATRIX_COLS = ~(1 << i); // 选择当前列LED_MATRIX_ROWS = led_matrix_buffer[i]; // 输出当前列的数据delay(1); // 延时以提供足够的显示时间LED_MATRIX_COLS = 0xFF; // 关闭所有列,准备切换到下一列}
}

这个行数是使用扫描的方式来点亮led的
LED_MATRIX_COLS = ~(1 << i); // 选择当前列二进制变化变化:
当i = 0时,1 << i = 00000001,取反后~(1 << i) = 11111110
当i = 1时,1 << i = 00000010,取反后~(1 << i) = 11111101
当i = 2时,1 << i = 00000100,取反后~(1 << i) = 11111011
他进行0~7的扫描,通过0位的变化,就可以让有高电平的行亮

然后把led_matrix_buffer[i]的数据写入寄存器即可

爱心代码

#include <regx52.h>// ????????
#define LED_MATRIX_ROWS P2
#define LED_MATRIX_COLS P1void delay(unsigned int ms) {unsigned int i, j;for(i = ms; i > 0; i--)for(j = 120; j > 0; j--);
}// 8x8 LED????????
unsigned char led_matrix_buffer[8] = {0};// ?????
void LedMatrix_Init() {// ???????????LED_MATRIX_ROWS = 0x00;LED_MATRIX_COLS = 0xFF;
}// ??????
void LedMatrix_Refresh() {unsigned char i;for (i = 0; i < 8; i++) {LED_MATRIX_COLS = ~(1 << i); // ?????LED_MATRIX_ROWS = led_matrix_buffer[i]; // ????????delay(1); // ??????????????LED_MATRIX_COLS = 0xFF; // ?????,????????}
}// ???
void main() {LedMatrix_Init(); // ???LED??led_matrix_buffer[0] = 0x00; // ?1???led_matrix_buffer[1] = 0x66; // ?2???led_matrix_buffer[2] = 0xFF; // ?3???led_matrix_buffer[3] = 0xFF; // ?4???led_matrix_buffer[4] = 0x7E; // ?5???led_matrix_buffer[5] = 0x3C; // ?6???led_matrix_buffer[6] = 0x18; // ?7???led_matrix_buffer[7] = 0x00; // ?8???while (1) {LedMatrix_Refresh(); // ????}
}

在这里插入图片描述

滚动

#include <regx52.h>// ????????
#define LED_MATRIX_ROWS P2
#define LED_MATRIX_COLS P1void delay(unsigned int ms) {unsigned int i, j;for(i = ms; i > 0; i--)for(j = 120; j > 0; j--);
}// 8x8 LED????????
unsigned char led_matrix_buffer[8] = {0};// ?????
void LedMatrix_Init() {// ???????????LED_MATRIX_ROWS = 0x00;LED_MATRIX_COLS = 0xFF;
}// ??????
void LedMatrix_Refresh() {unsigned char i;for (i = 0; i < 8; i++) {LED_MATRIX_COLS = ~(1 << i); // ?????LED_MATRIX_ROWS = led_matrix_buffer[i]; // ????????delay(1); // ??????????????LED_MATRIX_COLS = 0xFF; // ?????,????????}
}void roll()
{unsigned char i = 0;unsigned char temp = led_matrix_buffer[0];for (i = 0; i < 7; i++) {led_matrix_buffer[i] = led_matrix_buffer[i + 1];}led_matrix_buffer[7] = temp;
}// ???
void main() {LedMatrix_Init(); // ???LED??led_matrix_buffer[0] = 0x00; // ?1???led_matrix_buffer[1] = 0x66; // ?2???led_matrix_buffer[2] = 0xFF; // ?3???led_matrix_buffer[3] = 0xFF; // ?4???led_matrix_buffer[4] = 0x7E; // ?5???led_matrix_buffer[5] = 0x3C; // ?6???led_matrix_buffer[6] = 0x18; // ?7???led_matrix_buffer[7] = 0x00; // ?8???while (1) {LedMatrix_Refresh(); // ????delay(10);roll();}
}

总结

通过本文的学习,我们了解了如何使用Proteus软件和51单片机来驱动一个8x8的LED点阵显示器。我们学习了LED点阵显示器的工作原理,掌握了硬件连接和软件编程的方法,还通过实际的示例代码,深入了解了这个过程。

虽然本文的内容可能对初学者来说有些复杂,但只要我们耐心学习,不断实践,就一定能够掌握这些知识。同时,我们也应该注意,学习嵌入式系统开发不仅仅是学习编程和电路设计,更重要的是学习解决问题的方法和思维方式。

希望本文能够帮助你入门Proteus和51单片机的学习,为你的嵌入式系统开发之旅打下坚实的基础。如果你在学习过程中遇到任何问题,或者有任何建议和反馈,欢迎随时与我们联系。祝你学习愉快,期待你在嵌入式系统开发的道路上取得更大的进步!

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

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

相关文章

使用 MongoDB 剖析开放银行:技术挑战和解决方案

开放银行&#xff08;或开放金融&#xff09;在银行业掀起了一股颠覆性浪潮&#xff0c;它迫使金融机构&#xff08;银行、保险公司、金融科技公司、企业甚至政府机构&#xff09;迎接一个透明、协作和创新的新时代。这种模式转变要求银行与第三方提供商&#xff08;TPP&#x…

如何在 SQL 中删除一条记录?

如何在 SQL 中删除一条记录&#xff1f; 在 SQL 中&#xff0c;您可以使用DELETE查询和WHERE子句删除表中的一条记录。在本文中&#xff0c;我将向您介绍如何使用DELETE查询和WHERE子句删除记录。我还将向您展示如何一次从表中删除多条记录 如何在 SQL 中使用 DELETE 这是使…

【计算机图形学】期末考试知识点汇总(上)

文章目录 视频教程第一章 计算机图形学概述计算机图形学的定义计算机图形学的应用计算机图形学 vs 图像处理 vs模式识别图形显示器的发展及工作原理理解三维渲染管线 第二章 基本图元的扫描转换扫描转换直线的扫描转换DDA算法Bresenham算法中点画线算法圆的扫描转换中点画圆算法…

面试-J.U.C包的梳理

1.J.U.C包的梳理 Java.Util.Concurrent包简称JUC (1)JUC整体架构图 (2)分析 Executor&#xff1a;线程执行器&#xff0c;任务执行和调度的框架。Tools下存在executor相关的executors类&#xff0c;用于创建executorservice&#xff0c;scheduleexecutorservice&#xff0c;…

哪吒汽车,正在等待“太乙真人”的拯救

文丨刘俊宏 在360创始人、哪吒汽车股东周鸿祎近日连续且着急的“督战”中&#xff0c;哪吒汽车&#xff08;下简称哪吒&#xff09;终究还是顶不住了。 6月26日&#xff0c;哪吒通过母公司合众新能源在港交所提交了IPO文件&#xff0c;急迫地希望成为第五家登陆港股的造车新势力…

高精度除法的实现

高精度除法与高精度加法的定义、前置过程都是大致相同的&#xff0c;如果想了解具体内容&#xff0c;可以移步至我的这篇博客&#xff1a;高精度加法计算的实现 在这里就不再详细讲解&#xff0c;只讲解主体过程qwq 主体过程 高精度除法的原理和小学学习的竖式除法是一样的。 …

【Sklearn-驯化】一文搞懂机器学习树模型建模可视化过程

【Sklearn-驯化】一文搞懂机器学习树模型建模可视化过程 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xff…

OpenCV学习之cv2.imshow()函数

OpenCV学习之cv2.imshow()函数 一、简介 cv2.imshow 是 OpenCV 库中用于显示图像的基本函数之一。在图像处理和计算机视觉的过程中&#xff0c;使用该函数可以快速预览处理后的图像&#xff0c;便于调试和结果展示。 二、基本语法 cv2.imshow(WindowName, Imgmat)三、参数说…

如何制作鼠标悬浮后伸缩的搜索框

引言 许多博客都在使用的伸缩搜索框制作教程 成品展示&#xff08;颜色自行搭配&#xff09; 初步布局 居中盒子&&初始化样式 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewpo…

2SK241 LTSpice模型及仿真

2SK241是东芝生产的一款NMOS&#xff0c;早已停产&#xff0c;但是在收音机圈子里还是有很多死忠粉&#xff0c;所以在淘宝上也是一堆打磨改标的假货。 言归正传&#xff0c;在矿坛上找到了2SK241的模型&#xff1a; .model M2SK241bottom NMOS(Level1 Rd1 Rs10 Rg50 Kp8mV…

在高并发场景下,怎样避免 PostgreSQL 的死锁问题?

文章目录 &#xff08;一&#xff09;不当的事务设计&#xff08;二&#xff09;不正确的锁使用&#xff08;三&#xff09;并发操作冲突&#xff08;一&#xff09;优化事务设计&#xff08;二&#xff09;正确使用锁&#xff08;三&#xff09;调整数据库参数&#xff08;四&…

mindspore打卡第9天 transformer的encoder和decoder部分

mindspore打卡第9天 transformer的encoder和decoder部分 import mindspore from mindspore import nn from mindspore import ops from mindspore import Tensor from mindspore import dtype as mstypeclass ScaledDotProductAttention(nn.Cell):def __init__(self, dropout_…

2024年6月29日 (周六) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 喜马拉雅下载工具: 字面意思 《星刃》性感女主私密部位细节逼真 让玩家感到惊讶《星刃…

clion ctrl+左键只能跳转到虚函数的声明处

右击函数 -> GOTO -> Definition 这样不够便捷&#xff0c;但是我没有找到更好的办法 可能是因为该函数是虚函数的重写&#xff0c;clion 无法识别出该函数是虚函数的哪个重写版&#xff0c;只能跳转到唯一的虚函数位置

springboot注解@ComponentScan注解作用

一 ComponentScan作用 1.1 注解作用 项目会默认扫描SpringBootApplication注解所在路径的同级和下级的所有子包&#xff0c;使用ComponentScan后他会取代掉默认扫描。 ComponentScan 是Spring框架的注解&#xff0c;它的作用是扫描指定的包路径下的标有 Component、Service、…

力扣300. 最长递增子序列(动态规划)

Problem: 300. 最长递增子序列 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 明确题目涉及到求取最值问题因此我们可以考虑使用动态规划来解决问题 1.定义状态&#xff1a;定义int类型的dp数组表示以nums[i]结尾的序列的最长长度&#xff0c;初始化均为1即表示…

Python | Leetcode Python题解之第198题打家劫舍

题目&#xff1a; 题解&#xff1a; class Solution:def rob(self, nums: List[int]) -> int:if not nums:return 0size len(nums)if size 1:return nums[0]first, second nums[0], max(nums[0], nums[1])for i in range(2, size):first, second second, max(first nu…

LNBxx21的功能

LNBxx21功能&#xff1a; LNBxx21 家族是为卫星LNB模块供电/连接LNB块与接收机的集成化解决方案。LNBxx21的很多功能可以让LNB电源/接口符合国际标准&#xff0c;此外&#xff0c;模块内还包括一个I2C总线接口&#xff0c;因为集成了一个升压直流-直流控制器&#xff0c;所以可…

MySQL高级-InnoDB引擎-事务日志- redo log(事务持久性的保证)

文章目录 1、redo log1.1、重做日志缓冲&#xff08;redo log buffer&#xff09;1.2、重做日志文件&#xff08;redo log file&#xff09; 2、如果没有redo log&#xff0c;可能会存在什么问题的&#xff1f;2.2、我们一起来分析一下。 2.2、那么&#xff0c;如何解决上述的问…

利用Matlab制作Gif图

Gif图相当于是由许多张图片拼接而成的一个“短视频”&#xff0c;因此在制作Gif图之前我们需要先准备多张图片。以下代码实现的是在当前路径下创建了一个image文件夹&#xff0c;并将绘制的HRRP通过saveas函数保存至image文件夹中&#xff0c;并命名为1.png、2.png、 %% 绘制H…