Bootstrap

C51单片机驱动基于MAX7219串行接口多联8X8点阵模块

      点阵显示模块, 由4块独立子显示模块拼接而成,每个子块由一块MAX7219芯片控制一块8*8的LED点阵。我的这个模块采购自淘宝网,买时只是觉得这种串行点阵屏有点意思,B站上常见的驱动方式是arduino驱动,尝试着学习使用C51单片机来驱动它,更重要的是价格不高(2022年网上售12.7元)。下面小结了该模块使用,本人水平有限,不喜欢本篇请自行划过。

一、模块与电路:

1、点阵模块实物图:

模块正面

模块反面

2、模块电路:

LED点阵(注:MAX7219仅能驱动共阴点阵)

MAX7219(注:DOUT接下一级DIN)

二、模块驱动基本知识:

1、芯片简介:

MAX7219/MAX7221是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。

    2、芯片引脚与典型应用

    3、关键管脚功能简介:

  1. DIN串行数据输入端口。在时钟上升沿时数据被载入内部的16 位寄存器。
  2. CLK时钟序列输入端。最大速率为10MHz.在时钟的上升沿,数据移入内部移位寄存器。下降沿时,数据从DOUT端输出。对MAX7221 来说,只有当cs 端为低电平时时钟输入才有效
  3. CS片选端。该端为低电平时串行数据被载入移位寄存器。连续数据的后16 位在cs 端的上升沿时被锁定

    4、功能图

    5、串行数据格式:

    6、时序图:

   7、数据寄存器和控制寄存器

(1)基本功能码:0x00-0x07对应SEG0-7脚的输出(共阴脚位的行输出)

   (2)特殊功能码:

  1. 0x09编码模式:本例使用的是无编码,初始化时设定为0x00。
  2. 0x0A 数字控制显示亮度:0x00-0x0F(亮度由低至高),初始化时设定为0x03。
  3. 0x0B扫描限制: 扫描控制寄存器用来设定扫描显示器的个数,从1 个到8 个,这里8个引用都需使用到,初始化时设定为0x07。
  4. 0x0C关机模式:不使用关机,初始化时设定为0x00。
  5. 0x0F显示测试:不使用测试,初始化时设定为0x00,使用测试时所有LED灯点亮,编写初期测试下屏设定值为0x01。

三、程序编写:

   1、编写MAX7219.C基本驱动文件。

  1. 脚位功能定义:

       sbit CLK=P2^2;  //时钟

sbit CS=P2^1;   //片选

sbit DIN=P2^0;  //数据输入

  1. MAX7219写入16位数据(依据时序):

 /**

*@功能 :写入16位串行数据

*@参数1:add地址位

*@参数2:dat数据位

*@返回 :无

*/

void Max7219_write_16bit(unsigned char add,unsigned dat)

{

   unsigned char i;

   CS=0;

   CLK=0;

   for(i=0;i<8;i++)

   {

   DIN=add&0x80;

   CLK=1;

   CLK=0;

   add=add<<1;

   }

   for(i=0;i<8;i++)

   {

   DIN=dat&0x80;

   CLK=1;

   CLK=0;

   dat=dat<<1;

   }

}

     3.MAX7219锁存

/**

*@功能 :数据传输完成后将数据锁存入芯片 

*@参数1:无

*@返回 :无

*/

void Max7219_Lock()

{

   CS=1; 

   CS=0;

}

4.MAX7219初始化:

/**

*@功能 :MAX7219初始化,实现4个子模块分别初始。

*@参数1:  无

*@返回 : 无

*/

void Max7219_init()

{

   Max7219_write_16bit(0x09,0x00);//设定无译码模式LED子模块1

   Max7219_write_16bit(0x09,0x00);//设定无译码模式LED子模块2

   Max7219_write_16bit(0x09,0x00);//设定无译码模式LED子模块3

   Max7219_write_16bit(0x09,0x00);//设定无译码模式LED子模块4

   Max7219_Lock();

   Max7219_write_16bit(0x0A,0x01);//亮度

   Max7219_write_16bit(0x0A,0x01);

   Max7219_write_16bit(0x0A,0x01);

   Max7219_write_16bit(0x0A,0x01);

   Max7219_Lock();

   Max7219_write_16bit(0x0B,0x07);

   Max7219_write_16bit(0x0B,0x07);

   Max7219_write_16bit(0x0B,0x07);

   Max7219_write_16bit(0x0B,0x07);

   Max7219_Lock();

   Max7219_write_16bit(0x0C,0x01);//正常操作模式

   Max7219_write_16bit(0x0C,0x01);

   Max7219_write_16bit(0x0C,0x01);

   Max7219_write_16bit(0x0C,0x01);

   Max7219_Lock();

   Max7219_write_16bit(0x0F,0x00);//测试模式

   Max7219_write_16bit(0x0F,0x00);

   Max7219_write_16bit(0x0F,0x00);

   Max7219_write_16bit(0x0F,0x00);

   Max7219_Lock();

}

5.MAX7219清屏

/**

*@功能 :实现清屏

*@参数1:  无

*@返回 :无

*/

void Max7219_CLS()

{

  unsigned char i;

  for(i=8;i>=1;i--)

  {

    Max7219_write_16bit(i,0x00);

   Max7219_write_16bit(i,0x00);

    Max7219_write_16bit(i,0x00);

     Max7219_write_16bit(i,0x00);

  }

}

6、字符取模:

//字模,取模方式:模向取模,倒序

unsigned char code disp[][8]={

0x00,0x1E,0x12,0x12,0x12,0x12,0x12,0x1E,//0

0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,//1

0x00,0x1E,0x10,0x10,0x1E,0x02,0x02,0x1E,//2

0x00,0x1E,0x10,0x10,0x1E,0x10,0x10,0x1E,//3

0x00,0x12,0x12,0x12,0x1E,0x10,0x10,0x10,//4

0x00,0x1E,0x02,0x02,0x1E,0x10,0x10,0x1E,//5

0x00,0x1E,0x02,0x02,0x1E,0x12,0x12,0x1E,//6

0x00,0x1E,0x10,0x10,0x10,0x10,0x10,0x10,//7

0x00,0x1E,0x12,0x12,0x1E,0x12,0x12,0x1E,//8

0x00,0x1E,0x12,0x12,0x1E,0x10,0x10,0x1E,//9

0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x00,//:

0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,//-

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//空

};

7.显示时间函数

/**

*@功能 :显示时分秒(hh:mm:ss)

*@参数1:小时

*@参数2:分钟

*@参数3: 秒

*@返回 :无

*/

void Max7912_disp(unsigned char a1,unsigned char a2,unsigned char a3)

{

  unsigned char i,x4,x3,x2,x1,h1,h2,m2,m1,s1,s2,t10; 

  unsigned long int t,y;

 for(i=8;i>=1;i--)

  {

    

    s2=disp[a3/10][8-i];

    s1=disp[a3%10][8-i];

    m2=disp[a2/10][8-i];

    m1=disp[a2%10][8-i];

    h2=disp[a1/10][8-i];

    h1=disp[a1%10][8-i];

    t10=disp[10][8-i];    

    if(a3%2==0)     //闪灯

    {

      t10=disp[10][8-i];

     }

      else

      {

      t10=disp[12][8-i];

      } 

     //组合数据用于压缩显示

    y=s1;

     t=y<<27;

     y=s2;

     t=t|y<<22;

     y=t10;

     t=t|y<<20;

     y=m1;

     t=t|y<<16;

     y=m2;

     t=t|y<<11;

     y=t10;

     t=t|y<<9;

     y=h1;

     t=t|y<<5;    

     y=h2;

     t=t|y<<0;

     x4=t>>24;

     x3=t>>16&0xff;

     x2=t>>8&0xff;

     x1=t&0xff;

    Max7219_write_16bit(i,x4);

    Max7219_write_16bit(i,x3);

    Max7219_write_16bit(i,x2);

    Max7219_write_16bit(i,x1);

    Max7219_Lock();

  }

}

2、编写main.c文件。

#include "reg52.h"

#include "max7219.h"

#include "delay.h"

#include "ds1302.h"//调用时间模块

void main()

{

   Max7219_init();

   Max7219_CLS();

   //Max7912_disp(12,00,00);//测试显示 

   while(1)

   {

      Max7912_disp(Ds1302_hour(),Ds1302_min(),Ds1302_sec());

      DelayMs(200);

      DelayMs(200);

      DelayMs(200);

      DelayMs(200);

     Max7219_CLS();

   }

  

}

四、程序运行结果:

;