单片机控制点阵屏_led点阵显示屏编程

单片机控制点阵屏_led点阵显示屏编程写在前面:本节我们学习了点阵屏的工作原理,学习相关的驱动芯片74HC959,熟悉了相关电路,以及取模软件的学习,通过51单片机实现了相关的实验

写在前面:本节我们学习了点阵屏的工作原理,学习相关的驱动芯片74HC959,熟悉相关电路,以及取模软件的学习,通过51单片机实现了相关的实验点阵屏逐行显示,点阵屏显示“♥”型图案以及点阵屏实现流动字幕;

        在前面的实验中,我们直接使用IO口控制了许多外设,这些外围设备占据了许多IO口,而我们知道,51单片机的IO口是十分有限的,如果想要连接更多的外设,就需要对IO口进行扩展实现。本节我们使用一种IO口扩展方式—串转并,使用的芯片是74HC595,连接51单片机的LED点阵屏模块。

实验目录:

1、点阵屏逐行显示;

2、点阵屏显示“♥”型图案;

3、点阵屏实现流动字幕;

目录

一、硬件部分

1.1 LED点阵屏介绍

1.2 74HC595芯片介绍

二、原理图

2.1  LED点阵屏电路图

2.2 74HC595电路图

三、取模软件

四、软件设计

4.1 点阵屏逐行显示

4.2 点阵屏显示“♥”型图案

4.3 点阵屏实现流动字幕;


一、硬件部分

1.1 LED点阵屏介绍

        LED 点阵是由发光二极管排列组成的显示器件,在我们日常生活的电器中随 处可见,被广泛应用于汽车报站器,广告屏等。

单片机控制点阵屏_led点阵显示屏编程

        通常应用较多的是 8*8 点阵结构,然后使用多个 8*8 点阵可组成不同分辨率的 LED 点阵显示屏,比如 16*16 点阵可以使用 4 个 8*8 点阵构成。其内部结构图如下所示:

单片机控制点阵屏_led点阵显示屏编程

         8*8 点阵共由 64 个发光二极管组成,且每个发光二极管是放置在行线和列线 的交叉点上,当对应的某一行置 1 电平,某一列置 0 电平,则相应的二极管就亮; 如要将第一个点点亮,则 1 脚接高电平 a 脚接低电平,则第一个点就亮了;如果 要将第一行点亮,则第 1 脚要接高电平,而(a、b、c、d、e、f、g、h )这些 引脚接低电平,那么第一行就会点亮;如要将第一列点亮,则第 a 脚接低电平, 而(1、2、3、4、5、6、7、8)接高电平,那么第一列就会点亮。

1.2 74HC595芯片介绍

            74HC595 是一个 8 位串行输入、并行输出的位移缓存器,其中并行输出为三态输出(即高电平、低电平和高阻抗)。    可以用3根线输入串行数据,8根线输出并行数据,可输入16位、24位、32位等,常用于IO口扩展。

单片机控制点阵屏_led点阵显示屏编程

74HC595的电路图如上图所示,所包含的引脚功能如下表所示:

引脚 功能说明
OE 芯片开关,低电平有效,输出使能;
SRCLR 串行清零端,低电平时,串行输入的数据清零;
RCLK 存储器时钟,上升沿,数据由移位寄存器移至数据存储器中;
SRCLK 移位时钟,上升沿时串行数据在寄存器的数据移位;
SER 串行数据输入端;
OH’ 点阵屏扩展连接口;
OA-OH 并行数据输出端;
VCC 高电平;
GND 接地端;

 74HC595工作示意图

单片机控制点阵屏_led点阵显示屏编程

74HC595工作流程

         74HC595芯片的工作流程如上图:

        首先由SER端口输入串行数据8位(即连续的,一位跟着一位)。SRCLK时钟初始化后为低电平,当SRCLK受到一个上升沿信号时,串行数据就向移位寄存器中下移移位,直至8个上升沿信号,8位串行数据全部进入移位寄存器。RCLK时钟初始化后为低电平,当RCLK受到一个上升沿信号时,移位寄存器的8位数据全部并行移位至数据存储缓冲器,再经OA-OH进行输出(实现3线8 位串行输入、并行输出);数据输入的时候是高位先输入,低位后输入。

        如果移位寄存器8位填满后,继续进行SRCLK受到一个上升沿信号,数据进行移位,OH’此时若连接下一片芯片的SER,则数据就会移至下一片芯片,从而实现数据多位扩展;

        点阵屏与74HC595在51单片机中的位置。

单片机控制点阵屏_led点阵显示屏编程

二、原理图

2.1  LED点阵屏电路图

单片机控制点阵屏_led点阵显示屏编程

         8*8 点阵共由 64 个发光二极管组成,且每个发光二极管是放置在行线和列线 的交叉点上。其中64个发光二极管的阴极都是由P0口进行控制的,而64只发光二极管的阳极是由74HC595输出端OA–OH控制。

2.2 74HC595电路图

单片机控制点阵屏_led点阵显示屏编程

74HC595的相关内容在上面芯片介绍部分已经详细介绍了。

        从上图中可以看出,74HC595 需要用到的控制管脚 SER、RCLK、SRCLK 直接连 接到 51 单片机的 P3.4-P3.6 IO 口上,输出端则是直接连接到 LED 点阵模块的行端口上,即为 LED 发光二极管的阳极,LED 点阵的列则为发光二极管的阴极。

        要想控制 LED 点阵,可以将单片机管脚按照 74HC595 芯片的通信时序要求来传输数据,这样即可控制 LED 点阵的行数据。根据 LED 发光二极管导通原理,当阳极为高电平,阴极为低电平则点亮,否则熄灭。因此通过单片机 P0 口可控制点阵列,74HC595 可控制点阵行

三、取模软件

      点亮一个点很简单,可是如何点亮多个点呢?如果需要一次显示多个怎么 办?从原理图上可以看到每一行上都连接着多个 LED 灯,每一列上也都连接着 多个 LED 灯,如果要点亮一个,按照上面原理可以,但是要同时点亮多个怎么 办? 那么就需要用到动态数码管的动态扫描原理

        首先如何点亮一行上面多个灯 或者一列上面多个灯?明显需要某行或某列有效,同时使多列或多行有效。比如 在第一行有效(输出高电平)的情况下,有效列(输出低电平)与这一行交点上 的 LED 灯就会被点亮。那么实现一行或一列点亮会比较容易。如何实现不同行 不同列上的灯被多个点亮呢? 是否是行有效,列有效就可以?并不是! 要实现行列不同位置亮灯,需要使用动态显示的方法,也要结合扫描的方法。 在第一行亮灯一段时间以后灭掉,点亮第二行一段时间以后灭掉,点亮第三行一 段时间以后灭掉,如此点亮,直到八行全部点亮一次,在第一行点亮到最后一行 灭掉的总时间不能超过人肉眼可识别的时间,即 24 毫秒。在每一行点亮的时候, 给列一个新的数据,此时对应列的数据就可以体现在这行上要点亮的灯上。这样 就和动态数码管的显示一样,只不过数码管的 LED 灯是段值。这里使用 LED 点 阵显示数字,也是多个 LED 同时点亮。   

          要想在点阵上显示数字等字符,首先要获取在 LED 点阵上显示数字字符所需 的数据,即一个数字字符在 LED 点阵上显示,对应的每行每列都会有一些灯点亮 或者熄灭,这样就会构成一组数据,也就是数字字符的显示数据,我们只要将这 些数据通过 74HC595 发送到点阵对应的行或列就能显示数字字符。

        数字字符数据如何获取呢?这里给大家介绍一个非常好用的工具-取字模软件

链接:https://pan.baidu.com/s/16GOsWbbYZjv2nAmol6toxg 
提取码:1022

使用步骤:

1、“基本操作->新建图像”,设置图像的宽度和高 度为8,点击确定后将在显示窗口出现一个8*8的白色格子,这个就类似于8*8LED 点阵.

单片机控制点阵屏_led点阵显示屏编程

单片机控制点阵屏_led点阵显示屏编程 

2、上图 8*8 点阵区域非常小,我们可以将其放大,选择“模拟动画”, 后点击“放大格点“

单片机控制点阵屏_led点阵显示屏编程

3、 8*8 白色格子里面点击,点击后即会在对应位置出现一 个黑点,表示在 LED 点阵对应位置的 LED 灯点亮,未点击位置(白色)表示 LED 点阵对应位置的 LED 灯熄灭。设置取模数据的取模方式等内容,选择“参数设置”后点击“其他 选项”,

单片机控制点阵屏_led点阵显示屏编程

4、 点击“取模方式”,选择 C51 格式选项,然后在点阵生成区自动会 生成数字字符对应的数据(如果是使用汇编编程,那么汇编对应的汉字数据 可选择 A51 格式)。

单片机控制点阵屏_led点阵显示屏编程

 

四、软件设计

4.1 点阵屏逐行显示

实现功能:在点阵屏上逐行进行点灯;

代码分享

main.c

#include <REGX52.H>
#include "delay.h"



sbit SRCLK=P3^6;//移位寄存器时钟输入
sbit RCL=P3^5;//存储寄存器时钟输入
sbit SER=P3^4;//串行数据输入

unsigned char xunhuan[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/
/**
   *@breaf  74HC595写入数据函数,控制LED的行数;
   *@param data1为写入移位寄存器的数据,逐位写入,先写入高字节,再写入低字节 
   *@retval 无
   */
void __74HC595_write_data(unsigned char data1)
   {
		 unsigned char i;
		 for(i=0;i<8;i++)
			{
				SER=data1&(0x80>>i);//优先传输一个字节中的高位;依次传递8位数据;
				SRCLK=1;
				SRCLK=0;//移位寄存器时钟上升沿将端口数据送入寄存器中;
				}
				RCL=1;//满8位后进行传递;上升沿将寄存器的数据传递给LED矩阵;
				RCL=0;
			}
	 
void main ()
{
	 unsigned char j;
			SRCLK=0;//初始化
			RCL=0;
			P0=0x00;//列全为低电平;
		
	while (1)
		{
				for(j=0;j<8;j++)
		{			
			__74HC595_write_data(xunhuan[j]);//改变行号;
					Delay100ms(10);	
			__74HC595_write_data(0x00);
		}
	}
}

delay.c

void Delay100ms(unsigned char t)		//@11.0592MHz
{	
unsigned char i, j;
while(t--)
{
i = 180;
	j = 73;
	do
	{
		while (--j);
	} while (--i);
}
}

delay.h

#include "delay.c"
void Delay100ms(unsigned char t);

实验现象:

led点阵屏逐行显示

4.2 点阵屏显示“♥”型图案

实现的功能:在点阵屏上显示♥”型图案;实现方式,通过进行列扫描,显示对应图案每一列的LED灯,实现点阵屏的对应效果;

代码分享

main.c

#include <REGX52.H>
#include "delay.h"



sbit SRCLK=P3^6;//移位寄存器时钟输入
sbit RCL=P3^5;//存储寄存器时钟输入
sbit SER=P3^4;//串行数据输入

unsigned char xunhuan[]={0x38,0x7C,0x7E,0x3F,0x7E,0x7C,0x38,0x00};

/**
   *@breaf  74HC595写入数据函数,控制LED的行数;
   *@param data1为写入移位寄存器的数据,逐位写入,先写入高字节,再写入低字节 
   *@retval 无
   */
void __74HC595_write_data(unsigned char data1)
   {
		 unsigned char i;
		 for(i=0;i<8;i++)
			{
				SER=data1&(0x80>>i);//优先传输一个字节中的高位;依次传递8位数据;
				SRCLK=1;
				SRCLK=0;//移位寄存器时钟上升沿将端口数据送入寄存器中;
				}
				RCL=1;//满8位后进行传递;上升沿将寄存器的数据传递给LED矩阵;
				RCL=0;
			}
	 
			
void MatrixLED_Showcolumn(unsigned char column,Data)
{
	__74HC595_write_data(Data);
				P0=(~0x80>>column);
	 //Delay1ms(20);	
	Delay10us(10);
		//Delay100ms(1);	
				P0=0XFF;

}
void main ()
{
	 unsigned char j;
			SRCLK=0;//初始化
			RCL=0;
		//	P0=0x00;//列全为低电平;
		
	while (1)
		{
				for(j=0;j<8;j++)
		{			
		MatrixLED_Showcolumn(j,xunhuan[j]);//改变行号;
		}
	}
}

delay.c

void Delay100ms(unsigned char t)		//@11.0592MHz
{	
unsigned char i, j;
while(t--)
{
i = 180;
	j = 73;
	do
	{
		while (--j);
	} while (--i);
}
}

delay.h

#include "delay.c"
void Delay100ms(unsigned char t);

实验现象:

单片机控制点阵屏_led点阵显示屏编程

4.3 点阵屏实现流动字幕;

实现的功能:点阵屏逐帧显示,达到流动字母“China!”的效果;

实现流程:

      逐帧进行显示,显示字符的列数远远大于8列,所以我们先显示前8列,停留一段时间,在显示紧接着的第二帧,依次第三帧等等。实现的方法就是对列进行不断的移位,如下面数组所示:

单片机控制点阵屏_led点阵显示屏编程

代码分享:

main.c

#include "74HC595.h"
#include "delay.h"


//unsigned char arr[]={0X30,0X48,0X44,0X22,0X44,0X48,0X30,0X01};//每一列进行扫描时,对应的亮灯位置。

//unsigned char arr[]={0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81};
	unsigned char arr[]={
						0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
						0x3C,0x42,0x81,0x81,0x81,0x00,0xFF,0x08,
						0x10,0x10,0x0F,0x00,0x5F,0x00,0x0F,0x10,
						0x10,0x10,0x0F,0x00,0x0E,0x11,0x11,0x11,
						0x1E,0x01,0x00,0x00,0x7D,0x00,0x00,0x00,
						0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
						};
/**
   *@breaf 确定LED点阵亮的位置
   *@param column:列数,逐列扫描;Data:对应每一列亮灯的位置;
   *@retval无
   */
void MatrixLED_Showcolumn(unsigned char column,Data)
{
	__74HC595_write_data(Data);
				P0=(~0x80>>column);
			Delay1ms(1);//延迟显示
				P0=0XFF;//消隐,段选消隐;
}
	 
void main ()//定义主函数
{
		unsigned char i,j,count=0;
		_74HC595_Init_();//74HC595初始化;
	
		while (1)
			{
				for(i=0;i<8;i++)//确定一帧的画面;
				{
					MatrixLED_Showcolumn(i,arr[i+j]);
				}
				count++;//每一帧画面运行十次
				if(count>10)
				{
						count=0;
							j++;//运行十次后,切换下一帧
					if(j>40)//切换至超过所有运行次数;进行清零,从头开始运行循环;
						j=0;
				}
		}
	}  

delay.c

#include <intrins.h>//头文件,延时函数中含有_nop_,必须包含相应的头文件

/**
   *@breaf 延时函数,用于软件延时,延时的基本单位为1ms;
   *@param unsigned char t  用于确定延时的时间,基本单位是1ms;
   *@retva 无
   */
void Delay1ms(unsigned char t)		//@11.0592MHz,1ms
{
	unsigned char i, j;
	while(t--)
	{
					_nop_();
					i = 2;
					j = 199;
					do
					{
						while (--j);
					} while (--i);
			}
}

delay.h

#include "delay.c"
void Delay1ms(unsigned char t)	;

74HC595.c

#include <REGX52.H>

sbit SRCLK=P3^6;//移位寄存器时钟输入
sbit RCL=P3^5;//存储寄存器时钟输入
sbit SER=P3^4;//串行数据输入


/**
   *@breaf 对74HC595进行初始化包括移位寄存器与进位寄存器的初始化
   *@param无
   *@retval无
   */
void _74HC595_Init_()
{
	   SRCLK=0;//初始化,未初始化前,单片机默认端口为高电平;
	    RCL=0;
}

/**
   *@breaf  74HC595写入数据函数,控制LED的行数;
   *@param data1为写入移位寄存器的数据,逐位写入,先写入高字节,再写入低字节 
   *@retval 无
   */
void __74HC595_write_data(unsigned char data1)
   {
		 unsigned char i;
		 for(i=0;i<8;i++)
			{
				SER=data1&(0x80>>i);//优先传输一个字节中的高位;依次传递8位数据;
				SRCLK=1;
				SRCLK=0;//移位寄存器时钟上升沿将端口数据送入寄存器中;
				}
				RCL=1;//满8位后进行传递;上升沿将寄存器的数据传递给LED矩阵;
				RCL=0;
			}
	 

74HC595.h

#include "74HC595.c"

void _74HC595_Init_();
void __74HC595_write_data(unsigned char data1);

实验现象:

LED点阵屏显示动画

总结:我们通过本节认识了点阵屏的工作原理,学习了相关的驱动芯片74HC959,熟悉了相关电路,以及取模软件的学习,通过51单片机实现了相关的实验。大家在学习完后,一定一定要自己多加练习,熟能生巧!!!

创作不易,还请大家多多点赞支持👍!!!

今天的文章单片机控制点阵屏_led点阵显示屏编程分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84551.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注