Arduino程序设计(十一)8×8 共阳极LED点阵显示(74HC595)

news2024/11/17 19:31:46

8×8 共阳极LED点阵显示

  • 前言
  • 一、74HC595点阵模块
    • 1、74HC595介绍
    • 2、74HC595工作原理
    • 3、1088BS介绍
    • 4、74HC595点阵模块
  • 二、点阵显示实验
    • 1、点阵显示初探
    • 2、点阵显示进阶
    • 3、点阵显示高阶
      • 3.1 点阵显示汉字(方法1)
      • 3.2 点阵显示汉字(方法2)
  • 补充


前言

  • 本文主要介绍8×8 共阳极LED点阵显示实验,分别是:
  • 1、介绍74HC595点阵模块;
  • 2、点阵显示指定行列LED;
  • 3、点阵显示汉字。

一、74HC595点阵模块

  • 由1个8x8共阳极点阵1088BS和2个74HC595组成,通过SPI方式与单片机通信。

1、74HC595介绍

  • 74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。

  • (1)74HC595D引脚介绍及工作范围
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • (2)逻辑图:
    在这里插入图片描述

  • (3)时序图:
    在这里插入图片描述

  • (4)功能框图:
    在这里插入图片描述

  • 注意:74HC595的移位特性是串行输入,并行输出

2、74HC595工作原理

  • (1)74HC595引脚图

在这里插入图片描述

  • (2)74HC595D、74HC595和74HC595点阵模块的引脚对照表如下:
引脚编号74HC595D74HC59574HC595点阵模块功能介绍
15Q0QA\一位并行输出位
1~7Q1~Q7QB~QH\七位并行输出位
8GNDVSSGND电源地
9Q7’QH’\级联位,若输入位数大于8位,先进入的位会从此口连续输出,用于多片之间的级联
10MRSRCLR5V主复位,低有效,一般直接接到VCC拉高
11SH_CPSRCLKCLK移位寄存器时钟输入
12ST_CPRCLKLE存储寄存器时钟输入
13OEOEGND输出使能位,低有效,一般全程给低电平
14DSSERDI串行数据输入位
16VCCVDD5V电源5V
  • (3)74HC595工作原理介绍
    在这里插入图片描述

  • ① 在SRCLK上升沿时,来自SER的数据可以存入移位寄存器。移位寄存器只有8位,如果数据溢出,溢出的数据从QH’输出(图中用空心箭头表示)。

  • ② 在RCLK上升沿时,移位寄存器的8位数据全部传给存储寄存器(图中用虚线表示)。此时如果OE是低电平,8位数据会并行输出。

  • ③ SRCLR在低电平时可以清空移位寄存器,一般只在第一次安全上电时拉低,其它时间置高。OE在低电平时允许输出,高电平输出三态。三态既不是高电平,也不是低电平,被称为高阻态。实际应用时OE常常设为低电平。

  • ④ 假设来自于控制芯片的数据是ABCD EFGH,每个字母表示1bit数据,非0即1。那么会把高位的数字A最先存入移位寄存器,第1个数据会从QH输出,存入的第8个数据会从QA输出。

  • ⑤ QH’ 的级联作用

  • a. 应用场景:8×8 共阳极LED点阵1088BS,驱动此点阵共需要8位段选端8位位选端,共16位串行数据输入。

  • b. 移位过程:SER 的数据输入端串行输入时,在 SRCLK 的上升沿将数据移入移位寄存器内,每个 SRCLK 上升沿移入一位单bit数据,最先输入的一直向后移直到8个 SRCLK 上升沿后,移位寄存器填满,此时若数据输入端还有数据输入,下一个 SRCLK 上升沿到来时,最先输入的1bit数据就会从 QH’ 输出(此处可理解为队列,先进先出)。在RCLK的上升沿,数据会从移位寄存器进入存储寄存器中,当OE低有效时,存储寄存器中的值从 QA ~ QH 并行输出。

  • c. 级联实现:将第一片 74HC595 的 QH’ 串行输出端接到第二片的数据输入端 SER ,实现级联功能。经过16个时钟SRCLK 上升沿后,数据已经全部移位进入移位寄存器,一次共输入16位数据,那么第一位输入的串行数据会在第二片 74HC595 芯片的 QH 输出,此时给一个上升沿的 SRCLK 信号就可以将信号移入存储寄存器,OE 信号持续给低, 即可输出。

3、1088BS介绍

  • (1) LED点阵屏简介:

  • 通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片、动画、视频等,LED点阵显示屏制作简单,安装方便,被广泛应用于各种公共场合,如汽车报站器、广告屏、银行窗口屏、叫号屏以及停车系统等。

  • (2) 1088BS实物图:
    在这里插入图片描述

  • (3) 内部结构:
    在这里插入图片描述
    在这里插入图片描述

  • (4) LED点阵模块共阳极和共阴极区分:

  • ① 根据其内部接线方式被分为两种:共阳极(BS)和共阴极(AS)。

  • ② 共阳极即每个LED管的阳极共接在行线上,列输入的信号为1不亮,为0亮。

  • ③ 共阴极和共阳极模块相反,每个LED管的阴极共接在行线上,列输入的信号为0不亮,为1亮。

  • ④ 一般只需根据点阵第一个引脚的极性来定义,第一个引脚为阳极则为共阳,反之则为共阴。

4、74HC595点阵模块

  • (1)74HC595点阵模块实物图:
    在这里插入图片描述
  • (2)74HC595点阵模块原理图:
    在这里插入图片描述
  • (3)引脚说明与接线
  • ① 引脚说明:
74HC595点阵模块功能说明
DI串行数据输入
LE锁存器时钟输入
CLK移位寄存器时钟输入
NC空脚,不接
VCC模块供电接口,可用单片机的5V电源口供电
GND电源地
  • ② 与Arduino UNO R3开发板接线:
74HC595点阵模块Arduino UNO R3
DID8
LED9
CLKD10
VCC5V
GNDGND

二、点阵显示实验

1、点阵显示初探

  • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

  • (2)点阵显示初探的电路图,如下图所示:
    在这里插入图片描述

  • (3)实现功能:点亮8*8共阳极点阵的第一个LED灯,LED位置(1,1)。

代码实现:

//8*8共阳极点阵实验
//点亮8*8共阳极点阵的第一个LED灯,LED位置(1,1)

#define DIO 8      //DI
#define S_CLK 10   //CLK
#define R_CLK 9   //LE

void setup()
{
  pinMode(DIO, OUTPUT);
  pinMode(S_CLK, OUTPUT);
  pinMode(R_CLK, OUTPUT);
}

void loop()
{
  //ROW 0x80 , COL 0xfe
  int i, dat;//i循环次数  dat需要发送的数据
  dat = 0xfe;//发送列值
  for (i = 0; i < 8; i++) //循环8次
  {
    digitalWrite(S_CLK, LOW);
    digitalWrite(R_CLK, LOW);

    if (dat & 0x01) //发送1
    { 
      digitalWrite(DIO, HIGH);
    }
    else      //发送0
    { 
      digitalWrite(DIO, LOW);
    }
    digitalWrite(S_CLK, HIGH);
    dat >>= 1;//数据右移
  }
  dat = 0x80;//发送行值
  for (i = 0; i < 8; i++) //循环8次
  {
    digitalWrite(S_CLK, LOW);
    digitalWrite(R_CLK, LOW);

    if (dat & 0x01) //发送1
    { 
      digitalWrite(DIO, HIGH);
    }
    else      //发送0
    { 
      digitalWrite(DIO, LOW);
    }

    digitalWrite(S_CLK, HIGH);
    dat >>= 1;//数据右移
  }

  digitalWrite(R_CLK, HIGH);
}

  • (4)实现现象:
    在这里插入图片描述

2、点阵显示进阶

  • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

  • (2)点阵显示进阶的电路图,如下图所示:
    在这里插入图片描述

  • (3)实现功能:8*8共阳极点阵,点亮指定行列LED。

代码实现:

//8*8共阳极点阵实验
//8*8共阳极点阵,点亮指定行列LED

#define DI 8
#define CLK 10
#define LE 9

int number[16]={1,0,0,1,1,1,0,0,1,0,1,0,1,0,1,1};//列数据10011100,行数据10101011

void setup()
{
  pinMode(DI, OUTPUT);
  pinMode(CLK, OUTPUT);
  pinMode(LE, OUTPUT);
}

void loop()
{
  digitalWrite(LE, LOW);//存储寄存器时钟输入,串行输入数据时置0
  
  for (int i = 0; i < 16; i++)
  {
    DI_data(number[i]);//先发送列数据,再发送行数据
  }

  digitalWrite(LE, HIGH);//存储寄存器时钟输入,并行输出数据时置1
}

void DI_data(int num)
{
  digitalWrite(CLK, LOW);//移位寄存器时钟输入,CLK为低电平
  digitalWrite(DI, num);//串行数据输入
  digitalWrite(CLK, HIGH);//CLK上升沿,DI发送数据
}
  • (4)实现现象:
    在这里插入图片描述

3、点阵显示高阶

3.1 点阵显示汉字(方法1)

  • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

  • (2)点阵显示汉字(方法1) 的电路图,如下图所示:
    在这里插入图片描述

  • (3)实现功能:不用shiftOut函数,点阵显示汉字“中”。

代码实现:

//8*8共阳极点阵实验
//不用shiftOut函数,点阵显示汉字“中”

#define DI 8
#define CLK 10
#define LE 9

uint8_t ROW[8][8] = {
  {0, 1, 1, 1, 1, 1, 1, 1}, //第一列
  {1, 0, 1, 1, 1, 1, 1, 1}, //第二列
  {1, 1, 0, 1, 1, 1, 1, 1}, //第三列
  {1, 1, 1, 0, 1, 1, 1, 1}, //第四列
  {1, 1, 1, 1, 0, 1, 1, 1}, //第五列
  {1, 1, 1, 1, 1, 0, 1, 1}, //第六列
  {1, 1, 1, 1, 1, 1, 0, 1}, //第七列
  {1, 1, 1, 1, 1, 1, 1, 0}  //第八列
};

uint8_t COL[8][8] = {           //汉字“中”
  {0, 0, 0, 1, 0, 0, 0, 0}, //第一行
  {0, 0, 0, 1, 0, 0, 0, 0}, //第二行
  {1, 1, 1, 1, 1, 1, 1, 0}, //第三行
  {1, 0, 0, 1, 0, 0, 1, 0}, //第四行
  {1, 1, 1, 1, 1, 1, 1, 0}, //第五行
  {0, 0, 0, 1, 0, 0, 0, 0}, //第六行
  {0, 0, 0, 1, 0, 0, 0, 0}, //第七行
  {0, 0, 0, 1, 0, 0, 0, 0}  //第八行
};

void setup()
{
  pinMode(DI, OUTPUT);
  pinMode(CLK, OUTPUT);
  pinMode(LE, OUTPUT);
}

void loop()
{
  for (int z = 0; z < 8; z++)
  {
    ROW_COL(z);
  }
}

void DI_data(int num)
{
  digitalWrite(CLK, LOW);//移位寄存器时钟输入,CLK为低电平
  digitalWrite(DI, num);//串行数据输入
  digitalWrite(CLK, HIGH);//CLK上升沿,DI发送数据
}

void ROW_COL(int k)
{
  digitalWrite(LE, LOW);//存储寄存器时钟输入,串行输入数据时置0

  for (int i = 0; i < 8; i++)
  {
    DI_data(ROW[k][i]);//发送列数据
  }

  for (int j = 0; j < 8; j++)
  {
    DI_data(COL[k][j]);//发送行数据
  }

  digitalWrite(LE, HIGH);//存储寄存器时钟输入,并行输出数据时置1
}
  • (4)实现现象:
    在这里插入图片描述

3.2 点阵显示汉字(方法2)

  • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

  • (2)点阵显示汉字(方法2) 的电路图,如下图所示:
    在这里插入图片描述

  • (3)实现功能:用shiftOut函数,点阵显示汉字“甲”。

代码实现:

//8*8共阳极点阵实验
//用shiftOut函数,点阵显示汉字“甲”

#define LE 9   
#define CLK 10 
#define DI  8  

unsigned int ROW_COL[8][2] = { //汉字“甲”
  {0x7f, 0x00}, //第一个字节是列数据,第二个字节是行数据
  {0xbf, 0x7C},
  {0xdf, 0x54},
  {0xef, 0x7C},
  {0xf7, 0x54}, 
  {0xfb, 0x7C}, 
  {0xfd, 0x10}, 
  {0xfe, 0x10}
};

void setup() 
{
  pinMode(LE, OUTPUT);
  pinMode(CLK, OUTPUT);
  pinMode(DI, OUTPUT); 
}

void loop()
{
  show(ROW_COL);
}

void show(unsigned int a[8][2])
{ 
  for ( int i = 0; i < 8; i++)
  {
    digitalWrite(LE, LOW);
    for (int j = 0; j < 2; j++)
    {
      shiftOut(DI, CLK, LSBFIRST, a[i][j]);//一次向移位寄存器写入一个字节(8个位)
    }
    digitalWrite(LE, HIGH);
  }
}

  • (4)实现现象:
    在这里插入图片描述

补充

  • 1、不推荐使用74HC595 来驱动8x8共阳点阵,由于点阵是扫描显示,所以在一定程度上来说它只能让我们只显示一个图案,如果你需要显示动图或者滚动显示,实现起来会比较麻烦,如果想实现显示动图或者滚动显示,推荐使用max7219芯片驱动8x8共阴点阵。
  • 2、shiftOut函数介绍
  • (1)参数介绍
  • shiftOut(dataPin,clockPin,bitOrder,val)
  • ① dataPin:对于arduino板,它是输出每一位数据的引脚(如某数字口),引脚需配置成输出模式。
  • ② clockPin:为位移芯片提供时钟的脚(即指arduino板上的某个数字口),当我们准备将dataPin的数据推送出去时,发送一个高电平(当然,这个引脚须配置成输出模式)。
  • ③ bitOrder:输出位的顺序,有最高位优先(MSBFIRST)和最低位优先(LSBFIRST)两种方式。
  • ④ val:所要输出的数据值,该数据值将以byte形式输出。
  • (2)与74HC595的对应关系
  • ① dataPin:自然是要对应位移芯片的DS引脚(数据引脚),需要注意的是这些数据必须在SCK引脚(SH_CP)触发上升沿的时候才会被逐位送入位移芯片(如hc595,hc164等芯片)
  • ② clockPin:对应的是位移芯片的SH_CP引脚,负责将dataPin送来的数据一位一位的送到芯片的寄存器中,每出现一个上升沿就送一位进入寄存器。
  • ③ 补充:位移芯片还有一个ST_CP引脚RCK,这个引脚负责输出芯片中已有的数据到8个输出管脚,换句话说,如果没有它的触发,芯片是不会向外输出的,它也是上升沿触发,也就是说需要一个由低到高的电平调变来触发。
  • ④ 总结:SH_CP,负责进,ST_CP负责出,不同的是SH_CP,是逐位的输入,ST_CP一次输出。

参考资料1: 点阵模块原理学习
参考资料2: 电子设计教程49:16*16LED点阵屏驱动-74HC595的原理
参考资料3: 74HC595工作原理及FPGA实现数码管驱动方法
参考资料4: 《别再找了!这是有史以来最棒的Arduino教程系列》感谢佑來老师的奉献无私!
参考资料5: Arduino+2片74hc595 驱动8x8(共阳)点阵(1008BS)
参考资料6: Arduino中shiftOut怎么用?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1032766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不用addEventListener(‘resize‘, this.resize),用新的Web API ResizeObserver监听DIV元素尺寸的变化

响应式设计指的是根据屏幕视口尺寸的不同&#xff0c;对 Web 页面的布局、外观进行调整&#xff0c;以便更加有效地进行信息的展示。我们日常生活中接触的很多应用都遵循响应式的设计。 响应式设计如今也成为 web 应用的基本需求&#xff0c;而现在很多 web 应用都已经组件化&a…

华为云云耀云服务器L实例评测 |云服务器选购

华为云耀云服务器 L 实例是一款轻量级云服务器&#xff0c;开通选择实例即可立刻使用&#xff0c;不需要用户再对服务器进行基础配置。新用户还有专享优惠&#xff0c;2 核心 2G 内存 3M 带宽的服务器只要 89 元/年&#xff0c;可以点击华为云云耀云服务器 L 实例购买地址去购买…

如何在新浪、搜狐、腾讯、网易、人民网等知名媒体网站上投稿

网络通稿成本低、投入小&#xff0c;软文宣传成为了众多企业的宣传选择&#xff0c;一篇优质的稿件更是能带来惊人的效果。越知名的网站传播效果越好&#xff0c;像新浪、搜狐、腾讯、网易、人民网等&#xff0c;那么如果找到这些网站投稿呢&#xff0c;本期盒子分享&#xff0…

[Go疑难杂症]为什么nil不等于nil

现象 在日常开发中&#xff0c;可能一不小心就会掉进 Go 语言的某些陷阱里&#xff0c;而本文要介绍的 nil ≠ nil 问题&#xff0c;便是其中一个&#xff0c;初看起来会让人觉得很诡异&#xff0c;摸不着头脑。 先来看个例子&#xff1a; type CustomizedError struct {Err…

MySQL的进阶篇1-MySQL的存储引擎简介

存储引擎 MySQL的体系结构 0、客户端连机器【java、Python、JDBC等】 1、【MySQL服务器-连接层】认证&#xff0c;授权&#xff0c;连接池 2、【MySQL服务器-服务层】 {SQL接口&#xff08;DML、DDL、存储过程、触发器&#xff09;、解析器、查询优化器、缓存} 3、【MySQL…

C8051F020 SMBus一直处于busy状态解决办法

当SMBus总线处于busy状态切且无法自动释放时&#xff0c;SMB0CN寄存器的第7位一直为 1&#xff0c;总线没有释放。 SMBus总线释放超时的一个纠错机制&#xff0c;它允许SMBus状态机在 SDA 和 SCL 信号线同为高电平超过 10个SMBus时钟源周期后判断总线为释放状态。 如果总线释放…

Linux下gdb常规调试

Linux系统&#xff1a;ubuntu-20.04 gdb简介 gdb 全称“GNU symbolic debugger”&#xff0c;从名称上不难看出&#xff0c;它诞生于 GNU 计划&#xff08;同时诞生的还有 GCC、Emacs 等&#xff09;&#xff0c;是 Linux 下常用的程序调试器。发展至今&#xff0c;GDB 已经迭…

代码随想录算法训练营day59|503.下一个更大元素II |42.接雨水

503.下一个更大元素II 力扣题目链接 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数&#xff0c…

【面试必刷TOP101】 删除有序链表中重复的元素-I 删除有序链表中重复的元素-II

目录 题目&#xff1a;删除有序链表中重复的元素-I_牛客题霸_牛客网 (nowcoder.com) 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;删除有序链表中重复的元素-II_牛客题霸_牛客网 (nowcoder…

CTF--攻防世界杂项--第二课

下载题目根据文件类型可知&#xff0c;这是一个流量包 那么接下来就是利用分析流量包常用的工具wireshark来分析 利用关键词进行搜索 http contains shell 在最后一条数据中看到了flag。 以上就结束&#xff0c;非常简单的一道题。

nginx相关漏洞处理:CVE-2016-2183、CVE-2022-41741、CVE-2022-41742

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、漏洞内容二、现状三、centos7安装openssl11四、升级nginx到1.24.01. 下载nginx2. 编译安装nginx3. 配置nginx.service4. 重启nginx 总结 前言 漏扫发现机器…

[maven] 使用 Nexus 管理 repository

[maven] 使用 Nexus 管理 repository 大概是说还有一篇笔记&#xff0c;两篇内容&#xff0c;maven 的内容就差不多过完了。这一篇笔记主要记一下 maven 的 central 管理部分&#xff0c;之前提到过我们公司用的就是 nexux 做了一个镜像&#xff0c;这里也会用 docker 去创建一…

力扣刷题-数组-滑动窗口法相关题目总结

209. 长度最小的子数组&#xff08;最小滑窗&#xff09; 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入&…

uniapp确认提示框;uniapp判断输入框值是否符合正常手机号,身份证号

确认提示框 UniApp 中&#xff0c;你可以使用 uni.showModal 方法来创建确认提示框。以下是一个示例&#xff1a; <template><view class"container"><button click"showAuthModal">显示确认提示框</button></view> </…

react实现动态递增展示数字特效

在可视化展示界面时有一种场景&#xff0c;就是页面在初始化的时候&#xff0c;有些数字展示想要从某个值开始动态递增到实际值&#xff0c;形成一种动画效果。例如&#xff1a; 写一个数字递增的组件&#xff0c;代码如下&#xff1a; import {useEffect, useRef, useState} f…

软考网络工程师IPSEC VPN配置考点总结

IPSEC VPN&#xff08;华为&#xff09;工作流程 配置安全ACL&#xff1a;配置哪些流量需要被保护配置安全提议&#xff1a;配置IPsec的参数配置IKE&#xff1a;预共享密钥&#xff0c;配置身份验证方法、加密算法等安全参数配置安全策略&#xff1a;1和2做关联在接口应用安全…

文件系统之程序是怎么打开文件进行操作的

本篇文章自顶向下&#xff0c;从文件系统的上层出发讲到磁盘&#xff0c;帮助理解程序是如何打开文件并进行后序的读写操作的&#xff0c;读到后面&#xff0c;前面的一些疑惑就得到解决 介绍相关概念 注意&#xff0c;目录也是文件 文件描述符 每个进程都有一个指针*files…

Postman接口测试完整篇,全网唯一

前言 今天给大家分享的内容是接口测试必备的postman测试工具的使用&#xff1a;postman发送get与post请求&#xff0c;变量的设置与引用&#xff0c;文件的导入与导出&#xff0c;断言机制&#xff0c;参数化&#xff08;数据驱动&#xff09;&#xff0c;批量执行测试集&…

算法通关村 | 透彻理解动态规划

1. 斐波那契数列 1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;..... f(n) f(n-1) f(n-2) 代码实现 public static int count_2 0;public int fibonacci(int n){if (n < 2){count_2;return n;}int f1 1;int f2 2;i…

探索单链表数据结构:理解与实现

文章目录 &#x1f34b;引言&#x1f34b;什么是单链表&#xff1f;&#x1f34b;单链表的基本操作&#x1f34b;单链表的实现&#x1f34b;练习题&#x1f34b;总结 &#x1f34b;引言 在计算机科学和数据结构中&#xff0c;链表是一种基本且重要的数据结构&#xff0c;用于存…