51单片机-LED点阵屏

LED点阵屏

LED点阵屏介绍

  • LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等

  • LED点阵屏分类

    按颜色:单色、双色、全彩

    按像素:8×8、16×16等(大规模的LED点阵通常由很多个小点阵拼接而成)

显示原理

  • LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以"8"字型排列而已
  • LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同
  • LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示

LED点阵屏的连接

74HC595

SER为数据输入

SERCKL 上升沿移位

RCLK 上升沿锁存

C51的sfr、sbit

  • sfr(special function register):特殊功能寄存器声明

    例:sfr P0 = 0x80;

    声明P0口寄存器,物理地址为0x80

  • sbit(special bit):特殊位声明

    例:sbit P0_1 = 0x81; 或 sbit P0_1 = P0^1;

    声明P0寄存器的第1位

  • 可位寻址/不可位寻址:在单片机系统中,操作任意寄存器或者某一位的数据时,必须给出其物理地址,又因为一个寄存器里有8位,所以位的数量是寄存器数量的8倍,单片机无法对所有位进行编码,故每8个寄存器中,只有一个是可以位寻址的。对不可位寻址的寄存器,若要只操作其中一位而不影响其它位时,可用"&="、"|="、"^="的方法进行位操作

代码演示

现实静态

c 复制代码
#include <REGX52.H>
#include "Delay.h"
​
sbit RCK=P3^5;      //RCLK
sbit SCK=P3^6;      //SRCLK
sbit SER=P3^4;      //SER
​
#define MATRIX_LED_PORT     P0
​
/**
  * @brief  74HC595写入一个字节
  * @param  Byte 要写入的字节
  * @retval 无
  */
void _74HC595_WriteByte(unsigned char Byte)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        SER=Byte&(0x80>>i);
        SCK=1;
        SCK=0;
    }
    RCK=1;
    RCK=0;
}
​
/**
  * @brief  LED点阵屏显示一列数据
  * @param  Column 要选择的列,范围:0~7,0在最左边
  * @param  Data 选择列显示的数据,高位在上,1为亮,0为灭
  * @retval 无
  */
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
    _74HC595_WriteByte(Data);
    MATRIX_LED_PORT=~(0x80>>Column);
    Delay(1);
    MATRIX_LED_PORT=0xFF;
}
​
void main()
{
    SCK=0;
    RCK=0;
    while(1)
    {
        MatrixLED_ShowColumn(0,0x3C);
        MatrixLED_ShowColumn(1,0x42);
        MatrixLED_ShowColumn(2,0xA9);
        MatrixLED_ShowColumn(3,0x85);
        MatrixLED_ShowColumn(4,0x85);
        MatrixLED_ShowColumn(5,0xA9);
        MatrixLED_ShowColumn(6,0x42);
        MatrixLED_ShowColumn(7,0x3C);
    }
}

现实动态

c 复制代码
#include <REGX52.H>
#include "Delay.h"
sbit RCK=P3^5;      //RCLK
sbit SCK=P3^6;      //SRCLK
sbit SER=P3^4;      //SER
​
#define MATRIX_LED_PORT     P0
​
/**
  * @brief  74HC595写入一个字节
  * @param  Byte 要写入的字节
  * @retval 无
  */
void _74HC595_WriteByte(unsigned char Byte)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        SER=Byte&(0x80>>i);
        SCK=1;
        SCK=0;
    }
    RCK=1;
    RCK=0;
}
​
/**
  * @brief  点阵屏初始化
  * @param  无
  * @retval 无
  */
void MatrixLED_Init()
{
    SCK=0;
    RCK=0;
}
​
/**
  * @brief  LED点阵屏显示一列数据
  * @param  Column 要选择的列,范围:0~7,0在最左边
  * @param  Data 选择列显示的数据,高位在上,1为亮,0为灭
  * @retval 无
  */
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
    _74HC595_WriteByte(Data);
    MATRIX_LED_PORT=~(0x01>>Column);
    Delay(1);
    MATRIX_LED_PORT=0xFF;
}
​
//动画数据
unsigned char code Animation[]={
    0x3C,0x42,0xA9,0x85,0x85,0xA9,0x42,0x3C,
    0x3C,0x42,0xA1,0x85,0x85,0xA1,0x42,0x3C,
    0x3C,0x42,0xA5,0x89,0x89,0xA5,0x42,0x3C,
};
​
void main()
{
    unsigned char i,Offset=0,Count=0;
    MatrixLED_Init();
    while(1)
    {
        for(i=0;i<8;i++)    //循环8次,显示8列数据
        {
            MatrixLED_ShowColumn(i,Animation[i+Offset]);
        }
        Count++;            //计次延时
        if(Count>15)
        {
            Count=0;
            Offset+=8;      //偏移+8,切换下一帧画面
            if(Offset>16)
            {
                Offset=0;
            }
        }
    }
}
​
相关推荐
爱勇宝4 小时前
第 1 章:别把“需求文档”当成真正的需求
前端·后端·程序员
IT_陈寒9 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
易协同低代码10 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo10 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志11 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..11 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects11 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰11 小时前
一些基础和问题解决
后端
陈随易11 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN11 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp