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

news2024/12/25 1:11:37

文章目录

  • 前言
  • 如何点亮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 P1

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

// ?????
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 P1

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

// ?????
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.coloradmin.cn/o/1877769.html

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

相关文章

亿发微商城:从社交流量到生意增量,拓客+变现双收益

亿发微商城提供私域经营必备的系统 、服务和技术支持等全套解决方案。省去开发成本&#xff0c;还原品牌调性&#xff0c;打通社交渠道&#xff0c;经营私域会员&#xff0c;带来传统电商和线下门店之外的生意增量。

【linux/shell案例实战】解决Linux和Windows的换行符CRLF和LF问题

目录 一.什么是Linux 和 Windows 的换行符 CRLF 和 LF 二.使用Linux 中命令 dos2unix 和 unix2dos 实现CRLF 和LF的转换 三.使用 windows 中的代码编辑器实现 CRLF 和 LF 的转换&#xff08;Notepad&#xff09; 一.什么是Linux 和 Windows 的换行符 CRLF 和 LF CR是Carria…

<sa8650>QCX ID16_UsecaseRawLiteAuto 使用详解

<sa8650>QCX ID16_UsecaseRawLiteAuto 使用详解 一、前言二、ID16_UsecaseRawLiteAuto拓扑图三、UsecaseRawLiteAuto拓扑图 解析3.1 camxUsecaseRawLiteAuto.xml3.2 camxRawLiteAuto.xml四、测试一、前言 我们在使用QCX时,如果由于使用的摄像头自带了ISP,那么可能不需要使…

iOS开发中用到的自定义UI库

文章目录 前言cell 左右滑动菜单日历组件仿QQ 侧滑抽屉仿探探、陌陌的卡牌滑动库头部缩放视图自定义UITabbar刮刮乐广告横幅 前言 本文中的UI组件&#xff0c;是作者在移动应用开发中都用到过的。 确实&#xff0c;找到对的三方库可以快速帮助我们构建App, 极大程度上提高了生…

吉利银河L6(官方小订送的3M) 对比 威固vk70+ks15

吉利送的号称价值2000的3M效果 撕膜重贴 威固vk70ks15 之后的效果 // 忘记测反射的热量了 可以验证金属膜是反射热而不是吸热 金属膜 手机GPS还能用吗 亲测 能用 太阳能总阻隔率 3M貌似20%出头 威固前档55% 侧后挡高一点不超过60% 夏天真实太阳发热能量 即阻隔率55%到60% …

[leetcode hot 150]第一百二十二题,买卖股票的最佳时机Ⅱ

题目&#xff1a; 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得的 最大…

python 图像数据

//***********************安装库***********************// pip install pillow //安装Pillow库&#xff0c;Image类是Pillow库中的类 pip install numpy //安装numpy库&#xff0c;numpy是数值计算扩展库 pip install matplotlib import numpy as np from PIL import Imag…

webpack源码深入--- webpack的编译主流程

webpack5的编译主流程 根据watch选项调用compiler.watch或者是compiler.run()方法 try {const { compiler, watch, watchOptions } create();if (watch) {compiler.watch(watchOptions, callback);} else {compiler.run((err, stats) > {compiler.close(err2 > {callb…

Linux 生产消费者模型

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux初窥门径⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 前言 1. 生产消费者模型 1.1 什么是生产消…

FastAPI-Cookie

fastapi-learning-notes/codes/ch01/main.py at master Relph1119/fastapi-learning-notes GitHub 1、Cookie的作用 Cookie可以充当用户认证的令牌&#xff0c;使得用户在首次登录后无需每次手动输入用户名和密码&#xff0c;即可访问受限资源&#xff0c;直到Cookie过期或…

Hi3861 OpenHarmony嵌入式应用入门--LiteOS Semaphore做同步使用

信号量作为同步使用 创建一个Semaphore对象&#xff0c;并指定一个初始的计数值&#xff08;通常称为“许可”或“令牌”的数量&#xff09;。这个计数值表示当前可用的资源数量或可以同时访问共享资源的线程数。当一个线程需要访问共享资源时&#xff0c;它会尝试从Semaphore…

c++用什么软件编程?都有哪些?

c用什么软件编程&#xff1f;都有哪些&#xff1f; C 作为一种高效、面向对象的编程语言&#xff0c;广泛应用于软件开发、游戏开发、嵌入式系统等领域。那么在进行 C 编程时&#xff0c;我们通常会使用哪些软件呢&#xff1f;下面就来具体分析。 1. Visual Studio Visual Stu…

python selenium 打开网页

selenium工具类 - 文件名 seleniumkit.py 代码如下 # -*- coding:utf-8 _*-from selenium import webdriverimport os import timefrom selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from seleniu…

【计算机网络】期末复习(2)

目录 第一章&#xff1a;概述 第二章&#xff1a;物理层 第三章&#xff1a;数据链路层 第四章&#xff1a;网络层 第五章&#xff1a;传输层 第一章&#xff1a;概述 三大类网络 &#xff08;1&#xff09;电信网络 &#xff08;2&#xff09;有线电视网络 &#xff0…

Eclipse + GDB + J-Link 的单片机程序调试实践

Eclipse GDB J-Link 的调试实践 本文介绍如何创建Eclipse的调试配置&#xff0c;如何控制调试过程&#xff0c;如何查看修改各种变量。 对 Eclipse 的要求 所用 Eclipse 应当安装了 Eclipse Embedded CDT 插件。从 https://www.eclipse.org/downloads/packages/ 下载 Ecli…

快手正式推出Vision Pro版本,引领虚拟现实社交新潮流

6月28日&#xff0c;快手正式推出其专为Apple Vision Pro打造的版本——快手vp版app&#xff0c;成为国内首批登陆Apple Vision Pro的短视频平台。 借助先进的虚拟现实技术&#xff0c;用户可以在快手上体验更真实生动的视频内容&#xff0c;无论是观看趣味短视频内容&#xf…

怎样查看自己的Windows电脑最近弄了哪些内容

一、需求说明 有时候我们的电脑别人需要使用&#xff0c;你不给他使用又不行&#xff0c;且你也不在电脑身边&#xff0c;你只能告诉他自己的电脑密码让他操作&#xff0c;此时你并不不知道他操作了哪些内容。 还有一个种情况是自己不在电脑旁边&#xff0c;且电脑没有锁屏&…

鳗鱼-石斑鱼优化算法(EGO)-鲸鱼算法作者又提出新算法!公式原理详解与性能测评 Matlab代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 一、石斑鱼追踪猎物(勘探阶段) 二…

QGroundControl@Jetson Orin Nano - 从代码编译安装

QGroundControlJetson Orin Nano - Build from Source 1. 源由2. 步骤2.1 QT 编译2.1.1 下载2.1.2 版本2.1.3 初始化2.1.4 配置2.1.5 编译2.1.6 安装 2.2 QGC 编译2.2.1 下载2.2.2 版本2.2.3 初始化2.2.4 配置2.2.5 编译2.2.6 安装2.2.7 QT5命令备注 3. 可行方案4. 总结5. 补充…

如何用GPT开发一个基于 GPT 的应用?

原文发自博客&#xff1a;GPT应用开发小记 如何开发一个基于 GPT 的应用&#xff1f;答案就在问题里&#xff0c;那就是用 GPT 来开发基于 GPT 的应用。本文以笔者的一个开源项目 myGPTReader 为例&#xff0c;分享我是如何基于 GPT 去开发这个系统的&#xff0c;这个系统的功能…