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


前言

在嵌入式系统的开发中,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单片机的学习,为你的嵌入式系统开发之旅打下坚实的基础。如果你在学习过程中遇到任何问题,或者有任何建议和反馈,欢迎随时与我们联系。祝你学习愉快,期待你在嵌入式系统开发的道路上取得更大的进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人才程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值