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);
        }
        
    }
}
相关推荐
巴渝小禹11 小时前
单片机死循环delay_us()计算方法
单片机·嵌入式硬件
Yiran_G11 小时前
LoRa串口模组和SoC模组怎么选?从MCU架构看无线通信方案设计
嵌入式硬件·物联网
科芯创展13 小时前
XZ3445 高集成升压/升降压DC-DC电源芯片技术解析
单片机·嵌入式硬件
艾芯微科技13 小时前
高充放电流锂电充放 SoC:ETA9885E10,便携储能、小移动电源 BOM 选型笔记
网络·单片机·嵌入式硬件·集成测试·51单片机
艾芯微科技13 小时前
钰泰 ETA6973PQ3Y|QFN3×3 2A 同步降压 Buck,I2C 可配置多档输出,动态调压 PMIC
网络·单片机·嵌入式硬件·fpga开发·集成测试·51单片机
Brilliantwxx14 小时前
【STM32】 通用定时器:输入捕获与输出比较详解 测脉宽、测频率
stm32·单片机·嵌入式硬件·mcu
乐讯通物联网服务商14 小时前
物联网流量池原理、适用场景与技术选型避坑指南
物联网·物联网卡·万物互联
microrain14 小时前
一套能真正交付的物联网开源平台 — SagooIoT
物联网·开源
意法半导体STM3215 小时前
【官方原创】LAT1703 STM32C5 LL Cordic例程
stm32·单片机·嵌入式硬件·stm32c5·ll cordic
FPGA小徐15 小时前
电子工程师面试真题:LM7805 扩流 + 过流保护电路原理分析
单片机·嵌入式硬件