(分享设计)LED点阵经验各种点阵驱动方法讲解

2019-07-15 23:39发布

        相信很多朋友都喜欢LED点阵屏吧,可是对于初学者而言,可能点阵的驱动会有点困难。现在就此讲解一下点阵的驱动方法。上几个图看看我做的点阵的效果吧。首先上个单 {MOD}点阵的吧, 点阵16_48.jpg ,这个有原理图,那么就给大家看看原理图吧, 595.png 这个是595芯片,串入并出,作为列输出,注意这个芯片有锁存输出,也就是说只有锁存脚有脉冲信号时输出才会改变,再看看行输出,就是控制选通每一行的, 164.png ,这个芯片和595主要的区别是没有锁存输出,为什么行不要锁存输出呢?因为每次选通一行,每来一个时钟信号改变一行,若行为低电平有效,164上电默认输出为1,则先移入一个0进去,然后一直移入1,直到16行移完,再循环,这里没来一个时钟输出都会变一下,而如果列输出也这样的话,列数据是经过16次的变化才得到最终的正确数据,而不是一次得到一个正确数据。然后继续下一个啊,这个是双 {MOD}点阵 点阵48_64.jpg ,这个其实是红 {MOD}、绿 {MOD}、红绿结合(橙 {MOD}),这个我没原理图,但是这些都可以做,现在要自己分析了,不要原理图!对于大部分点阵都是逐行扫描的,行扫描一般都是A、B、C、D四根线组成的,再经过译码形成16根行选通信号线,再加上列数据输入线、列时钟线、列锁存线基本就没什么线了,再加个OE吧,这个用来控制亮度的,红、绿各有自己的数据线,但其他线都是公用的,先查查里面用的芯片,再先选通一行,再写入一个字节数据,看显示出来的和你的数据是怎么样的。下面展示一下彩 {MOD}点阵,有三原 {MOD}的,RGB,扫描方式是分上下两屏同时16行扫描,数据断独立,控制端共用,无原理图 IMG_20130717_153659.jpg IMG_20130717_153839.jpg IMG_20130717_153843.jpg IMG_20130717_153849.jpg 像这样的屏幕一般都有ABCD的,前面说了这个是行扫描,16行的,然后LAT(列锁存),CLK(时钟),每种颜 {MOD}有独立的数据输入。先讲到这里吧,上传几个程序供大家参考,不是通用的啊,根据原理图更改相应程序。有兴趣的朋友可以交流交流啊。
IMG_20130717_130342.jpg
参考程序.rar 下载积分: 积分 -1 分
13.45 KB, 下载次数: 932, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
嵌入式linux工程
2019-07-17 16:00
韩古月 发表于 2013-7-23 16:20
我最近弄了一个32*32的点阵,点阵里有HC595 和HC138芯片,我怎么弄懂不亮,能麻烦给个例子吗,我用AVR ATME ...

我给你分析一下吧,向这种点阵一般是把HC138作为行扫描的,因为这个译码器可以级联,输出低电平有效,所以行为0有效,级联后行有四根输入,一般的点阵都是写ABCD着四根引脚,ABCD=“0000”就选中第0行,这样只可以选中16行,但是把点阵分为上下两屏的话,上下两屏的行一样,即0-17行,1-18行,这样依次下去,当选中第0行时第17行同时也选中,当选中第1行时第18行也同时选中,这是16扫的,就是分为上下两屏同时扫描,每屏16行,所以程序大概这样:
unsigned char DataBuffer[8][16]={//32列的点阵,分为4个8列
/*上半屏  16*32*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",0第1个部分的,即第1个8列*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1第2个部分的,即第2个8列*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",0第3个部分的,即第3个8列*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1第4个部分的,即第4个8列*/

/*下半屏  16*32*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",0第1个部分的,即第1个8列*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1第2个部分的,即第2个8列*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",0第3个部分的,即第3个8列*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1第4个部分的,即第4个8列*/
};//缓存数据

//595有CLK,LAT,DATA  3个主要信号

void Send_Byte(unsigned char sel,unsigned data)
{
     usnigned char j;
     for(j=0;j<8;j++)               
     {                                       
            CLK = 0;             if(UP == sel)  DATAUP = data&0x01;                       
            if(DOWN == sel)  DATADOWN= data&0x01;      
            temp >>= 1;                 
            CLK = 1;          //将数据移位            
      }  }


void Set_ABCD(unsigned char value)//行选中函数,若P1.0~P1.3输出到ABCD四个引脚
{
    P1OUT = value &0x0f;
}
void Send_Row_Data(unsigned char (*buf)[16],unsigned char n)//参数为要发送的数据,行数
{
    unsigned char i;
    for(i=0;i<4;i++)
    {
        Send_Byte(UP,buf[n]);//每次移动8位数据,循环四次共32位,对应32列
        Send_Byte(DOWN,buf[i+4][n]);
    }
    LAT = 0;
    LAT = 1;//将数据输出
}

void Led_Display(void)
{
    for(i=0;i<16;i++)//16行扫描
   {
       Set_ABCD(i);//选中某一行
       Send_Row_Data(DataBuffer,i);
    }

}


这个供你参考,这还要看你的点阵是什么样子的,要具体点阵测试才好些,

一周热门 更多>