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

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

相关文章

Element 页面滚动表头置顶

在开发后台管理系统时&#xff0c;表格是最常用的一个组件&#xff0c;为了看数据方便&#xff0c;时常需要固定表头。 如果页面基本只有一个表格区域&#xff0c;我们可以根据屏幕的高度动态的计算出一个值&#xff0c;给表格设定一个固定高度&#xff0c;这样表头就可以固定…

在 PMP 考试中,项目管理经验不足怎么办?

在项目管理的专业成长之路上&#xff0c;PMP认证如同一块里程碑&#xff0c;标志着从业者的专业水平达到了国际公认的标准。然而&#xff0c;对于那些项目管理经验尚浅的考生来说&#xff0c;这座里程碑似乎显得有些遥不可及。那么&#xff0c;在PMP考试准备中&#xff0c;项目…

冯雷老师:618大退货事件分析

近日冯雷老师受邀为某头部电商36名高管进行培训&#xff0c;其中聊到了今年618退货潮的问题。以下内容整理自冯雷老师的部分授课内容。 一、引言 随着电子商务的蓬勃发展&#xff0c;每年的618大促已成为消费者和商家共同关注的焦点。然而&#xff0c;在销售额不断攀升的同时…

DigiRL:让 AI 自己学会控制手机

类似于苹果此前发布的Ferret-UI 的安卓开源平替。主要用于在 Android 设备上识别 UI 和执行指令&#xff0c;不同的是它利用了离线到在线强化学习&#xff08;Offline-to-Online RL&#xff09;&#xff0c;能够快速适应应用更新或 UI 变化。

如何解决java程序CPU负载过高问题

1、介绍 在生产环境中&#xff0c;有时会遇到cpu占用过高且一直下不去的场景。这种情况可能会导致服务器宕机&#xff0c;进而中断对外服务&#xff0c;也会影响硬件寿命。 2、原因 1、Java代码存在因递归不当等原因导致的死循环的问题&#xff0c;推荐有条件的循环&#xf…

OpenAI禁止中国使用API,国内大模型市场何去何从

GPT-5 一年半后发布&#xff1f;对此你有何期待&#xff1f; 前言 前言&#xff1a; 近日&#xff0c;OpenAI宣布禁止中国用户使用其API&#xff0c;这一决策引起了国内大模型市场的广泛关注。面对这一挑战&#xff0c;国内大模型市场的发展路径和前景成为业界热议的焦点。本…

pytorch-01

加载mnist数据集 one-hot编码实现 import numpy as np import torch x_train np.load("../dataset/mnist/x_train.npy") # 从网站提前下载数据集&#xff0c;并解压缩 y_train_label np.load("../dataset/mnist/y_train_label.npy") x torch.tensor(y…

【小程序静态页面】猜拳游戏大转盘积分游戏小程序前端模板源码

猜拳游戏大转盘积分游戏小程序前端模板源码&#xff0c; 一共五个静态页面&#xff0c;首页、任务列表、大转盘和猜拳等五个页面。 主要是通过做任务来获取积分&#xff0c;积分可以兑换商品&#xff0c;也可用来玩游戏&#xff1b;通过玩游戏既可能获取奖品或积分也可能会消…

一文速览Google的Gemma:从gemma1到gemma2(2代27B的能力接近llama3 70B)

前言 如此文《七月论文审稿GPT第3.2版和第3.5版&#xff1a;通过paper-review数据集分别微调Mistral、gemma》所讲 Google作为曾经的AI老大&#xff0c;我司自然紧密关注&#xff0c;所以当Google总算开源了一个gemma 7b&#xff0c;作为有技术追求、技术信仰的我司&#xff0…

maven安装jar和pom到本地仓库

举例子我们要将 elastic-job-spring-boot-starter安装到本地的maven仓库&#xff0c;如下&#xff1a; <dependency><groupId>com.github.yinjihuan</groupId><artifactId>elastic-job-spring-boot-starter</artifactId><version>1.0.5&l…

关于组织赴俄罗斯(莫斯科)第 28 届国际汽车零部件、汽车维修设备和商品展览会商务考察的通知

关于组织赴俄罗斯&#xff08;莫斯科&#xff09; 第 28 届国际汽车零部件、汽车维修设备和商品展览会商务考察的通知 展会名称&#xff1a;俄罗斯&#xff08;莫斯科&#xff09;第 28 届国际汽车零部件、汽车零部件、汽车维修设备和商品展览会 时间&#xff1a;2024 年 8 月…

day02-Spark集群及参数

一、Spark运行环境变量问题(了解) 1-pycharm远程开发运行时&#xff0c;执行的是服务器的代码 2-通过本地传递指令到远程服务器运行代码时&#xff0c;会加载对应环境变量数据&#xff0c;加载环境变量文件是用户目录下的.bashrc文件 在/etc/bashrc 1-1 在代码中添加 使用os模块…

文本编辑命令和正则表达式

一、 编辑文本的命令 正则表达式匹配的是文本内容&#xff0c;Linux的文本三剑客&#xff0c;都是针对文本内容。 文本三剑客 grep&#xff1a;过滤文本内容 sed&#xff1a;针对文本内容进行增删改查 &#xff08;本文不相关&#xff09; awk&#xff1a;按行取列 &#x…

【网络架构】keepalive

目录 一、keepalive基础 1.1 作用 1.2 原理 1.3 功能 二、keepalive安装 2.1 yum安装 2.2 编译安装 三、配置文件 3.1 keepalived相关文件 3.2 主配置的组成 3.2.1 全局配置 3.2.2 配置虚拟路由器 四、实际操作 4.1 lvskeepalived高可用群集 4.2 keepalivedngi…

element 问题整合

没关系&#xff0c;凡事发生必有利于我 文章目录 一、el-table 同级数据对齐及展开图标的位置问题二、el-table 勾选框为圆角及只能勾选一个三、el-tree 弹框打开&#xff0c;使得列表关闭&#xff0c;且弹框滚动条回到顶部 一、el-table 同级数据对齐及展开图标的位置问题 ele…

Facebook的投流技巧有哪些?

相信大家都知道Facebook拥有着巨大的用户群体和高转化率&#xff0c;在国外社交推广中的影响不言而喻。但随着Facebook广告的竞争越来越激烈&#xff0c;在Facebook广告上获得高投资回报率也变得越来越困难。IPIDEA代理IP今天就教大家如何在Facebook上投放广告的技巧&#xff0…

使用 Ubuntu x86_64 平台交叉编译适用于 Linux aarch64(arm64) 平台的 QT5(包含OpenGL/WebEngine支持) 库

使用 Ubuntu AMD64 平台交叉编译适用于 Linux ARM64 平台的 QT5(包含 OpenGL/WebEngine 支持) 库 目录 使用 Ubuntu AMD64 平台交叉编译适用于 Linux ARM64 平台的 QT5(包含 OpenGL/WebEngine 支持) 库写在前面前期准备编译全流程1. 环境搭建2. 复制源码包并解压&#xff0c;创…

响应式高端家居装修网站源码pbootcms模板

模板介绍 分享一款黄色的响应式高端家居装修网站源码pbootcms模板&#xff0c;该模板能自适应手机端&#xff0c;响应式的设计可让您自由编辑&#xff0c;适合任何关于装修&#xff0c;空间设计&#xff0c;家装&#xff0c;家居等业务的企业。 模板截图 源码下载 响应式高端…

C++——探索智能指针的设计原理

前言: RAII是资源获得即初始化&#xff0c; 是一种利用对象生命周期来控制程序资源地手段。 智能指针是在对象构造时获取资源&#xff0c; 并且在对象的声明周期内控制资源&#xff0c; 最后在对象析构的时候释放资源。注意&#xff0c; 本篇文章参考——C 智能指针 - 全部用法…

已解决问题 | 该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的

在Chrome浏览器中&#xff0c;如果你看到“该扩展程序未列在 Chrome 网上应用店中&#xff0c;并可能是在您不知情的情况下添加的”这样的提示&#xff0c;通常是因为该扩展程序没有通过Chrome网上应用店进行安装。以下是解决这个问题的步骤&#xff1a; 解决办法&#xff1a;…