(51单片机)点阵屏LED显示图片(点阵屏LED教程)(74Hc595教程)

源代码

如上图将3个文放在Keli5 中即可,然后烧录在单片机中就行了

烧录软件用的是STC-ISP,不知道怎么安装的可以去看江科大的视频:

【51单片机入门教程-2020版 程序全程纯手打 从零开始入门】https://www.bilibili.com/video/BV1Mb411e7re?p=2\&vd_source=ada7b122ae16cc583b4add52ad89fd5e

源代码:

++头文件要记得宏定义和重定义,避免重复调用:++

cpp 复制代码
#ifndef _Timer0_h_//名字根据文件名定义即可
#define _Timer0_h_

//声明函数......

#endif

main.c

cpp 复制代码
#include <STC89C5xRC.H>
#include "Delay.h"

sbit RCK=P3^5;//RCLK上升沿锁存,保存数据
sbit SCK=P3^6;//SCLK上升沿移位,往下推送数据
sbit SER=P3^4;//SER数据

void _74Hc595_WriteByte(unsigned char Byte){
	unsigned char i;//定义循环次数和移位
	for(i=0;i<8;i++){
		SER=Byte&(0x80>>i);//右移:1000 0000->0100 0000以此类推
		SCK=1;//高电平,高低变化通电,下移数据
		SCK=0;//再次低电平
	}
	RCK=1;//高电平,高低变化通电,保存数据
	RCK=0;//再次低电平
}

void MatrixLED_ShowColumn(unsigned char Column,Data){
	_74Hc595_WriteByte(Data);//SER数据,控制LED点阵屏(竖着看),0亮1不亮
	P0=~(0x80>>Column);//表示第几列
	Delay(1);//间隔,防止行列串起来
	P0=0xFF;//列清,防止行列串起来
}

void main(){
	SCK=0;//低电平
	RCK=0;//低电平
	while(1){
		MatrixLED_ShowColumn(0,0x38);
		MatrixLED_ShowColumn(1,0x7C);
		MatrixLED_ShowColumn(2,0x7E);
		MatrixLED_ShowColumn(3,0x3F);
		MatrixLED_ShowColumn(4,0x3F);
		MatrixLED_ShowColumn(5,0x7E);
		MatrixLED_ShowColumn(6,0x7C);
		MatrixLED_ShowColumn(7,0x38 );
	}
}

Delay.c

cpp 复制代码
//Delay.c

#include <STC89C5xRC.H>
#include <INTRINS.H>

//延时函数
void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms){
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

Delay.h

cpp 复制代码
//Delay.h

#ifndef __Delay_H__
#define __Delay_H__

//延时函数头文件
void Delay(unsigned int xms);
#endif

代码解析与教程:

main.c
  • 注释解释很清楚,看起来有点繁琐,是因为没有模块化,后续可以进行模块化

下面来进行分析

  • 第一部分是进行74Hc595初始化定义;
  • 第二部分是74Hc595写入数据的函数;
  • 第三部分是点阵屏LED的展示函数;
Dealy模块
  • 包含源代码与头文件,不需要知道怎么实现的会用即可,后续使用,直接将头文件和源代码拿过来用即可;


xms是定义的毫秒,1000毫秒就是1秒;模版生成的是1毫秒的,因此xms等于1000

74Hc959、LED点阵屏教程

由于单片机系列版本不一样,单片机核心控制可能会有不同,例如:有些单片机的LED的L1是P21,有些就是P2_1,需要看单片机核心,或者头文件:

同理:LED点阵屏的按键就是P0;

++可以看到我的STC89C52RC是P0;++

74Hc595教程
  • 先看原理图:

  • ++运行之前需要将51单片机上的J24连接2,3;也就是OE,GND,不然点阵屏LED无法显示,想要显示点阵屏LED,必须先配置好74Hc959;++

  • 由图可知,P35对应的是RCLK,同理可得SRCLK,SER的地址,作用如下:

    cpp 复制代码
    sbit RCK=P3^5;//RCLK上升沿锁存,保存数据
    sbit SCK=P3^6;//SCLK上升沿移位,往下推送数据
    sbit SER=P3^4;//SER数据
    • 下面来看一张图
    • 图中可以知道,SER是写入数据的,然后通过SERCLK(SRCLK)来进行向下移位,再然后通过RCLK来锁定数据,以此类推;在填满8个数据后,整体向右移位赋值,这些Q开头的值,就是LED点阵屏对应的行值;需要注意的是,先填的数在最下面!!!!
    • 听不懂没关系,看图:
    • 由图可知,Q开头的值就是对应D开头的行值,;例如QH=D0;
  • 了解上述知识点之后,下面开始初始化:

    cpp 复制代码
    #include <STC89C5xRC.H>
    #include "Delay.h"
    
    sbit RCK=P3^5;//RCLK上升沿锁存,保存数据
    sbit SCK=P3^6;//SCLK上升沿移位,往下推送数据
    sbit SER=P3^4;//SER数据
    
    void _74Hc595_WriteByte(unsigned char Byte){
    	unsigned char i;//定义循环次数和移位
    	for(i=0;i<8;i++){
    		SER=Byte&(0x80>>i);//右移:1000 0000->0100 0000以此类推
    		SCK=1;//高电平,高低变化通电,下移数据
    		SCK=0;//再次低电平
    	}
    	RCK=1;//高电平,高低变化通电,保存数据
    	RCK=0;//再次低电平
    }
    
    void MatrixLED_ShowColumn(unsigned char Column,Data){
    	_74Hc595_WriteByte(Data);//SER数据,控制LED点阵屏(竖着看),0亮1不亮
    	P0=~(0x80>>Column);//表示第几列
    	Delay(1);//间隔,防止行列串起来
    	P0=0xFF;//列清,防止行列串起来
    }
    
    void main(){
    	SCK=0;//低电平
    	RCK=0;//低电平
    	while(1){
    		MatrixLED_ShowColumn(0,0x38);
    		MatrixLED_ShowColumn(1,0x7C);
    		MatrixLED_ShowColumn(2,0x7E);
    		MatrixLED_ShowColumn(3,0x3F);
    		MatrixLED_ShowColumn(4,0x3F);
    		MatrixLED_ShowColumn(5,0x7E);
    		MatrixLED_ShowColumn(6,0x7C);
    		MatrixLED_ShowColumn(7,0x38 );
    	}
    }

    先定义SER,SRLCK,RLCK的地址,因为头文件中有了,所以这里用其他名字表示;根据上述图片看,SER是P35,同理得到其他的。

  • 然后先在main函数中将SRCLK和RCLK初始化成低电平的0,这样在将他们定义成1后,就会产生电位差,从而通电,之后重新定义成0(低电平),为下次的填写数据进行准备,一共填写8次,8次填满后,就会右移,然后作为Byte(就是数据)使用,也就是LED点阵屏的Data(行)。

  • 现在有了行了,要定义列;列的话就是P0,P0=0111 1111,就是P07=0,以此类推。P06就是1011 1111。代码中,P0=~(0x80>>Column);就是通过右移来改变P0的值;例如:Column=1时,P0=0111 1111>>1011 1111,以此类推,就可以通过Column来定义列了。

LED点阵屏教程
  • 在此之前,必须要了解74Hc959的相关知识,然后知道行列后,再看下面的
  • 先看原理图: LED点阵屏是高电位,设定为0就是通电
  • P0就是16进制的LED点阵屏灯总控制,听不懂没关系,看图:
  • 满足上面的两个条件,才能亮,比如图中的D6=1,P06等于0,这个灯就会亮了
软件介绍:

因为每次想要点亮灯,都要计算,非常难算;因此介绍一个软件:

通过上面标识的来操作,就可以自动生成代码,软件使用的教程在江科大的视频里有:

【51单片机入门教程-2020版 程序全程纯手打 从零开始入门】https://www.bilibili.com/video/BV1Mb411e7re?p=21\&vd_source=ada7b122ae16cc583b4add52ad89fd5e

软件在:

软件安装包、开发板资料、课件及程序源码下载链接:https://jiangxiekeji.com/download.html

效果视频:

LED点阵屏图片展示

注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处。如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我。上述内容全是我自己理解的,如果你有别的想法,或者认为我的理解不对,欢迎指出!!!如果可以,可以点一个免费的赞支持一下吗?谢谢各位彦祖亦菲!!!!!

相关推荐
youcans_5 小时前
【嵌入式软件AI编程】(3)面向 AI 协同开发的 STM32 硬件信息标准化
人工智能·stm32·嵌入式硬件·ai编程
Pniubi5 小时前
Java为什么要分堆和栈
java·开发语言
小小晓.6 小时前
Qt 对话框、QLineEdit 与布局管理实战详解
开发语言·qt
炸薯条!6 小时前
博客系统测试报告
开发语言·lua
Evand J6 小时前
【MATLAB例程12】永磁同步电机基于增广无迹卡尔曼滤波的未知负载转矩在线观测
开发语言·matlab
时间的拾荒人7 小时前
CMake 实战指南:从基础语法到静态库/动态库制作与链接
开发语言·c++·面试
智者知已应修善业7 小时前
【51单片机实现从下到上,从上到下,从中间到两边,两边到中间】2024-10-23
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
xyouyuweizhu8 小时前
Java InetAddress 详解:从 IP 地址表示到主机名解析
java·开发语言·python
辰哥单片机设计8 小时前
STM32智能药盒丨2027单片机新项目
stm32·单片机·嵌入式硬件