8X8点阵实现电梯运行效果

8*8 LED点阵模块

之前我们使用MAX7219仿真驱动了数码管,

MAX7219驱动数码管(Proteus仿真)

手里恰好有一个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,自动生成点阵。

《OLED液晶屏如何显示中文呢?》

不过在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);
      
    }
  }  
}
声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 2
收藏 3
关注 62
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧