10天学会嵌入式技术之51单片机-day-6

第十五章 点阵LED

15.1 点阵 LED 概述

15.1.1 实物图

15.1.1 原理图

15.2 点阵 LED 静态显示

15.2.1 需求描述

使用点阵 LED 显示一排由左上到右下的斜线,具体效果如下图所示。

15.2.2 硬件设计

15.2.2.1 硬件原理图

根据内部原理可知,点阵 LED 的显示需要逐行或者逐列扫描,此处选择逐行扫描。由

于每次扫描只需点亮一行,所以很容易想到,行的扫描可以通过 74HC238(类似于

74HC138,与 138 输出相反)芯片完成,以达到节省 MCU 引脚的目的。

每行要显示的内容由点阵 LED 阴极的 8 个引脚控制,将 8 个引脚接入 MCU 的 8 个

GPIO 引脚即可。具体的硬件原理图如下。

15.2.2.2 74HC595 使用说明

上述原理图显示,点阵 LED 的行扫描并未使用 74HC238 芯片,而是使用了 74HC595。

该芯片的用法如下。

74HC595 芯片的相关资料如下。

15.2.3 软件设计

15.2.3.1 实现思路
15.2.3.2 具体代码

1)Int_MatrixLED.h

在 Int 中新建 Int_MatrixLED.h,写入以下内容**:**

cs 复制代码
#ifndef __INT_MATRIXLED_H__
#define __INT_MATRIXLED_H__
#include <STC89C5xRC.H>
#include "Util.h"
/**
* @brief 点阵 LED 初始化函数
*
*/
void Int_MatrixLED_Init();
/**
* @brief 设置点阵现实图像的函数
*
* @param pic 要显示的图像,数组长度必须为 8
*/
void Int_MatrixLED_SetPic(u8 *pic);
/**
* @brief 需要不断调用下面的函数刷新点阵 LED
*
*/
void Int_MatrixLED_Refresh();
#endif // __LED_MATRIX_H__

2)Int_MatrixLED.c

在 Int 中新建 Int_MatrixLED.c,写入以下内容:

cs 复制代码
#include "Int_MatrixLED.h"
#define SER P10
#define SCK P12
#define RCK P11
#define MATRIX_LED_EN P35
// 设置缓存,每个字节代表点阵的一行,单行中每个 bit,1 为亮,0 为灭
static u8 s_led_buff[8];
void Int_MatrixLED_Init()
{
    u8 i;
// 打开点阵 LED
    MATRIX_LED_EN = 0;
// 初始化后,全部点阵关闭
    for (i = 0; i < 8; i++)
    {
        s_led_buff[i] = 0;
    }
}

void Int_MatrixLED_SetPic(u8 *pic)
{
    u8 i;
    for (i = 0; i < 8; i++)
    {
        s_led_buff[i] = pic[i];
    }
}

void Int_MatrixLED_Refresh()
{
    u8 i;
    SER = 1;
    SCK = 0;
    SCK = 1;
    SER = 0;
    for (i = 0; i < 8; i++)
    {
// 展示下一行之前,关闭
        P0 = 0xFF;
        RCK = 0;
        RCK = 1;
// 当前行展示想展示的数据
        P0 = ~s_led_buff[i];
        SCK = 0;
        SCK = 1;
        Delay1ms(1);
        }
}

3)Main.c

在主文件夹新建 Main.c,写入以下内容

cs 复制代码
#include <STC89C5xRC.H>
#include "Int_MatrixLED.h"
void main()
{
    u8 pic[8] = {0x1,
    0x2,
    0x4,
    0x8,
    0x10,
    0x20,
    0x40,
    0x80};
Int_MatrixLED_Init();
Int_MatrixLED_SetPic(pic);
    while (1) {
        Int_MatrixLED_Refresh();
    }
}

15.3 点阵 LED 滚动显示

15.3.1 需求描述

LED 点阵屏滚动显示"尚硅谷"三个字。

15.3.2 软件设计

15.3.2.1 实现思路
15.3.2.2 完整代码

1)Int_MatrixLED.h

cs 复制代码
#ifndef __INT_LEDMATRIX_H__
#define __INT_LEDMATRIX_H__
#include "Com_Util.h"
void Int_LEDMatrix_Init();

void Int_LEDMatrix_SetPic(u8 pic[]);

void Int_LEDMatrix_Refresh();

void Int_LEDMatrix_Shift(u8 pic);

#endif /* __INT_LEDMATRIX_H__ */

2)Int_MatrixLED.c

cs 复制代码
#include "Int_LEDMatrix.h"
#include "Dri_Timer0.h"
#include <STC89C5xRC.H>
#define LED_MATRIX_EN P35
#define LED_EN        P34

#define SER           P10
#define SCK           P12
#define RCK           P11

static u8 s_buffer[8];
void Int_LEDMatrix_RefreshByTimer0();
void Int_LEDMatrix_Init()
{
    LED_MATRIX_EN = 0;
    LED_EN        = 0;

    Dri_Timer0_RegisterCallback(Int_LEDMatrix_RefreshByTimer0);
}

void Int_LEDMatrix_SetPic(u8 pic[])
{
    u8 i;
    for (i = 0; i < 8; i++) {
        s_buffer[i] = pic[i];
    }
}

void Int_LEDMatrix_Refresh()
{
    u8 i;
    for (i = 0; i < 8; i++) {
        P0 = 0xFF;
        // 1.设置显示哪行
        if (i == 0) {
            SER = 1;
        } else {
            SER = 0;
        }

        SCK = 0;
        SCK = 1;

        RCK = 0;
        RCK = 1;
        // 2.设置当前行的显示内容
        P0 = ~s_buffer[i];
        Com_Util_Delay1ms(1);
    }
}

void Int_LEDMatrix_Shift(u8 pic)
{
    u8 i=7;
    for ( i = 0; i >=1 ; i--)
    {
       s_buffer[i]=s_buffer[i-1];
       s_buffer[0]= pic ;
    }
    


}

void Int_LEDMatrix_RefreshByTimer0()
{
    static u8 i = 0;
    P0          = 0xFF;
    // 1.设置显示哪行
    if (i == 0) {
        SER = 1;
    } else {
        SER = 0;
    }

    SCK = 0;
    SCK = 1;

    RCK = 0;
    RCK = 1;

    // 2.设置当前行的显示内容
    P0 = ~s_buffer[i];

    i++;
    if (i == 8) {
        i = 0;
    }
}

3)Main.c

cs 复制代码
#include"Dri_Timer0.h"
#include"Int_LEDMatrix.h"
void main()
{
    u8 i;
    u8 picture[26] = {0xF8, 0x0A, 0xEC, 0xAF, 0xEC, 0x8A, 0xF8, 0x00,
        0x10, 0xF9, 0x97, 0xF1, 0x88, 0xAA, 0xFF, 0xAA,
        0x88, 0x00, 0x14, 0x0A, 0xF5, 0x92, 0x92, 0xF5,
        0x0A, 0x14};

    Dri_Timer0_Init();
    Int_LEDMatrix_Init();
    while(1){
        for ( i = 0; i < 26; i++)
        {
            Int_LEDMatrix_Shift(picture[26]);
            Com_Util_Delay1ms(200);
        }
        
    }
}
相关推荐
Sakura_j_h_29 分钟前
51 单片机驱动四位数码管:动态扫描、限流电阻与消影的取舍
单片机·嵌入式硬件·51单片机·嵌入式·数码管·动态扫描·限流电阻
CServer_012 小时前
开源!汽车零部件仓储的数字孪生协同方案
物联网·开源·汽车·制造
蹊黎13 小时前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
爱聊灵光的维C15 小时前
从看见世界到重构认知:在视觉与硬件的交汇处,寻找我们这代人的北极星
c语言·物联网·计算机视觉·重构·硬件工程·射频工程
无敌贵点大王17 小时前
从寄存器层面重学STM32(6)——串口USART实战部分
stm32·单片机·嵌入式硬件
庙堂龙吟奈我何17 小时前
二进制和十六进制
stm32·单片机
国科安芯18 小时前
长期在轨的计算底座:商业空间站与在轨服务飞行器健康管理中的抗辐射MCU—— 面向可维护空间平台的分层容错与安全通信综述
人工智能·单片机·嵌入式硬件·安全·低轨卫星·抗辐射
不昀21 小时前
RMII切到10Mbps,50MHz参考时钟也要降到5MHz吗?
单片机·嵌入式硬件·硬件设计·以太网接口
路上有只喵1 天前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇6
单片机·嵌入式硬件
集芯微电科技有限公司1 天前
40V/24A高频率增强型GaN HEMT功率开关管/高频DC转换/电动工具/GaN充电器 方案首选
人工智能·科技·单片机·嵌入式硬件·深度学习·神经网络·生成对抗网络