(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点阵屏图片展示

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

相关推荐
noravinsc14 分钟前
python提升图片清晰度
开发语言·python
假女吖☌22 分钟前
Maven 编译指定模版
java·开发语言·maven
水w3 小时前
【Python爬虫】简单案例介绍1
开发语言·爬虫·python
FreakStudio5 小时前
一文速通 Python 并行计算:07 Python 多线程编程-线程池的使用和多线程的性能评估
python·单片机·嵌入式·多线程·面向对象·并行计算·电子diy
qq_365911605 小时前
GPT-4、Grok 3与Gemini 2.0 Pro:三大AI模型的语气、风格与能力深度对比
开发语言
虔城散人6 小时前
C语言 |位域结构体
c语言
Susea&7 小时前
数据结构初阶:队列
c语言·开发语言·数据结构
慕容静漪7 小时前
如何本地安装Python Flask并结合内网穿透实现远程开发
开发语言·后端·golang
ErizJ7 小时前
Golang|锁相关
开发语言·后端·golang
GOTXX7 小时前
【Qt】Qt Creator开发基础:项目创建、界面解析与核心概念入门
开发语言·数据库·c++·qt·图形渲染·图形化界面·qt新手入门