最新 Arduino 驱动 12接口/户外 LED显示屏/LED点阵屏/LED单元板

起因

现有的驱动LED显示屏的资料,比较好的只有这个。但是它驱动的是08接口的室内显示屏,而我要驱动的是12接口的户外显示屏。两种屏幕的区别在于户外屏幕点阵比较稀疏,而且二者的扫描方式,驱动方式都不太一样。我花了一个下午才摸索出了它的使用方式,因此分享给大家,希望大家不必再绕弯路。

材料准备

  • 12接口(户外)LED单元板一块:比如我是从[这里]买的,大家搜索“半户外 LED 单元板”就可以了。我的板是16x32大小。
  • Arduino Uno一块
  • 5V电源一个(比如充电宝、给手机充电的头)

硬件搭建

1.显示屏电源的焊接

LED单元板使用的是5V的电源,但是它只提供了两个旋螺丝的地方供接电源。因此我们要进行如下焊接:USB公头的+,-接到导线的+,-。这样之后USB直接插入手机充电器/充电宝,导线链接到显示屏的电源上。

2.Arduino与显示屏的连接

首先我们要知道12接口每个引脚的定义:

OE   A
N    B
N    C
N    CLK
N    HS
N    R
N    G
GND  D
  • N:表示没有任何用
  • A,B,C,D:行选择。由于我们是16x32的板,所以只会用到A,B(也就是0~3),至于为什么等到后面再说
  • OE:使能。如果是高电平则屏幕会亮,低电平则强制所有灯都灭
  • GND:地。(这些引脚中没有VCC脚...我也不知道为啥它能正常工作)
  • CLK,HS,R:就是74HC595中的SHCP,STCP,DS。具体自行学习595芯片。
  • G:本来指绿色,我们因为是单色所以没用。

接下来就是把它们连接到Arduino的引脚上了。我的库的默认设置如下:

const int A=2,const int B=3,const int CLK=12,const int STB=10,const int R=11,const int OE=9

当然,你也可以在库初始化的时候修改。

软件搭建

1.库的代码

我自己写了一个库,代码如下:

#include <Arduino.h>
#include "DotMatrix.h"

class LEDScreenHelper {
public:
    LEDScreenHelper(const int WIDTH=32,
            const int A=2,const int B=3,const int CLK=12,
            const int STB=10,const int R=11,const int OE=9):
            HEIGHT(16),WIDTH(WIDTH),A(A),B(B),SHCP(CLK),STCP(STB),DS(R),OE(OE){}

    void setup(){
        pinMode(A,OUTPUT);
        pinMode(B,OUTPUT);
        pinMode(STCP,OUTPUT);
        pinMode(SHCP,OUTPUT);
        pinMode(DS,OUTPUT);
        pinMode(OE,OUTPUT);
    }

    void setRow(byte row){
        digitalWrite(A,row&0x01);
        digitalWrite(B,row&0x02);
    }

    void sendColData(byte data){
        for(int i = 0;i<8;++i){
            digitalWrite(DS,(data&0x80));
            data<<=1;
            digitalWrite(SHCP,0);
            digitalWrite(SHCP,1);
        }
    }

    void setOE(bool enable){
        digitalWrite(OE, enable);
    }

    void display(DotMatrix &data){
        for(int row = 0;row<4;++row){
            digitalWrite(OE,0);
            for(int col = 0;col<WIDTH/2;++col){
                byte val = data.get((12-((col&3)<<2)+row),(col>>2));
                sendColData(~val);
            }
            setRow(row);
            digitalWrite(STCP,0);
            digitalWrite(STCP,1);
            digitalWrite(OE,1);
        }
        digitalWrite(OE,0);
    }

private:
    const int HEIGHT,WIDTH;
    const int A,B,SHCP,STCP,DS,OE;
};

其中需要#include "DotMatrix.h"如下:

#ifndef DOT_MATRIX
#define DOT_MATRIX

typedef unsigned char uchar;
#define THROW(str) ;

#define BYTE_LEN 8
#define CHECK_VAR(i,j) if((i)<0||(j)<0||(i)>=height||(j)>=width)THROW("Index out of Bound")
#define POS(matrix,i,j) (*((matrix) + (i) * (width) + (j)))
#define POS_BIT_GET(matrix,i,j) (POS((matrix),(i),(j)/BYTE_LEN) & (1<<(BYTE_LEN-(j)%BYTE_LEN-1)))
#define POS_BIT_SET_TRUE(matrix,i,j) (POS((matrix),(i),(j)/BYTE_LEN) |= (1<<(BYTE_LEN-(j)%BYTE_LEN-1)))
#define POS_BIT_SET_FALSE(matrix,i,j) (POS((matrix),(i),(j)/BYTE_LEN) &= (0xFF ^ (1<<(BYTE_LEN-(j)%BYTE_LEN-1))))
#define POS_BIT_SET(m,i,j,b) ((b)!=0)?POS_BIT_SET_TRUE((m),(i),(j)):POS_BIT_SET_FALSE((m),(i),(j))

/**
 * Remember: This class will only use `matrix` but NOT DELETE it
 */
class DotMatrix {
public:
    DotMatrix(int w,int h,uchar *matrix, bool isNowClearMatrix=true):
            width(w),height(h),matrix(matrix){
        if(isNowClearMatrix)clearData();
    }
    DotMatrix(const DotMatrix &src){
        Serial.println("DotMatrix copy construction - please avoid");
        width = src.width;
        height = src.height;
        matrix = src.matrix;
    }
    ~DotMatrix(){}

    void clearData(){
        memset(matrix,0,width*height*1);
    }

    inline void set(int i,int j,uchar val){
        CHECK_VAR(i,j);
        POS(matrix,i,j) = val;
    }

    inline uchar get(int i,int j){
        CHECK_VAR(i,j);
        return POS(matrix,i,j);
    }

    inline void setBit(int i,int jBit, bool b){
        CHECK_VAR(i,jBit/8);
        POS_BIT_SET(matrix,i,jBit,b);
    }

    inline bool getBit(int i,int jBit){
        CHECK_VAR(i,jBit/8);
        return POS_BIT_GET(matrix,i,jBit);
    }

    void fillTo(DotMatrix &fillTo, int xOffset, int yOffset, int scale){
        this->fillTo(fillTo,xOffset,yOffset,scale,scale,0,0,width*BYTE_LEN,height);
    }

    /**
     * fill the rect [xSrcBeg,ySrcBeg,xSrcEnd,ySrcEnd] to `fillTo` by the `offset` and `scale`
     * @param The things by **bit**
     */
    void fillTo(DotMatrix &fillTo, int xOffset, int yOffset, int xScale, int yScale,
            int xSrcBeg, int ySrcBeg, int xSrcEnd, int ySrcEnd) {
        for(int i = ySrcBeg;i<ySrcEnd;++i){
            for(int j = xSrcBeg;j<xSrcEnd;++j){
                for(int ii=0;ii<yScale;++ii){
                    for(int jj=0;jj<xScale;++jj){
                        //VAR_DUMP_INLINE(i);VAR_DUMP_INLINE(j);VAR_DUMP_INLINE(ii);VAR_DUMP(jj);
                        fillTo.setBit(yOffset+(i-ySrcBeg)*yScale+ii, xOffset+(j-xSrcBeg)*xScale+jj, POS_BIT_GET(matrix,i,j));
                    }
                }
            }
        }
    }

    void print(){
        for(int i = 0;i<height;++i){
            for(int j = 0;j<width;++j){
                for(int k = 7;k>=0;--k){
                    Serial.print((get(i,j) & (1<<k))!=0);
                }
                Serial.print(" ");
            }
            Serial.println(" ");
        }
        Serial.flush();
    }

    int getWidth(){
        return width;
    }

    int getHeight(){
        return height;
    }

    uchar *getMatrix(){
        return matrix;
    }
private:
    int width,height;
    uchar *matrix;
private:
    friend class DisplayHelper;
};
#undef BYTE_LEN
#undef POS
#undef POS_BIT

#endif

解释一下,DotMatrix这个类是一个二维矩阵的操作类,只要给它一个一维数组作为存储空间,它就可以模拟出一个二维的数组。这样可以减少Arduino上的内存分配与销毁。

2.库的使用

#include <Arduino.h>
#include "LEDScreenHelper.h"

LEDScreenHelper helper;
unsigned char data[4*16];
DotMatrix matrix(4,16,data);

void setup(){
    helper.setup();
    for(int i = 0;i<16;++i){
        for(int j = 0;j<4;++j){
            matrix.set(i,j,i+j*16);
        }
    }
}

void loop(){
    helper.display(matrix);
}

例程如上。它的效果是把屏幕想象成一个左上角为(0,0)的坐标系,然后8个点(1byte)看成一块,每一块的0-3bit表示y坐标,4-5bit表示j坐标。

效果如下:

注意事项

  1. 如果就驱动那一块单元板,不需要买40块那种的开关电源!就算你要买,也先问清楚怎么和220V接,貌似要自己搞连接线。
  2. 程序中不要让它一直亮着,而要让大部分时间内OE=0,也就是不亮。这样子相当于PWM,能够让它的功耗降低,从而5V 2A的电源才足够。
  3. 貌似显示屏的电源不接也可以,接了会更亮一点;貌似显示屏电源和Arduino电源不共地也可以,虽然有人说要共地,有人甚至说要同一个电源。这个我不知道到底要怎么做,有知道的人麻烦告诉我一下,谢谢
时间: 2024-10-14 12:39:42

最新 Arduino 驱动 12接口/户外 LED显示屏/LED点阵屏/LED单元板的相关文章

LED显示屏灰度等级的提高及非线性纠正

http://www.doc88.com/p-09193698596.html之原文 作者:杨赓 上海中大高新电子技术有限公司 摘要:本文从增加LED元色调灰深度着手对LED显示屏的非线性灰度纠正提出了不同的解决方法,从而彻底改变LED显示屏显示效果不佳的现状,深入实施可望带动中国整个LED产业,使LED产品的图象品质步入新的时代 关键词: 显示:LED:非线性纠正: 一.引言 LED显示屏作为大型显示设备的一种,具有亮度高.价格低.寿命长.维护简便等优点.带有灰度效果的LED显示屏较之普通LE

LED显示屏小知识大集锦

显示屏入门知识 led 是 light emitting diode 发光二极管的英文缩写,简称 LED . LED显示屏( LED panEL )是通过一定的控制方式,用于显示文字.文本.图形.图像.动画.行情等各种信息以及电视.录像信号并由 LED 器件阵列组成的显示屏幕.作为新一代的显示媒体,已广泛应用在展览中心.交易中心.拍卖中心.金融中心.信息中心.证券.电信.税务.供电.海关.法院.消防.车站.机场.码头.人才市场等有营业大厅的公共场合. 显示性能 LED显示屏按显示性能分为文本 L

led显示屏之家

现阶段led显示屏适应时代发展而设计,一切产品开发以满足市场需求为首要任务.产品型号丰富,产品要接受定制,可满足各阶层的需求. 目前市场上的led显示屏有户外全彩led显示屏,室内全彩led显示屏,舞台租赁led屏,灯条led显示屏,透明led显示屏,DJled显示屏,3D全息led风扇.主要产品型号如下:室内全彩LED显示屏:P1.8/P1.9/P2.0/P2.5/P3/P4/P5/P6/P7.62/P10--户外全彩LED显示屏:P4/P5/P6/P8/P10/P16/P20/P25/P31

led液晶显示屏播放器LED Player详细使用教程

LED Player显示屏播放器是一个专业的LED屏显播放器,给用户带来全新操控体验的高能单双色软件,更方便易用,更具性价比,更多显示效果,led显示屏播放器支持多页面多分区的节目编辑,提供了丰富灵活的视频切换功能.分区特效,以及三维特效动画.该软件搭建了一个能让您充分发挥创意的平台,让显示屏的显示效果得到完美展现. LEDPlayer支持ZH系列接收卡.发送卡,支持一台PC机控制多个LED显示屏, 支持对LED显示屏的智能参数设置. 一.屏参设置: 打开LED Player 6.0软件,点击[

户外立柱式LED显示屏的安全标准你知道吗?

立柱式LED显示屏在保证屏体的质量外还有一个很重要的地方是不得不考虑的,那就是LED显示屏的立柱,考察户外LED显示屏立柱的安全性主要可以从以下三个方面进行: 一.对LED显示屏立柱的基底的检查.基底形式及布置主要以下有两种: 1.一种是平衡重力式,即上部荷载主要由大体积基础重力来平衡,一般为砼基底.这种基底形式适宜在土质松软且有开阔的施工场地时利用. 2.另一种为桩基式,其中又以扩孔桩为主,该类基底方式可在施工场地受限的状况下选用.在判定广告屏基底时首要须检查其初始的图纸.施工材料,然后在条件

不得不知的LED显示屏选购的常用术语

LED显示屏: LED显示屏(LED panEL):LED就是light emitting diode ,发光二极管的英文缩写,简称LED.它是一种通过控制半导体发光二极管的显示方式,用来显示文字.图形.图像.动画.行情.视频.录像信号等各种信息的显示屏幕. LED显示屏分为图文显示屏和视频显示屏,均由LED矩阵块组成.图文显示屏可与计算机同步显示汉字.英文文本和图形;视频显示屏采用微型计算机进行控制,图文.图像并茂,以实时.同步.清晰的信息传播方式播放各种信息,还可显示二维.三维动画.录像.电

LED显示屏厂家的目光将聚焦在哪里?(一)

当下,LED电子屏在一些传统领域,如户外广告.舞台租赁等方面的应用已经越来越成熟的了,LED显示屏厂家的差异化也越来越少,导致市场竞争日益激烈.为了开辟新的战场,拓展LED电子屏的应用领域,各种创新层出不穷,以此来挑战并迎接新的商机.与此同时,配套厂商以及上游产业链的技术更新,如更小的间距.更小的灯珠.更具备操作性的控制系统,也是LED显示屏厂家积极开辟新应用领域的导火线.下面我们来盘点一下未来几年LED显示屏厂家的目光将聚焦在哪些领域. 酒店宴会 在以往,酒店行业很少会配备LED显示屏,因为成

LED显示屏要预防夏季雷雨天气

全国各地已全面步入夏季,而夏季的雷雨天气常常给户外LED显示屏钢架结构带来雷击隐患,看以下几个防雷措施. (1)针对直击雷的防护,在LED电子显示屏(户外)的支撑结构上安装避雷针,室内全彩LED显示屏或者旁边有高大建筑物的LED电子屏,可以不用考虑安装避雷针. (2)针对钢结构的反击,将钢结构与LED全彩屏的外壳相连,做好等电位,并且做好接地,接地阻值通常要求小于10欧姆,阻值如果达不到要求,就要做附加的人工接地网.防雷器也要做好接地. (3)针对电源线上感应的雷电流,在电源线上加装单相或者三相

技术分析:LED显示屏户外表贴的优势及发展趋势

导读: 比起直插式LED,户外表贴的一致性更好.直插式红.绿.蓝椭圆形LED在不同角度三种亮度的一致性指标是很难达到的,而户外表贴能够做到在不同角度红.绿.蓝三种亮度的匹配一致性高度一致…… 在日益先进的LED技术发展下,之前仅用于户内表贴的LED显示屏开始大量应用于户外,逐步侵占直插市场份额.众所周知,户外LED显示屏在几年前全部都是采用直插式器件,而表贴的显示屏亮度低,且无法适应户外复杂的环境,因此表贴LED显示屏只能大量应用在户内,而直插LED器件则独占户外显示屏天下.而今,技术的发展让表