(分享设计)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工程
1楼-- · 2019-07-16 20:56
我来详细讲解一下吧,我先讲16*16单 {MOD}点阵
嵌入式linux工程
2楼-- · 2019-07-17 00:28
首先还是讲一下芯片。先讲164芯片,它用作行扫描,行为低电平有效(0有效)。 164.png ,这个芯片叫做移位寄存器,根据芯片手册,把AB相连作为数据输入端,CLK作为时钟端,CLK是上升沿有效,来一个时钟,输出数据往右移动一次。若上电时芯片输出为 1111 1111 1111 1111,16个高电平,上电时AB为0,时钟信号来了一个上升沿,则AB移入寄存器,这时输出为0111 1111 1111 1111,这时选中了一行,若AB仍然保持为0,再来一个时钟信号时,这时输出为0011 1111 1111 1111,已经移入了两个0了,选中了两行,而点阵是逐行扫描显示的,就是一行一行往下显示,每次只有一行才会显示,切换速度加快你就看起来它们是同时显示的,上面有两行选中了所以不行。所以第一个时钟信号过后即输出为0111 1111 1111 1111时应该把AB设置为1,下一个时钟信号来时,由于AB为1了,所以输出为1011 1111 1111 1111,也就是说第二个时钟时选中了第二行,以此类推依次选中到16行,当输出为1111 1111 1111 1110时由于再移动一次最低位的0就移出去了,所以这时要把AB改为0了,再来时钟时输出为0111 1111 1111 1111,这就是行扫描。下面将列扫描,列扫描为高电平有效(1有效)。 595.png ,这是595芯片,也是一个移位寄存器,和164的不同是有锁存功能。锁存功能意思就是说你的时钟信号在给,数据也随着时钟信号一个一个输入到寄存器,但是寄存器的输出仍然没有改变,直到锁存引脚有高脉冲时,已经移位好的数据才会输出到引脚。若行数据选中的是第1行时,列数据输出为1110 1110 1110 1110这16个数据时,那么就是隔一个灯亮3个灯。若没有锁存引脚那么,每来一个时钟信号,输出引脚跟着改变,灯的状态一直在变化,直到16次之后才会正常,这样的话就乱了。
嵌入式linux工程
3楼-- · 2019-07-17 05:26
shujian200148 发表于 2013-7-17 21:17
能讲的更加简单点不!

已经补充16*16单 {MOD}点阵了
嵌入式linux工程
4楼-- · 2019-07-17 09:13
 精彩回答 2  元偷偷看……
韩古月
5楼-- · 2019-07-17 13:50
我最近弄了一个32*32的点阵,点阵里有HC595 和HC138芯片,我怎么弄懂不亮,能麻烦给个例子吗,我用AVR ATMEGE16编的,太谢谢了。
嵌入式linux工程
6楼-- · 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);
    }

}


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

一周热门 更多>