使用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、关键管脚功能简介:
- 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();
}
}
四、程序运行结果: