Arduino 8×8 共阳极LED点阵显示(74HC595)

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

一、74HC595点阵模块

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

1、74HC595介绍

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

  • (1)74HC595D引脚介绍及工作范围
    Arduino 8×8 共阳极LED点阵显示(74HC595)
    Arduino 8×8 共阳极LED点阵显示(74HC595)
    Arduino 8×8 共阳极LED点阵显示(74HC595)

  • (2)逻辑图:
    Arduino 8×8 共阳极LED点阵显示(74HC595)

  • (3)时序图:
    Arduino 8×8 共阳极LED点阵显示(74HC595)

  • (4)功能框图:
    Arduino 8×8 共阳极LED点阵显示(74HC595)

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

2、74HC595工作原理

  • (1)74HC595引脚图

Arduino 8×8 共阳极LED点阵显示(74HC595)

  • (2)74HC595D、74HC595和74HC595点阵模块的引脚对照表如下:
引脚编号 74HC595D 74HC595 74HC595点阵模块 功能介绍
15 Q0 QA \ 一位并行输出位
1~7 Q1~Q7 QB~QH \ 七位并行输出位
8 GND VSS GND 电源地
9 Q7’ QH’ \ 级联位,若输入位数大于8位,先进入的位会从此口连续输出,用于多片之间的级联
10 MR SRCLR 5V 主复位,低有效,一般直接接到VCC拉高
11 SH_CP SRCLK CLK 移位寄存器时钟输入
12 ST_CP RCLK LE 存储寄存器时钟输入
13 OE OE GND 输出使能位,低有效,一般全程给低电平
14 DS SER DI 串行数据输入位
16 VCC VDD 5V 电源5V
  • (3)74HC595工作原理介绍
    Arduino 8×8 共阳极LED点阵显示(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实物图:
    Arduino 8×8 共阳极LED点阵显示(74HC595)

  • (3) 内部结构:
    Arduino 8×8 共阳极LED点阵显示(74HC595)
    Arduino 8×8 共阳极LED点阵显示(74HC595)

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

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

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

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

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

4、74HC595点阵模块

  • (1)74HC595点阵模块实物图:
    Arduino 8×8 共阳极LED点阵显示(74HC595)
  • (2)74HC595点阵模块原理图:
    Arduino 8×8 共阳极LED点阵显示(74HC595)
  • (3)引脚说明与接线
  • ① 引脚说明:
74HC595点阵模块 功能说明
DI 串行数据输入
LE 锁存器时钟输入
CLK 移位寄存器时钟输入
NC 空脚,不接
VCC 模块供电接口,可用单片机的5V电源口供电
GND 电源地
  • ② 与Arduino UNO R3开发板接线:
74HC595点阵模块 Arduino UNO R3
DI D8
LE D9
CLK D10
VCC 5V
GND GND

二、点阵显示实验

1、点阵显示初探

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

  • (2)点阵显示初探的电路图,如下图所示:
    Arduino 8×8 共阳极LED点阵显示(74HC595)

  • (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)实现现象:
    Arduino 8×8 共阳极LED点阵显示(74HC595)

2、点阵显示进阶

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

  • (2)点阵显示进阶的电路图,如下图所示:
    Arduino 8×8 共阳极LED点阵显示(74HC595)

  • (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)实现现象:
    Arduino 8×8 共阳极LED点阵显示(74HC595)

3、点阵显示高阶

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

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

  • (2)点阵显示汉字(方法1) 的电路图,如下图所示:
    Arduino 8×8 共阳极LED点阵显示(74HC595)

  • (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)实现现象:
    Arduino 8×8 共阳极LED点阵显示(74HC595)

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

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

  • (2)点阵显示汉字(方法2) 的电路图,如下图所示:
    Arduino 8×8 共阳极LED点阵显示(74HC595)

  • (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)实现现象:
    Arduino 8×8 共阳极LED点阵显示(74HC595)

补充

  • 1、不推荐使用74HC595 来驱动8x8共阳点阵,由于点阵是扫描显示,所以在一定程度上来说它只能让我们只显示一个图案,如果你需要显示动图或者滚动显示,实现起来会比较麻烦,如果想实现显示动图或者滚动显示,推荐使用max7219芯片驱动8x8共阴点阵。
  • 2、本文的8×8 LED点阵特点:
  • (1)发送列值,哪列电位为LOW哪列点亮,最高位在左边;
  • (2)发送行值,哪行电位为HIGH哪行点亮,最高位在下面。
  • 3、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一次输出。

来源:https://blog.csdn.net/weixin_44887565/article/details/133033510

- 本文内容来自网络,如有侵权,请联系本站处理。

2024-07   阅读(3)   评论(0)
 标签: 创客 Arduino 74HC595

涨知识
万向节

万向节即万向接头,英文名称universal joint,是实现变角度动力传递的机件,用于需要改变传动轴线方向的位置

评论:
相关文章
理解 MSBFIRST(最高有效位)和 LSBFIRST(最低有效位)

在本文中,先解释 MSB(最高有效位)和 LSB(最低有效位)的概念,以及 MSBFIRST 和 LSBFIRST。然后展示了 MSBFIRST 和 LSBFIRST 的使用如何影响移位寄存器的输出。


Arduino 和 TB6612FNG 驱动直流电机

TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速与方向,输入电压在3V~12V,因此在集成化、小型化的电机控制系统中,它可以作为理想的电机驱动器件。


Arduino-ESP32 Preferences库使用详解

Arduino-ESP32项目提供的Preferences库是一个专为ESP32设计的非易失性存储解决方案,它替代了传统的Arduino EEPROM库,提供了更强大、更可靠的数据存储功能。


74HC595D使用方法(附接线、级联、程序)

74HC595是一个8位串行输入、并行输出的位移缓存器。并行输出为三态输出。




Arduino 上使用红外遥控器

日常生活中我们会接触到各式各样的遥控器,电视机、空调、机顶盒等都有专用的遥控器,很多智能手机也在软硬件上对红外遥控做了支持,可以集中遥控绝大部分家用电器。本篇介绍红外遥控相关原理及应用,通过红外遥控器控制 Uno 板载 LED 灯。


Arduino 驱动 8×8 LED点阵屏

LED点阵屏由LED发光二极管组成,通过控制LED亮灭来显示文字、图片、动画、视频等,被广泛应用于公共场合做信息展示,如广告屏、公告牌等。


ESP32 使用DAC模拟输出完成两路呼吸灯

ESP32的DAC函数可以实现真正的模拟输出。


在 ESP32 上使用 LEDC (PWM)

ESP32 没有Arduino输出 PWM 的 analogWrite(pin, value) 方法,取而代之的 ESP32 有一个 LEDC 来实现PWM功能。

搜索
小鹏STEM教研服务

专属教研服务系统,助您构建STEM课程体系,打造一站式教学环境。