问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

51单片机控制LED点阵图动态显示

创作时间:
2025-01-22 02:24:02
作者:
@小白创作中心

51单片机控制LED点阵图动态显示

本文将详细介绍如何使用51单片机控制LED点阵图实现动态显示。内容包括硬件连接方式、74HC595寄存器的使用,以及具体的代码实现。

硬件连接

LED点阵图与数码管一样,有两种接法:共阴极和共阳极。不同的接法有不同的电路结构。本次使用的是共阴极连接,通过将P0=0x80,可以利用74HC595寄存器单独控制P07列的某盏灯。

74HC595寄存器配置

通过74HC595控制LED点阵图,具体实现代码如下:

Led.c

#include "Led.h"
#include <REGX52.H>
#include "Delay.h"

sbit RLK=P3^5; // RCLK P3=0XB0 0XB0^5=0XB5 =P3_5 存储寄存器时钟
sbit SCK=P3^6; // SERCLK 移位寄存器
sbit SER=P3^4; // SER 串行数据

void Led_Init() // 初始化
{
    SCK=0;
    RLK=0;
}

void _74HC595_WriteByte(unsigned char Byte) // 写入一个字节
{
    unsigned char i;
    for(i=0;i<8;i++) // 函数循环8次 (8位寄存器)
    {
        SER=Byte&(0X80>>i); // 非0即1 每运行1次,数据整体右移1位
        SCK=1; // SCK移位寄存器上升沿时 SER数据写入移位寄存器
        SCK=0;
    }
    RLK=1; // RLK存储寄存器上升沿时,数据从移位寄存器转存储存寄存器
    RLK=0; // 置0
}

void LED_Show(unsigned char Column, Data) // 列(位选) 行(段选
{
    _74HC595_WriteByte(Data); // 段选 通过74hC595串行数据口SER控制
    P0=~(0X80>>Column); // 位选,通过向右移位的方式控制点阵屏的8列
    Delay(1);
    P0=0XFF; // 消影
}

Led.h

#ifndef __LED_H__
#define __LED_H__

void LED_Show(unsigned char Column, Data);
void Led_Init();

#endif

main.c

#include <REGX52.H>
#include "Delay.h"
#include "Led.h"

// 显示图像数组地址
unsigned char code TuRam[]=
{
    0x00,0x00,0x20,0x11,0x12,0x7C,0x7F,0x18, // 1帧
    0x00,0x00,0x08,0x11,0x12,0x7C,0x7F,0x30,
    0x00,0x20,0x11,0x12,0x7E,0x7F,0x18,0x00,
    0x00,0x08,0x11,0x12,0x7E,0x7F,0x10,0x30,
};

void main()
{
    unsigned char i, offset, count;
    Led_Init(); // led点阵屏初始化
    while(1)
    {
        for(i=0;i<8;i++)
        {
            LED_Show(i, TuRam[i+offset]); // i+偏移量  offset 1个1个刷新
        }
        count++;
        // 扫描8次,当count>8 offset++偏移1位。
        // 相当于定时器作用,也可以在timer中 配置时间让offset++代替
        if(count>8)
        {
            count=0;
            offset+=8; // offset可以偏移多少位由实际显示内容设置 所显示为8*8 一帧图片一帧传
            if(offset>24)
            {
                offset=0;
            }
        }
    }
}

数据存储优化

为了节省内存,可以将数据放在Flash中。具体方法是将:

unsigned char TuRam[]

改为:

unsigned char code TuRam[]

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号