点阵
首先来介绍一下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)接高电平,那么第一列就会点亮。由此可见,LED
点阵的使用也是非常简单的。如下图:
从上图中可以看出,该电路是集成的,电路中的 RE57~RE64 是 LED 点阵的第
1-8 列,通过 P0 IO 口控制。RE8~RE64 是 LED 点阵的第 1-8 行,通过 74HC595
进行控制。DPa-DPh 是 LED 点阵的 8 行控制管脚,通过动态数码管模块中的
74HC245 进行驱动,这些行的引出端子都是 LED 的阴极。
根据前面介绍我们知道,88LED 点阵共有 64 个 LED,如果仅使用单片机 IO
口来驱动可能效果不是很好,为了能够有效驱动 88LED 点阵且最大减少 IO 口的
占用,我们使用前面介绍的 74HC595 模块。74HC595 模块电路在前面已做介绍,
通过较少的 IO 口即可控制较为复杂的电路。
由于 74HC595 模块电路是集成的,所以使用单片机 P34~P36 管脚即可,
8X8LED 点阵模块电路也是集成的,所以列控制使用单片机 P0 管脚控制即可
如何显示自己心仪的图形
在这里我们要借助于取字模软件,借助这个软件我们可以轻松的得到控制显示图案的段码。点阵就是由64个led灯组成的,所以他的发光原理其实和数码管差不多。接下来就是取字模软件的使用。
1.下载取字模软件
2.打开软件后,首先选择“基本操作->新建图像”,设置图像的宽度和高度为 8,点击确定后将在显示窗口出现一个 8* 8 的白色格子,这个就类似于我们的 8*8LED 点阵了,具体操作如下:
3. 然后可以在这个 8*8 白色格子里面点击,点击后即会在对应位置出现一个黑点,表示在 LED 点阵对应位置显示,未点击位置(白色)表示 LED 点阵对应位置不显示。
参数设置》其他选项,具体操作如下
取模方式C51
将生成的代码放入下面数组中
u8 ledduan[]={0x78,0xFC,0x7E,0x3F,0x3F,0x7E,0xFC,0x78};
/**************************************************************************************
* 8*8LED点阵———显示数字实验 *
实现现象:下载程序后点阵上显示数字0
注意事项:一定要将J24短接片短接到GND端。
***************************************************************************************/
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
u8 ledduan[]={0x78,0xFC,0x7E,0x3F,0x3F,0x7E,0xFC,0x78};
u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函数名 : Hc595SendByte(u8 dat)
* 函数功能 : 向74HC595发送一个字节的数据
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Hc595SendByte(u8 dat)
{
u8 a;
SRCLK=0;
RCLK=0;
for(a=0;a<8;a++)
{
SER=dat>>7;
dat<<=1;
SRCLK=1;
_nop_();
_nop_();
SRCLK=0;
}
RCLK=1;
_nop_();
_nop_();
RCLK=0;
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u8 i;
while(1)
{
P0=0x7f;
for(i=0;i<8;i++)
{
P0=ledwei[i]; //位选
Hc595SendByte(ledduan[i]); //发送段选数据
delay(100); //延时
Hc595SendByte(0x00); //消隐
}
}
}
这里也需要了解译码器的知识,可以参考38译码器
热爱知识,传播学习!