查看: 415|回复: 1

[经验] arduino驱动p6全彩led单元

[复制链接]
  • TA的每日心情
    开心
    2019-7-22 10:11
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    发表于 2019-4-25 09:26 | 显示全部楼层 |阅读模式
    本帖最后由 s65moto 于 2019-4-25 15:45 编辑

    近日偶得全彩led单元板,16*32。成本不高,显示面积大96*192mm,所以想用arduino驱动玩玩。
    参考了官方的shiftOut()的使用方法。
    板子背后的集成电路有74hc245。74hc138。74hc040d。APM4953。JXI5020GF。
    74hc245是一种兼容TTL器件引脚的高速CMOS总线收发器(bus transceiver),典型的CMOS型三态缓冲门电路,八路信号收发器。
    74hc138是3-8线译码器。控制显示行。
    74hc040d是6位反相器。只用了其中两位,控制JXI5020GF使能端的。
    JXI5020GF参数没找到,参考的MBI5026恒流驱动芯片。
    ABC部分可以简化,希望大神抛玉。

    kittenblock中小学创客名师推荐的图形化编程软件

    int LEPin = 8;//LE锁存控制
    int CLKPin = 12;//时钟 上升沿输入数据
    int R1Pin = 11;//红色上半部分数据
    int R2Pin = 10;//红色下半部分数据
    int OEPin = 13;//使能
    int APin = 2;//A
    int BPin = 3;//B
    int CPin = 4;//C
    int shuzi[10][16] = {
      {0x00, 0x00, 0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00}, /*"0",0*/
      {0x00, 0x00, 0x00, 0x10, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00}, /*"1",1*/
      {0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x04, 0x04, 0x08, 0x10, 0x20, 0x42, 0x7E, 0x00, 0x00}, /*"2",2*/
      {0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x04, 0x18, 0x04, 0x02, 0x02, 0x42, 0x44, 0x38, 0x00, 0x00}, /*"3",3*/
      {0x00, 0x00, 0x00, 0x04, 0x0C, 0x14, 0x24, 0x24, 0x44, 0x44, 0x7E, 0x04, 0x04, 0x1E, 0x00, 0x00}, /*"4",4*/
      {0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x58, 0x64, 0x02, 0x02, 0x42, 0x44, 0x38, 0x00, 0x00}, /*"5",5*/
      {0x00, 0x00, 0x00, 0x1C, 0x24, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00}, /*"6",6*/
      {0x00, 0x00, 0x00, 0x7E, 0x44, 0x44, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00}, /*"7",7*/
      {0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x24, 0x18, 0x24, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}, /*"8",8*/
      {0x00, 0x00, 0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x26, 0x1A, 0x02, 0x02, 0x24, 0x38, 0x00, 0x00}, /*"9",9*/
    };
    int ni[16][2] = {{0x08, 0x80},  {0x08, 0x80},  {0x08, 0x80},  {0x11, 0xFE},  {0x11, 0x02},  {0x32, 0x04},  {0x34, 0x20},  {0x50, 0x20},  {0x91, 0x28},  {0x11, 0x24},  {0x12, 0x24},  {0x12, 0x22},  {0x14, 0x22},  {0x10, 0x20},  {0x10, 0xA0},  {0x10, 0x40}};/*"你",0*/
    int hao[16][2] = {{0x10, 0x00}, {0x10, 0xFC}, {0x10, 0x04}, {0x10, 0x08}, {0xFC, 0x10}, {0x24, 0x20}, {0x24, 0x20}, {0x25, 0xFE},
      {0x24, 0x20}, {0x48, 0x20}, {0x28, 0x20}, {0x10, 0x20}, {0x28, 0x20}, {0x44, 0x20}, {0x84, 0xA0}, {0x00, 0x40}}; /*"好",1*/
    void setup()
    {
      // put your setup code here, to run once:
      pinMode(LEPin, OUTPUT);
      pinMode(CLKPin, OUTPUT);
      pinMode(R1Pin, OUTPUT);
      pinMode(R2Pin, OUTPUT);
      pinMode(APin, OUTPUT);
      pinMode(BPin, OUTPUT);
      pinMode(CPin, OUTPUT);
      pinMode(OEPin, OUTPUT);
    }
    void loop()
    {
      for (int k = 0; k < 60; k++)
      {
        // put your main code here, to run repeatedly:
        //向上计数程序
        for (int i = 0; i < 16; i++)//16行扫描
        {
          if (i < 8)//上边8行扫描
          {
            switch (i)
            {
              case 0: digitalWrite(APin, LOW); digitalWrite(BPin, LOW); digitalWrite(CPin, LOW); break;
              case 1: digitalWrite(APin, HIGH); digitalWrite(BPin, LOW); digitalWrite(CPin, LOW); break;
              case 2: digitalWrite(APin, LOW); digitalWrite(BPin, HIGH); digitalWrite(CPin, LOW); break;
              case 3: digitalWrite(APin, HIGH); digitalWrite(BPin, HIGH); digitalWrite(CPin, LOW); break;
              case 4: digitalWrite(APin, LOW); digitalWrite(BPin, LOW); digitalWrite(CPin, HIGH); break;
              case 5: digitalWrite(APin, HIGH); digitalWrite(BPin, LOW); digitalWrite(CPin, HIGH); break;
              case 6: digitalWrite(APin, LOW); digitalWrite(BPin, HIGH); digitalWrite(CPin,  HIGH); break;
              case 7: digitalWrite(APin, HIGH); digitalWrite(BPin, HIGH); digitalWrite(CPin, HIGH); break;
            }
            digitalWrite(CLKPin, LOW);
            //传输数据的时候将LEPin拉高
            /*
              shiftOut()
              将一个数据的一个字节一位一位的移出。从最高有效位(最左边)或最低有效位(最右边)开始。依次向数据脚写入每一位,之后时钟脚被拉高或拉低,指示刚才的数据有效。
              注意:如果你所连接的设备时钟类型为上升沿,你要确定在调用shiftOut()前时钟脚为低电平,如调用digitalWrite(clockPin, LOW)。
              shiftOut(dataPin, clockPin, bitOrder, value)
              dataPin:输出每一位数据的引脚(int)
              clockPin:时钟脚,当dataPin有值时此引脚电平变化(int)
              bitOrder:输出位的顺序,最高位优先(MSBFIRST)或最低位优先(LSBFIRST)
              value: 要移位输出的数据(byte)
            */
            digitalWrite(LEPin, HIGH);//锁存置高,传递数据
            for (int j = 0; j < 4; j++)
            {
              if (j < 2)
              {
                shiftOut(R1Pin, CLKPin, MSBFIRST, ni[j]);//高位先发送
              }
              else
              {
                shiftOut(R1Pin, CLKPin, MSBFIRST, hao[j - 2]);
              }
            }
            //之后将LEPin拉低以告诉芯片
            //它不需要再接受信息了
            digitalWrite(LEPin, LOW);//锁存置低,显示
            digitalWrite(OEPin, HIGH);//使能打开,使led显示
            delayMicroseconds(500);//显示微秒,50-500(频率大约是600hz-60hz)
            digitalWrite(OEPin, LOW);//使能关闭,关闭led显示
          }
          else//下边8行扫描
          {
            switch (i - 8)
            {
              case 0: digitalWrite(APin, LOW); digitalWrite(BPin, LOW); digitalWrite(CPin, LOW); break;
              case 1: digitalWrite(APin, HIGH); digitalWrite(BPin, LOW); digitalWrite(CPin, LOW); break;
              case 2: digitalWrite(APin, LOW); digitalWrite(BPin, HIGH); digitalWrite(CPin, LOW); break;
              case 3: digitalWrite(APin, HIGH); digitalWrite(BPin, HIGH); digitalWrite(CPin, LOW); break;
              case 4: digitalWrite(APin, LOW); digitalWrite(BPin, LOW); digitalWrite(CPin, HIGH); break;
              case 5: digitalWrite(APin, HIGH); digitalWrite(BPin, LOW); digitalWrite(CPin, HIGH); break;
              case 6: digitalWrite(APin, LOW); digitalWrite(BPin, HIGH); digitalWrite(CPin,  HIGH); break;
              case 7: digitalWrite(APin, HIGH); digitalWrite(BPin, HIGH); digitalWrite(CPin, HIGH); break;
            }
            digitalWrite(CLKPin, LOW);
            digitalWrite(LEPin, HIGH);
            for (int j = 0; j < 4; j++)
            {
              if (j < 2)
              {
                shiftOut(R2Pin, CLKPin, MSBFIRST, ni[j]);
              }
              else
              {
                shiftOut(R2Pin, CLKPin, MSBFIRST, hao[j - 2]);
              }
            }
            digitalWrite(LEPin, LOW);
            digitalWrite(OEPin, HIGH);
            delayMicroseconds(500);
            digitalWrite(OEPin, LOW);
          }
        }
      }
      for (int t = 0; t < 10; t++)
      {
        for (int n = 0 ; n < 60; n++)
        {
          for (int i = 0; i < 16; i++)
          {
            if (i < 8)
            {
              switch (i)
              {
                case 0: digitalWrite(APin, LOW); digitalWrite(BPin, LOW); digitalWrite(CPin, LOW); break;
                case 1: digitalWrite(APin, HIGH); digitalWrite(BPin, LOW); digitalWrite(CPin, LOW); break;
                case 2: digitalWrite(APin, LOW); digitalWrite(BPin, HIGH); digitalWrite(CPin, LOW); break;
                case 3: digitalWrite(APin, HIGH); digitalWrite(BPin, HIGH); digitalWrite(CPin, LOW); break;
                case 4: digitalWrite(APin, LOW); digitalWrite(BPin, LOW); digitalWrite(CPin, HIGH); break;
                case 5: digitalWrite(APin, HIGH); digitalWrite(BPin, LOW); digitalWrite(CPin, HIGH); break;
                case 6: digitalWrite(APin, LOW); digitalWrite(BPin, HIGH); digitalWrite(CPin,  HIGH); break;
                case 7: digitalWrite(APin, HIGH); digitalWrite(BPin, HIGH); digitalWrite(CPin, HIGH); break;
              }
              digitalWrite(CLKPin, LOW);
              digitalWrite(LEPin, HIGH);//锁存置高,传递数据
              shiftOut(R1Pin, CLKPin, MSBFIRST, shuzi[t]);//高位先发送
              shiftOut(R1Pin, CLKPin, MSBFIRST, shuzi[t]);//高位先发送
              shiftOut(R1Pin, CLKPin, MSBFIRST, shuzi[t]);//高位先发送
              shiftOut(R1Pin, CLKPin, MSBFIRST, shuzi[t]);//高位先发送
              //之后将LEPin拉低以告诉芯片
              //它不需要再接受信息了
              digitalWrite(LEPin, LOW);//锁存置低,显示
              digitalWrite(OEPin, HIGH);//使能打开,使led显示
              delayMicroseconds(500);//显示微秒,50-500
              digitalWrite(OEPin, LOW);//使能关闭,关闭led显示
            }
            else//下边8行扫描
            {
              switch (i - 8)
              {
                case 0: digitalWrite(APin, LOW); digitalWrite(BPin, LOW); digitalWrite(CPin, LOW); break;
                case 1: digitalWrite(APin, HIGH); digitalWrite(BPin, LOW); digitalWrite(CPin, LOW); break;
                case 2: digitalWrite(APin, LOW); digitalWrite(BPin, HIGH); digitalWrite(CPin, LOW); break;
                case 3: digitalWrite(APin, HIGH); digitalWrite(BPin, HIGH); digitalWrite(CPin, LOW); break;
                case 4: digitalWrite(APin, LOW); digitalWrite(BPin, LOW); digitalWrite(CPin, HIGH); break;
                case 5: digitalWrite(APin, HIGH); digitalWrite(BPin, LOW); digitalWrite(CPin, HIGH); break;
                case 6: digitalWrite(APin, LOW); digitalWrite(BPin, HIGH); digitalWrite(CPin,  HIGH); break;
                case 7: digitalWrite(APin, HIGH); digitalWrite(BPin, HIGH); digitalWrite(CPin, HIGH); break;
              }
              digitalWrite(CLKPin, LOW);
              digitalWrite(LEPin, HIGH);
              shiftOut(R2Pin, CLKPin, MSBFIRST, shuzi[t]);
              shiftOut(R2Pin, CLKPin, MSBFIRST, shuzi[t]);
              shiftOut(R2Pin, CLKPin, MSBFIRST, shuzi[t]);
              shiftOut(R2Pin, CLKPin, MSBFIRST, shuzi[t]);
              digitalWrite(LEPin, LOW);
              digitalWrite(OEPin, HIGH);
              delayMicroseconds(500);
              digitalWrite(OEPin, LOW);
            }
          }
        }
      }
    }


    背面集成电路

    背面集成电路

    单元板背面

    单元板背面

    单元板正面

    单元板正面

    全亮

    全亮

    汉字

    汉字

    数字

    数字
  • TA的每日心情
    开心
    2019-7-22 10:11
  • 签到天数: 28 天

    [LV.4]偶尔看看III

     楼主| 发表于 2019-4-25 09:26 | 显示全部楼层
    视频效果显示没法上传。
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    ArduinoJason6教程由ArduinoJson作者Benoit亲自出马一对一教学
    ArduinoJason6教程由Ardui
    这几天我觉得社区教学好像缺了点什么,呃呃~我想一想好像是缺少了ArduinoJson6的教学
    Arduino+L298N小车实例教程
    Arduino+L298N小车实例教
    (第一次写教程,如有错漏,敬请拍砖)Arduino+L298N小车实例教程Arduino小车是一个非
    零知开源分享-蓝牙模块与手机APP通信
    零知开源分享-蓝牙模块与
    本篇文章中将讲解蓝牙模块与安卓手机APP进行通信。1、说明MCU:零知开发板-标准板模
    DHT库无法被找到
    DHT库无法被找到
    今天在安装了DHT库之后在编译时却显示无法找到库,请问我是在哪里安装出错了,谢谢大
    (可远程)ESP8266读DHT11温湿度,APP inventor制作app实时显示
    (可远程)ESP8266读DHT11
    原理讲解 原理简述:利用发布订阅模式。第一步,先读取DHT11温湿度数值,第二步,新
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表