写在前面:本节我们学习了点阵屏的工作原理,学习相关的驱动芯片74HC959,熟悉相关电路,以及取模软件的学习,通过51单片机实现了相关的实验。点阵屏逐行显示,点阵屏显示“♥”型图案以及点阵屏实现流动字幕;
在前面的实验中,我们直接使用IO口控制了许多外设,这些外围设备占据了许多IO口,而我们知道,51单片机的IO口是十分有限的,如果想要连接更多的外设,就需要对IO口进行扩展实现。本节我们使用一种IO口扩展方式—串转并,使用的芯片是74HC595,连接51单片机的LED点阵屏模块。
实验目录:
1、点阵屏逐行显示;
2、点阵屏显示“♥”型图案;
3、点阵屏实现流动字幕;
目录
一、硬件部分
1.1 LED点阵屏介绍
LED 点阵是由发光二极管排列组成的显示器件,在我们日常生活的电器中随 处可见,被广泛应用于汽车报站器,广告屏等。
通常应用较多的是 8*8 点阵结构,然后使用多个 8*8 点阵可组成不同分辨率的 LED 点阵显示屏,比如 16*16 点阵可以使用 4 个 8*8 点阵构成。其内部结构图如下所示:
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口扩展。
74HC595的电路图如上图所示,所包含的引脚功能如下表所示:
引脚 | 功能说明 |
OE | 芯片开关,低电平有效,输出使能; |
SRCLR | 串行清零端,低电平时,串行输入的数据清零; |
RCLK | 存储器时钟,上升沿,数据由移位寄存器移至数据存储器中; |
SRCLK | 移位时钟,上升沿时串行数据在寄存器的数据移位; |
SER | 串行数据输入端; |
OH’ | 点阵屏扩展连接口; |
OA-OH | 并行数据输出端; |
VCC | 高电平; |
GND | 接地端; |
74HC595工作示意图
74HC595工作流程
74HC595芯片的工作流程如上图:
首先由SER端口输入串行数据8位(即连续的,一位跟着一位)。SRCLK时钟初始化后为低电平,当SRCLK受到一个上升沿信号时,串行数据就向移位寄存器中下移移位,直至8个上升沿信号,8位串行数据全部进入移位寄存器。RCLK时钟初始化后为低电平,当RCLK受到一个上升沿信号时,移位寄存器的8位数据全部并行移位至数据存储缓冲器,再经OA-OH进行输出(实现3线8 位串行输入、并行输出);数据输入的时候是高位先输入,低位后输入。
如果移位寄存器8位填满后,继续进行SRCLK受到一个上升沿信号,数据进行移位,OH’此时若连接下一片芯片的SER,则数据就会移至下一片芯片,从而实现数据多位扩展;
点阵屏与74HC595在51单片机中的位置。
二、原理图
2.1 LED点阵屏电路图
8*8 点阵共由 64 个发光二极管组成,且每个发光二极管是放置在行线和列线 的交叉点上。其中64个发光二极管的阴极都是由P0口进行控制的,而64只发光二极管的阳极是由74HC595输出端OA–OH控制。
2.2 74HC595电路图
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 点阵.
2、上图 8*8 点阵区域非常小,我们可以将其放大,选择“模拟动画”, 后点击“放大格点“
3、 8*8 白色格子里面点击,点击后即会在对应位置出现一 个黑点,表示在 LED 点阵对应位置的 LED 灯点亮,未点击位置(白色)表示 LED 点阵对应位置的 LED 灯熄灭。设置取模数据的取模方式等内容,选择“参数设置”后点击“其他 选项”,
4、 点击“取模方式”,选择 C51 格式选项,然后在点阵生成区自动会 生成数字字符对应的数据(如果是使用汇编编程,那么汇编对应的汉字数据 可选择 A51 格式)。
四、软件设计
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);
实验现象:
4.3 点阵屏实现流动字幕;
实现的功能:点阵屏逐帧显示,达到流动字母“China!”的效果;
实现流程:
逐帧进行显示,显示字符的列数远远大于8列,所以我们先显示前8列,停留一段时间,在显示紧接着的第二帧,依次第三帧等等。实现的方法就是对列进行不断的移位,如下面数组所示:
代码分享:
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