三、51单片机用74HC595控制LED点阵

您所在的位置:网站首页 单片机srclk 三、51单片机用74HC595控制LED点阵

三、51单片机用74HC595控制LED点阵

#三、51单片机用74HC595控制LED点阵| 来源: 网络整理| 查看: 265

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>(7-i)) & 0x01; SRCLK = 0; SRCLK = 1; // 上升沿进行一次数据移入 } for(i=0; i>(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>(7-i)) & 0x01; SRCLK = 0; SRCLK = 1; // 上升沿进行一次数据移入 } for(i=0; i>(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)代码。

在不熟练是可以先显示一行,在显示两行,找到规律后再用循环来进行显示。

#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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3