点阵显示模块, 由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; //数据输入 /** *@参数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(); }
} 四、程序运行结果:
|