1、LED点阵简介
1.1、什么是LED点阵
(1)外观
(2)作用
LED点阵通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片等,LED点阵显示被广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。
1.2、如何驱动LED点阵
以8*8LED点阵为例。
(1)单片机端口直接驱动。驱动8*8的点阵需要2个IO端口(16个IO口)。
(2)使用串转并移位锁存器驱动。如74HC595驱动,这种方式可以节约大量IO端口。
2、原理图
P595A接点阵COL(列) PIN(LED阴极),P595B接点阵ROW(行) PIN(LED阳极)。
3、74HC595芯片介绍
只是简略介绍,具体详细部分可结合数据手册和示例代码了解。
3.1、74HC595核心引脚
RCLK引脚:锁存时钟
SRCLK引脚:移位时钟
SER引脚:串行输入引脚
QA~QH引脚:并行输出引脚
QH`:串行输出口引脚,74HC595A的QH`输出引脚接74HC585B的SER串行输入引脚。
3.2、单片机与74HC595通信时序简介
(1)芯片与芯片之间进行通信,都是按照一定的时序进行的。
(2)时序就是芯片与芯片之间的通信引脚上电平变化,变化以时间轴为参考的变化顺序。
(3)时序是通信双方事先定义好的,通信的发送方必须按照时序来发送有意义的信息,通信的接收放按照时序去接收解析发送方发来的电平变化信息,然后就知道发送方要给接收方发送什么东西了。
(4)我们编程时:发送方是单片机,接收方是74HC595。因为595芯片本身不能编程,它的时序出厂时已经设定好了。因此单片机需要迁就595芯片,按照595线片的时序来给他发信息。
(5)74HC595芯片手册上有她的时序描述,参考描述便可明白595芯片的时序规则,然后将其用编程语言表述出来就是程序了。
(6)74HC595的时序关键是:SRCLK和RCLK。SRCLK是移位时钟,595芯片内部在每个SCLK的上升沿会对SER引脚进行一次采样输入,就向595内部输入了1位,如此循环8次就输入了8位二进制。RCLK是锁存时钟。
4、编程
4.1、编程点亮最上面一排
#include "reg52.h"
/*引脚位定义*/
sbit SER = P3^4; /*74HC595串行数据输入引脚*/
sbit RCLK_595 = P3^5; /*74HC595的锁存时钟引脚*/
sbit SRCLK = P3^6; /*74HC595的移位时钟*/
void main(void)
{
unsigned char i = 0;
unsigned char P595A_OUT = 0x01; // 接LED点阵行,阳级。
unsigned char P595B_OUT = 0x00; // 接LED点阵列,阴极。
SER =0;
RCLK_595 = 0;
SRCLK = 0;
for(i=0; i<8; i++)
{
SER = (P595A_OUT>>(7-i)) & 0x01;
SRCLK = 0;
SRCLK = 1; // 上升沿进行一次数据移入
}
for(i=0; i<8; i++)
{
SER = (P595B_OUT>>(7-i)) & 0x01;
SRCLK = 0;
SRCLK = 1; // 上升沿进行一次数据移入
}
RCLK_595 = 0;
RCLK_595 = 1; // 锁存时钟
while(1)
{
}
}
注:keil中就算while循环中没有内容也需要嘉while,因为不加会导致程序跑飞,不断重启循环,导致结果与预期不符。
4.2、封装LED点阵显示函数
#include "reg52.h"
/*宏定义*/
#define uchar unsigned char
/*引脚位定义*/
sbit SER = P3^4; /*74HC595串行数据输入引脚*/
sbit RCLK_595 = P3^5; /*74HC595的锁存时钟引脚*/
sbit SRCLK = P3^6; /*74HC595的移位时钟*/
/*函数声明*/
void LedLattice_Display(uchar P595A_OUT, uchar P595B_OUT); /*LEE点阵显示*/
void main(void)
{
//LedLattice_Display(0x0f,0x00); /*显示上面四行*/
//LedLattice_Display(0xf0,0x00); /*显示下面四行*/
//LedLattice_Display(0xff,0xfe); /*显示左边一列*/
//LedLattice_Display(0xff,0x7f); /*显示右边一列*/
LedLattice_Display(0x01,0xfe); /*点亮左上角一颗,0x01选择第一行,0x7f选择第一列*/
while(1)
{
}
}
/*
*功能:LED点阵显示
*参数:
* P595A_OUT:LED点阵行,阳极,最低为表示最上面一行 从上到下
* P595B_OUT:LED点阵列,阴极,最低位表示最左边一列 从左到右
*返回值:无
*/
void LedLattice_Display(uchar P595A_OUT, uchar P595B_OUT)
{
unsigned char i = 0;
//unsigned char P595A_OUT = 0x80; // 接LED点阵行,阳级。
//unsigned char P595B_OUT = 0x00; // 接LED点阵列,阴极。
SER =0;
RCLK_595 = 0;
SRCLK = 0;
for(i=0; i<8; i++)
{
SER = (P595A_OUT>>(7-i)) & 0x01;
SRCLK = 0;
SRCLK = 1; // 上升沿进行一次数据移入
}
for(i=0; i<8; i++)
{
SER = (P595B_OUT>>(7-i)) & 0x01;
SRCLK = 0;
SRCLK = 1; // 上升沿进行一次数据移入
}
RCLK_595 = 0;
RCLK_595 = 1; // 锁存时钟
}
4.3、显示 “中” 字
(1)什么是字模
为了记录组成字的LED点阵亮灭信息,就是用取模软件生成这些信息。8*8的点阵一共64个点,一次需要64位二进制,即8个字节来记录这些信息。
(2)取模软件介绍。
(3)取模方式
分为横向取模和纵向取模。
(4)代码。文章来源:https://www.toymoban.com/news/detail-435080.html
在不熟练是可以先显示一行,在显示两行,找到规律后再用循环来进行显示。文章来源地址https://www.toymoban.com/news/detail-435080.html
#include "reg52.h"
/*宏定义*/
#define uchar unsigned char
/*引脚位定义*/
sbit SER = P3^4; /*74HC595串行数据输入引脚*/
sbit RCLK_595 = P3^5; /*74HC595的锁存时钟引脚*/
sbit SRCLK = P3^6; /*74HC595的移位时钟*/
/*全局变量*/
uchar zhong[8] = {0x08,0x08,0x3E,0x2A,0x2A,0x3E,0x08,0x08}; /*横向取模*/
/*函数声明*/
void LedLattice_Display(uchar P595A_OUT, uchar P595B_OUT); /*LEE点阵显示*/
void main(void)
{
uchar i = 0;
while(1)
{
for(i=0; i<8; i++)
{
LedLattice_Display(0x01<<i,~zhong[i]);
}
}
}
/*
*功能:LED点阵显示
*参数:
* P595A_OUT:LED点阵行,阳极,最低为表示最上面一行 从上到下
* P595B_OUT:LED点阵列,阴极,最低位表示最左边一列 从左到右
*返回值:无
*/
void LedLattice_Display(uchar P595A_OUT, uchar P595B_OUT)
{
unsigned char i = 0;
//unsigned char P595A_OUT = 0x80; // 接LED点阵行,阳级。
//unsigned char P595B_OUT = 0x00; // 接LED点阵列,阴极。
SER =0;
RCLK_595 = 0;
SRCLK = 0;
for(i=0; i<8; i++)
{
SER = (P595A_OUT>>(7-i)) & 0x01;
SRCLK = 0;
SRCLK = 1; // 上升沿进行一次数据移入
}
for(i=0; i<8; i++)
{
SER = (P595B_OUT>>(7-i)) & 0x01;
SRCLK = 0;
SRCLK = 1; // 上升沿进行一次数据移入
}
RCLK_595 = 0;
RCLK_595 = 1; // 锁存时钟
}
到了这里,关于三、51单片机用74HC595控制LED点阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!