打印
[经验分享]

MAX7219串行接口,实现多联8X8点阵模块的驱动

[复制链接]
1147|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jonas222|  楼主 | 2023-10-22 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  点阵显示模块, 由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、关键管脚功能简介:
  • DIN串行数据输入端口。在时钟上升沿时数据被载入内部的16 位寄存器。
  • CLK时钟序列输入端。最大速率为10MHz.在时钟的上升沿,数据移入内部移位寄存器。下降沿时,数据从DOUT端输出。对MAX7221 来说,只有当cs 端为低电平时时钟输入才有效。
  • CS片选端。该端为低电平时串行数据被载入移位寄存器。连续数据的后16 位在cs 端的上升沿时被锁定。
    4、功能图

    5、串行数据格式:
    6、时序图:
   7、数据寄存器和控制寄存器
(1)基本功能码:0x00-0x07对应SEG0-7脚的输出(共阴脚位的行输出)
   (2)特殊功能码:
  • 0x09编码模式:本例使用的是无编码,初始化时设定为0x00。
  • 0x0A 数字控制显示亮度:0x00-0x0F(亮度由低至高),初始化时设定为0x03。
  • 0x0B扫描限制: 扫描控制寄存器用来设定扫描显示器的个数,从1 个到8 个,这里8个引用都需使用到,初始化时设定为0x07。
  • 0x0C关机模式:不使用关机,初始化时设定为0x00。
  • 0x0F显示测试:不使用测试,初始化时设定为0x00,使用测试时所有LED灯点亮,编写初期测试下屏设定值为0x01。
三、程序编写:
   1、编写MAX7219.C基本驱动文件。
  • 脚位功能定义:
       sbit CLK=P2^2;  //时钟
sbit CS=P2^1;   //片选
sbit DIN=P2^0;  //数据输入
  • 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();
   }


}
四、程序运行结果:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

1362

帖子

0

粉丝