Arduino程序设计(十)8×8 共阴极LED点阵显示(MAX7219)


前言

  • 本文主要介绍8×8 共阴极LED点阵显示实验,分别是:
  • 1、介绍MAX7219点阵模块;
  • 2、点阵显示部分图形;
  • 3、点阵显示数字 0~9 及 26 个英文字母。

一、MAX7219点阵模块

  • (1)MAX7219点阵模块:由1个8x8共阴极点阵1088AS和1个MAX7219组成,通过SPI方式与单片机通信。
  • (2)1088AS介绍:
  • ① 内部结构:

在这里插入图片描述

  • ② 基础知识:
    在这里插入图片描述

  • (3)MAX7219简介

  • ① 基本介绍:

  • MAX7219 是微处理器和共阴极七段 — — 八位LED 显示、图条/柱图显示或 64 点阵显示接口的小型串行输入/输出芯片。片内包括 BCD 译码器、多路扫描控制器、字和位驱动器和 8×8 静态 RAM。外部只需要一个电阻设置所有 LED 显示器字段电流。MAX7219 和微处理器只需三根导线连接,每位显示数字有一个地址由微处理器写入。允许使用者选择每位是 BCD 译码或不译码。使用者还可选择停机模式、数字亮度控制、从 1~8 选择扫描位数和对所有 LED 显示器的测试模式。

  • ② 工作原理:

  • MAX7219 和单片计算机连接有三条引线(DIN、CLK、LOAD),采用 16 位数据串行移位接收方式。即单片机将 16 位二进制数逐位发送到DIN 端,在 CLK 上升沿到来前准备就绪,CLK 的每个上升沿将一位数据移入MAX7219 内移位寄存器,当 16 位数据移入完,在 LOAD 引脚信号上升沿将 16 位数据装入MAX7219 内的相应位置,在MAX7219 内部硬件动态扫描显示控制电路作用下实现动态显示。

  • ③ 引脚说明:
    在这里插入图片描述
    在这里插入图片描述

  • ④ 典型应用电路:
    在这里插入图片描述

  • (4)MAX7219点阵模块实物图:
    在这里插入图片描述

  • (5)MAX7219点阵模块原理图:
    在这里插入图片描述

  • (6)引脚说明与接线

  • ① 引脚说明:

MAX7219点阵模块功能说明
VCC模块供电接口,可用单片机的5v电源口供电
GND电源地
DIN数据输入
CS片选端,接口低电平时串行数据被载入移位寄存器
CLK时钟接口
  • ② 与Arduino UNO R3开发板接线:
MAX7219点阵模块Arduino UNO
VCC5V
GNDGND
DIND11
CSD10
CLKD13

二、点阵显示实验

1、点阵显示部分图形

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

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

  • (3)实验准备:安装下载安装 “LedControl” 库文件。

  • (4)实现功能:点阵显示上下左右箭头、三种表情和三种爱心。

代码实现:

//8*8LED点阵模块显示实验
//点阵显示上下左右箭头、三种表情和三种爱心

#include <LedControl.h>

//Arduino UNO SPI引脚:D10(CS)、D11(MOSI)、D12(MISO)、D13(SCLK)

int DIN = 11;//SPI模式,MOSI主设备输出,从设备输入
int CS =  10;//SPI模式,CS片选
int CLK = 13;//SPI模式,CLK

//面部表情
byte smile[8] =   {0x3C, 0x42, 0xA5, 0x81, 0xA5, 0x99, 0x42, 0x3C};//微笑
byte neutral[8] = {0x3C, 0x42, 0xA5, 0x81, 0xBD, 0x81, 0x42, 0x3C};//中性
byte sad[8] =     {0x3C, 0x42, 0xA5, 0x81, 0x99, 0xA5, 0x42, 0x3C};//悲伤


//实心箭头
byte Front[8] =   {0x08, 0x1c, 0x3e, 0x7f, 0x1c, 0x1c, 0x1c, 0x1c}; //向上箭头↑
byte back[8] =    {0x1c, 0x1c, 0x1c, 0x1c, 0x7f, 0x3e, 0x1c, 0x08}; //向下箭头↓
byte left[8] =    {0x10, 0x30, 0x7f, 0xff, 0x7f, 0x30, 0x10, 0x00}; //向左箭头←
byte right[8] =   {0x08, 0x0c, 0xfe, 0xff, 0xfe, 0x0c, 0x08, 0x00}; //向右箭头→


//爱心
byte heart[8] =   {0x00, 0x76, 0x89, 0x81, 0x81, 0x42, 0x24, 0x18}; //空❤
byte heart1[8] =  {0x00, 0x00, 0x24, 0x7E, 0x7E, 0x3C, 0x18, 0x00}; //小❤
byte heart2[8] =  {0x00, 0x66, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x18}; //大❤

LedControl lc = LedControl(DIN, CLK, CS, 0);//新建一个类对象

void setup()
{
  lc.shutdown(0, false);       //初始化时设置点阵为正常使用模式
  lc.setIntensity(0, 1);       //设置亮度值,范围0~15
  lc.clearDisplay(0);          //点阵清屏
}

void loop()
{
   //显示箭头
  printByte(Front);
  delay(2000);
  printByte(back);
  delay(2000);
  printByte(left);
  delay(2000);
  printByte(right);
  delay(2000);

  //显示表情
  printByte(smile);
  delay(2000);
  printByte(neutral);
  delay(2000);
  printByte(sad);
  delay(2000);

   //显示❤
  printByte(heart);
  delay(2000);
  printByte(heart1);
  delay(2000);
  printByte(heart2);
  delay(2000);
}

void printByte(byte character [])
{
  int i = 0;
  for (i = 0; i < 8; i++)
  {
    lc.setRow(0, i, character[i]);//设置点阵单行8个LED状态,每行数据用16进制表示
  }
}
  • (5)实现现象(部分展示):
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2、点阵显示数字 0 ~ 9 及 26 个英文字母

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

  • (2)点阵显示数字 0 ~ 9 及 26 个英文字母的电路图,如下图所示:
    在这里插入图片描述

  • (3)实验准备:安装下载安装 “LedControl” 库文件。

  • (4)实现功能:点阵显示 0 ~ 9 和 A ~Z。

代码实现:

//8*8LED点阵模块显示实验
//点阵显示0~9,A~Z

#include <LedControl.h>

//Arduino UNO SPI引脚:D10(CS)、D11(MOSI)、D12(MISO)、D13(SCLK)

int DIN = 11;//SPI模式,MOSI主设备输出,从设备输入
int CS =  10;//SPI模式,CS片选
int CLK = 13;//SPI模式,CLK时钟

byte zero[8] =  {0x1C,0x22,0x22,0x22,0x22,0x22,0x22,0x1C};//0 
byte one[8] =   {0x08,0x18,0x08,0x08,0x08,0x08,0x08,0x1C};//1 
byte two[8] =   {0x1C,0x22,0x02,0x02,0x1C,0x20,0x20,0x3E};//2 
byte three[8] = {0x1C,0x22,0x02,0x1C,0x02,0x02,0x22,0x1C};//3 
byte four[8] =  {0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x08};//4 
byte five[8] =  {0x3E,0x20,0x20,0x3E,0x02,0x02,0x22,0x1C};//5 
byte six[8] =   {0x1C,0x22,0x20,0x3C,0x22,0x22,0x22,0x1C};//6 
byte seven[8] = {0x3E,0x02,0x04,0x08,0x10,0x10,0x10,0x10};//7 
byte eight[8] = {0x1C,0x22,0x22,0x1C,0x22,0x22,0x22,0x1C};//8 
byte nine[8] =  {0x1C,0x22,0x22,0x22,0x1E,0x02,0x22,0x1C};//9 
byte A[8] =     {0x00,0x1C,0x22,0x22,0x22,0x3E,0x22,0x22};//A
byte B[8] =     {0x00,0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C};//B
byte C[8] =     {0x00,0x1C,0x22,0x20,0x20,0x20,0x22,0x1C};//C
byte D[8] =     {0x00,0x3C,0x22,0x22,0x22,0x22,0x22,0x3C};//D
byte E[8] =     {0x00,0x3E,0x20,0x20,0x3E,0x20,0x20,0x3E};//E
byte F[8] =     {0x00,0x3E,0x20,0x20,0x3E,0x20,0x20,0x20};//F
byte G[8] =     {0x00,0x1C,0x22,0x20,0x3E,0x22,0x22,0x1C};//G
byte H[8] =     {0x00,0x22,0x22,0x22,0x3E,0x22,0x22,0x22};//H
byte I[8] =     {0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x1C};//I
byte J[8] =     {0x00,0x3E,0x08,0x08,0x08,0x08,0x28,0x18};//J
byte K[8] =     {0x00,0x24,0x28,0x30,0x20,0x30,0x28,0x24};//K
byte L[8] =     {0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x3E};//L
byte M[8] =     {0x00,0x42,0x66,0x5A,0x42,0x42,0x42,0x42};//M
byte N[8] =     {0x00,0x00,0x2C,0x32,0x22,0x22,0x22,0x22};//n
byte O[8] =     {0x00,0x1C,0x22,0x22,0x22,0x22,0x22,0x1C};//O
byte P[8] =     {0x00,0x3C,0x22,0x22,0x3C,0x20,0x20,0x20};//P
byte Q[8] =     {0x00,0x1C,0x22,0x22,0x22,0x2A,0x26,0x1F};//Q
byte R[8] =     {0x00,0x38,0x24,0x24,0x38,0x30,0x28,0x24};//R
byte S[8] =     {0x00,0x1C,0x22,0x20,0x1C,0x02,0x22,0x1C};//S
byte T[8] =     {0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08};//T
byte U[8] =     {0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3C};//U
byte V[8] =     {0x00,0x22,0x22,0x22,0x22,0x14,0x08,0x00};//V
byte W[8] =     {0x00,0x41,0x41,0x49,0x55,0x55,0x63,0x41};//W
byte X[8] =     {0x00,0x00,0x42,0x24,0x18,0x18,0x24,0x42};//X
byte Y[8] =     {0x00,0x22,0x22,0x14,0x08,0x10,0x20,0x00};//y
byte Z[8] =     {0x00,0x3E,0x02,0x04,0x08,0x10,0x20,0x3E};//Z

LedControl lc = LedControl(DIN, CLK, CS, 0);//新建一个类对象

void setup()
{
  lc.shutdown(0, false);       //初始化时设置点阵为正常使用模式
  lc.setIntensity(0, 1);       //设置亮度值,范围0~15
  lc.clearDisplay(0);          //点阵清屏
}

void loop()
{
  //显示数字
  printByte(zero);
  delay(1000);
  printByte(one);
  delay(1000);
  printByte(two);
  delay(1000);
  printByte(three);
  delay(1000);
  printByte(four);
  delay(1000);
  printByte(five);
  delay(1000);
  printByte(six);
  delay(1000);
  printByte(seven);
  delay(1000);
  printByte(eight);
  delay(1000);
  printByte(nine);
  delay(1000);

  printByte(A);
  delay(1000);
  printByte(B);
  delay(1000);
  printByte(C);
  delay(1000);
  printByte(D);
  delay(1000);
  printByte(E);
  delay(1000);
  printByte(F);
  delay(1000);
  printByte(G);
  delay(1000);
  printByte(H);
  delay(1000);
  printByte(I);
  delay(1000);
  printByte(J);
  delay(1000);
  printByte(K);
  delay(1000);
  printByte(L);
  delay(1000);
  printByte(M);
  delay(1000);
  printByte(N);
  delay(1000);
  printByte(O);
  delay(1000);
  printByte(P);
  delay(1000);
  printByte(Q);
  delay(1000);
  printByte(R);
  delay(1000);
  printByte(S);
  delay(1000);
  printByte(T);
  delay(1000);
  printByte(U);
  delay(1000);
  printByte(V);
  delay(1000);
  printByte(W);
  delay(1000);
  printByte(X);
  delay(1000);
  printByte(Y);
  delay(1000);
  printByte(Z);
  delay(1000);
}

void printByte(byte character [])
{
  int i = 0;
  for (i = 0; i < 8; i++)
  {
    lc.setRow(0, i, character[i]);//设置点阵单行8个LED状态,每行数据用16进制表示
  }
}
  • (5)实现现象(部分展示):
    在这里插入图片描述
    在这里插入图片描述

总结

  • 1、通过上述两个点阵实验,了解了8*8点阵显示的基本原理;
  • 2、通过SPI通信控制点阵显示,学会了Arduino用SPI通信方式控制外设。

参考资料1: Arduino驱动MAX7219点阵
参考资料2: 【雕爷学编程】Arduino动手做(22)——8X8 LED点阵MAX7219屏8
参考资料3: Arduino 学习笔记 | 单片机控制驱动MAX7219 8*8 LED点阵显示模块
参考资料4: 51单片机 8*8点阵26个英文字母怎么样显示 ?要从上到下的编码

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值