8*8 LED点阵模块
之前我们使用MAX7219仿真驱动了数码管,
手里恰好有一个MAX7219驱动的8*8 LED点阵模块,我们正好验证一下之前我们的驱动文件实现的是否正确。
实现的效果类似下面效果:
管脚顺序
上图为从正面观看,如图所示为共阴极点阵模块
共阴共阳一般区分方式:
- ①脚如果是公共正极,那就是共阳;
- 看丝印型号,我买的是1088AS,为共阴,1088BS即为共阳。
引脚排布
模块原理图
字模生成原理
点阵中每一行对应一个字节,8位。
点亮的LED--红色,该位为1。
灭的LED--黑色,该位为0。
如果数字“0”在8*8的点阵中按下图所示点亮,那么第一行对应的字节就应该为:0b00111100,16进制即为0x3C。
同理,第二行对应的字节为0x42。
由上分析,数字0的显示编码如下:{0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C}
烧写程序,显示效果如下:
我们可以用之前在OLED上显示中文那个网文中使用的点阵生成软件:PCtoLCD2002,自动生成点阵。
不过在8*8点阵上显示的字符很难看,这个软件在这里使用不太合适。
在电梯中使用的点阵是 5*7的点阵,我们使用下面的软件,手动点击生成对应字符的编码:
数字0对应的编码为:
/*这是“0”的字模;该字模由LEDDOT生成;字模的提取方式为:逐行提取;字模的显示方式为:单字单行显示;生成的字模格式:C51十六进制 */
0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x0
使用上面的软件,设计待用字模如下:
u8 dispNum[8][8]={
{0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x0},//0
{0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x0},//1
{0x70,0x88,0x8,0x10,0x20,0x40,0xF8,0x0},//2
{0x70,0x88,0x8,0x30,0x8,0x88,0x70,0x0},//3
{0x10,0x30,0x50,0x90,0xF8,0x10,0x10,0x0},//4
{0xF8,0x80,0xF0,0x8,0x8,0x88,0x70,0x0},//5
{0x70,0x80,0x80,0xF0,0x88,0x88,0x70,0x0},//6
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//空白
};
u8 dispArrow[2][9]={
{0x0,0x20,0x70,0xA8,0x20,0x20,0x20,0x0,0x0},//向上箭头
{0x0,0x20,0x20,0x20,0xA8,0x70,0x20,0x0,0x0},//向下箭头
};
硬件接线
实现代码
int main(void)
{
int nTimes = 0;
int i = 0;
int j = 0;
//延时函数初始化
delay_init();
delay_ms(50);
Max7219_Init();
while(1)
{
if(nTimes < 6)
{
for(i=1;i<=8;i++)
Write_Max7219(i,dispNum[nTimes][i-1]);
nTimes++;
delay_ms(1000);
}
else if(nTimes < 10) //闪烁
{
for(i=1;i<=8;i++)
Write_Max7219(i,dispNum[6][i-1]);
delay_ms(250);
for(i=1;i<=8;i++)
Write_Max7219(i,dispNum[7][i-1]);
delay_ms(100);
nTimes++;
}
else
{
//箭头滚动
for(i=0;i<70;i++)
{
for(j=1;j<=8;j++)
Write_Max7219(j,dispArrow[0][(j + i -1)%9]);
delay_ms(100);
}
nTimes = 0;
//最后显示一幅向上箭头
for(i=1;i<=8;i++)
Write_Max7219(i,dispArrow[0][(i -1)]);
//延时3秒,开启下一轮
delay_ms(1000); delay_ms(1000);delay_ms(1000);
}
}
}