YFROBOT创客社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 21394|回复: 18
打印 上一主题 下一主题

arduino 驱动 8x8点阵模块(2片74HC595芯片驱动红色8X8点阵 5线连接 )滚屏显示

[复制链接]

签到天数: 866 天

[LV.10]以坛为家III

跳转到指定楼层
楼主
发表于 2015-10-19 10:33:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 AllBlue 于 2020-3-6 13:08 编辑

arduino 驱动 8x8点阵模块(2片74HC595芯片驱动红色8X8点阵  5线连接 )滚屏显示!

arduino 8x8点阵地址:http://www.yfrobot.com/thread-2264-1-1.html
8x8点阵使用起来比较麻烦,需要连接16个引脚,所以我们改为模块,它采用2片74HC595芯片驱动红色8X8点阵管,只需要使用控制器3路IO口,根据点阵管动态扫描原理进行显示,可以显示多种图案,使用更加方便!
点阵模块简介:wiki - 8x8点阵模块
wiki地址中有驱动点阵模块的例程,因为上位机软件的不同,出来的数据不同,所以程序也不可能一样的!
wiki中使用的是如下图的上位机软件,很好用的软件。


软件下载地址:
百度网盘下载地址:http://pan.baidu.com/s/1pJAFgWN
论坛中还有用点阵模块做乒乓游戏的贴:http://www.yfrobot.com/thread-2408-1-1.html

本帖也做一个8x8点阵模块的驱动,和上面的有些区别,要实现滚屏显示!
首先我们需要用到arduino 控制板和点阵模块,还需要一个取模软件。
取模软件截图:



软件下载:
首先我们连接arduino控制板和点阵模块,(除了电源引脚,其他引脚可根据实际情况选择连接,只要程序和硬件对应就可以):


连接好后我们看下程序:
[C] 纯文本查看 复制代码
/**************************************************
 * Face
 * ( 8x8 Led Dot Matrix with two 74HC595 on Arduino)
 *
 * by YFROBOT
 ***************************************************/
#define AFrame 7                        // animation array 
#define Space 4                         // Each frame space
#define FStep (8+Space)

//Pin connected to DS of 74HC595
int SER = 10;
//Pin connected to ST_CP of 74HC595
int RCK  = 11;
//Pin connected to SH_CP of 74HC595
int SRCK  = 12;

byte screen[8] = {0, 0, 0, 0, 0, 0, 0, 0};
byte scroll = 0;
byte frame = 0;

unsigned char animation[AFrame][8] = {
  {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
  //user defined animation data
  //  {0xFF, 0xA5, 0xC3, 0x81, 0xBD, 0xA5, 0xA5, 0xFF,},
  //  {0xC3, 0xC3, 0x0, 0x18, 0x18, 0x0, 0x42, 0x3C,},
  //  {0x8, 0xC, 0xFE, 0xFF, 0xFE, 0xC, 0x8, 0x0,},
  //  {0xC3, 0x81, 0xE7, 0xE7, 0xE7, 0x81, 0x81, 0xC3,},
  {0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42,},
  {0x7E, 0x40, 0x40, 0x7C, 0x40, 0x40, 0x40, 0x7E,},
  {0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7C,},
  {0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7C,},
  {0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18,},

  {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
};


void setup() {
  pinMode(RCK, OUTPUT);
  pinMode(SRCK, OUTPUT);
  pinMode(SER, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // Parameters 1: animation data
  // Parameters 2: display mode
  // Parameters 3: refresh time
  ScreenDisplay( animation, 1 , 200);
}

void UpDateScreen(byte data[], unsigned long ReTime) {
  unsigned long startime = millis();
  while (millis() - startime < ReTime)
  {
    for (int i = 0; i < 8; i++) {
      byte col = B1 << i;
      digitalWrite(RCK, LOW);
      shiftOut(SER, SRCK, LSBFIRST, ~col); //先选择列
      shiftOut(SER, SRCK, LSBFIRST, data[i]); //再送行数据
      digitalWrite(RCK, HIGH);
    }
  }
}

void ScreenDisplay( unsigned char AN[AFrame][8], int mode , unsigned long ReTime) {

  UpDateScreen(screen, ReTime);     // Refresh screen data

  if (mode == 0 ) {              // mode 1:refresh Display
    for (int i = 0; i < 8; i++) {
      screen[i] = AN[frame][i];
    }
    frame ++;
    if (frame >=  AFrame) {
      frame = 0;
    }
  } else if (mode == 1) {        // mode 2: scroll Display
    if (scroll > FStep * frame && scroll <= FStep * (frame + 1)) {
      for (int i = 0; i < 8; i++) {
        screen[i] = (AN[frame][i] << (scroll - FStep * frame)) | (AN[frame + 1][i] >> (FStep * (frame + 1) - scroll)) ;
      }
      if (scroll % FStep == 0) {
        frame ++;
        if (frame >=  AFrame - 1) {
          frame = 0;
          scroll = 1;
        }
      }
    }
    scroll++;
  }
}

程序中参数和函数简介:
animation[AFrame][8] 需要用户通过上面的取模软件获取,编辑你想要的画面后,复制下面的数据至animation数组中即可!
AFrame 值根据你数组来定   
Space 是每组画面间的间隔,例如为4,则两个画面间隔4列!
ScreenDisplay( unsigned char AN[AFrame][8],int mod, unsigned long ReTime) 函数为显示函数;其中
    参数一:数组数据
    参数二:显示模式  1为滚屏模式,0为动画模式
    参数三:显示速度

下面我们运行程序看下效果(程序显示HELLO滚屏效果~~):

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对

签到天数: 866 天

[LV.10]以坛为家III

推荐
 楼主| 发表于 2016-1-27 09:21:21 | 只看该作者
回复 支持 0 反对 1

使用道具 举报

签到天数: 27 天

[LV.4]偶尔看看III

板凳
发表于 2016-1-26 08:36:54 | 只看该作者
本帖最后由 hero_sun 于 2016-1-28 14:08 编辑

能不能做pong游戏?

点评

不知道是什么  发表于 2016-1-26 08:54
回复 支持 反对

使用道具 举报

签到天数: 27 天

[LV.4]偶尔看看III

地板
发表于 2016-1-26 15:59:23 | 只看该作者
本帖最后由 hero_sun 于 2016-1-28 14:08 编辑
hero_sun 发表于 2016-1-26 08:36
能不能做pong游戏?

就是用变阻器操作拍子打球的
回复 支持 反对

使用道具 举报

签到天数: 27 天

[LV.4]偶尔看看III

5#
发表于 2016-1-29 17:09:08 | 只看该作者
谢谢AllBlue!
回复 支持 反对

使用道具 举报

签到天数: 866 天

[LV.10]以坛为家III

6#
 楼主| 发表于 2016-7-28 15:10:26 | 只看该作者
ytheanswer 发表于 2016-7-28 12:46
那个shiftout函数是哪个库的?

在这里:
https://www.arduino.cc/en/Reference/ShiftOut
不用添加库,可直接使用!
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2016-8-17 13:01:00 | 只看该作者
楼主你好,我是新手,看到帖子用你的源代码,一直无法编译上传到Arduino UNO,显示ScreenDisplay()函数在该部分未定义,想问下这是为什么?
回复 支持 反对

使用道具 举报

签到天数: 866 天

[LV.10]以坛为家III

8#
 楼主| 发表于 2016-8-17 13:32:55 | 只看该作者
大闲人 发表于 2016-8-17 13:01
楼主你好,我是新手,看到帖子用你的源代码,一直无法编译上传到Arduino UNO,显示ScreenDisplay()函数在该 ...

将setup 函数和 loop函数移到程序最后,再编译试试看!应该是编译器问题
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 2016-8-18 13:04:05 | 只看该作者
AllBlue 发表于 2016-8-17 13:32
将setup 函数和 loop函数移到程序最后,再编译试试看!应该是编译器问题

谢谢,楼主可以了。楼主,如果想改成级联该怎么改.
回复 支持 反对

使用道具 举报

签到天数: 866 天

[LV.10]以坛为家III

10#
 楼主| 发表于 2016-8-18 14:03:10 | 只看该作者
本帖最后由 AllBlue 于 2016-8-18 14:06 编辑
大闲人 发表于 2016-8-18 13:04
谢谢,楼主可以了。楼主,如果想改成级联该怎么改.

这个模块没有引出级联引脚!
不过需要的话,可以根据原理图,用3根线分别将RCK/SRCK/SER连接上,其中SER需要连接到第二片74HC595的QH1引脚,见下图:

连接好后,程序也需要更改下!
如果不会的话,看下这个网页:https://www.arduino.cc/en/Tutorial/ShiftOut,再研究下74HC595芯片手册。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|联系我们|YFROBOT ( 苏ICP备20009901号-2  

GMT+8, 2024-5-17 15:36 , Processed in 0.050560 second(s), 27 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表