51单片机 | 您所在的位置:网站首页 › 51单片机驱动显示屏 › 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 点阵是由发光二极管排列组成的显示器件,在我们日常生活的电器中随 处可见,被广泛应用于汽车报站器,广告屏等。 通常应用较多的是 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单片机中的位置。 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 #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>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;ji);//优先传输一个字节中的高位;依次传递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>column); Delay1ms(1);//延迟显示 P0=0XFF;//消隐,段选消隐; } void main ()//定义主函数 { unsigned char i,j,count=0; _74HC595_Init_();//74HC595初始化; while (1) { for(i=0;i10) { count=0; j++;//运行十次后,切换下一帧 if(j>40)//切换至超过所有运行次数;进行清零,从头开始运行循环; j=0; } } }delay.c #include //头文件,延时函数中含有_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 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>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单片机实现了相关的实验。大家在学习完后,一定一定要自己多加练习,熟能生巧!!! 创作不易,还请大家多多点赞支持👍!!! |
CopyRight 2018-2019 实验室设备网 版权所有 |