MAX7219点阵模块可以用三根数据线实现8*8的LED点阵控制,而且不需要单片机参与扫描,使用非常方便。更为重要的是,它支持模块级联使用,在不增加IO数量的条件下,实现多模块的控制。因此在大屏时计中采用了3个MAX7219点阵模块组合成8*24的点阵屏。
点阵的使用遇到一点小麻烦,是关于级联使用的,网络上查询到的代码每一块点阵的写入需要采用单独的函数,如:
//向第二片MAX7219写数据
void MAX7219_Write_1(uchar add2,uchar dat2) {
Max7219_pinCS=0;
sent(add2);
sent(dat2);
Max7219_pinCLK=1; // 第16.5个时钟周期,数据从第一片MAX7219的DOUT端开始输出
sent(REG_NO_OP); //对第一片MAX7219进行空操作,
sent(0x00);
Max7219_pinCS=1;
}
这不实用,不敢想象点阵模块数量更多的情况。改写后如下:
// 首先定义模块的数量
#define MAX7219_NUMS 3
//-------------------------------------------
//功能:向MAX7219写入数据
//入口参数:chip: 级联芯片编号,0~MAX7219_NUMS-1
// address、dat
void Write_Max7219(uchar chip, uchar address, uchar dat) {
int i;
Max7219_pinCS=0;
for(i=0;i<MAX7219_NUMS;i++) {
if(i==chip) {
Write_byte(address);
Write_byte(dat);
} else {
Write_byte(REG_NO_OP); //空操作,
Write_byte(REG_NO_OP); //空操作
}
}
Max7219_pinCS=1;
}
另外,发两个函数,刚好也可以作为使用上述函数对点阵屏操作的例子。
//-------------------------------------------
//功能: 点阵屏初始化
//入口参数:无
void MAX7219_Init(void) {
int i;
for(i=0;i<MAX7219_NUMS;i++) {
Write_Max7219(i, 0x09, 0x00); //译码方式:BCD码
Write_Max7219(i, 0x0a, 0x01); //亮度
Write_Max7219(i, 0x0b, 0x07); //扫描界限;8个数码管显示
Write_Max7219(i, 0x0c, 0x01); //掉电模式:0,普通模式:1
Write_Max7219(i, 0x0f, 0x00); //显示测试:1;测试结束,正常显示:0
}
for(i=0;i<8*MAX7219_NUMS;i++)
Write_Max7219(i/8, i%8+1, 0); // 黑屏
}
//-------------------------------------------
//功能: 关闭点阵屏显示
//入口参数:无
void MAX7219_Sleep(void) {
int i;
for(i=0;i<8*MAX7219_NUMS;i++)
Write_Max7219(i/8, i%8+1, 0); // 黑屏
for(i=0;i<MAX7219_NUMS;i++) {
Write_Max7219(i, 0x0c, 0x00); //掉电模式:0,普通模式:1
}
}