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

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

相关推荐
Scott9999HH4 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海5 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区9 小时前
怎么把C语言学到精通?
c语言·开发语言
sramdram9 小时前
MCU微控制器OA打印机方案
单片机·嵌入式硬件·mcu·mcu微控制器
心平气和量大福大9 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai10 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜10 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript