极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12497|回复: 5

74HC595级联求助

[复制链接]
发表于 2015-9-7 09:22:38 | 显示全部楼层 |阅读模式
大家好。本人刚玩arduino之前没有学过51单片机之类的。由于本人是电工,学的是plc编程。跟单片机编程形式不一样。现在我想做一个按键控制继电器的。用plc控制的话成本太高,因为只是单纯的驱动继电器。而且位数输出越多就越贵。现在想用矩阵扫描,用74hc595做级联扩展。前两行键盘控制一个595,第三行控制第二个595,第四行控制第三个595。我看了一下论坛的教程,还是不太明白。我是想三片的数据互不干扰,我按第一行。第二第三个595的数据不变。是延迟一次数据?还是发个空数据?下面那个是一片控制的。测试能否实现。

  1. #include <Keypad.h>int latchpin = 12;
  2. int clockpin = 11;
  3. int datapin = 9;
  4. const byte ROWS = 4; //four rows
  5. const byte COLS = 3; //three columns
  6. char keys[ROWS][COLS] = {
  7.   {'1','2','3'},
  8.   {'4','5','6'},
  9.   {'7','8','9'},
  10.   {'A','B','C'}
  11. };
  12. byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
  13. byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad

  14. Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

  15. void setup()
  16. {
  17.   pinMode(11,OUTPUT);
  18.   pinMode(12,OUTPUT);
  19.   pinMode(9,OUTPUT);
  20.   digitalWrite(latchpin,LOW);
  21.   shiftOut(datapin,clockpin,MSBFIRST,0);
  22.   digitalWrite(latchpin,HIGH);
  23. }

  24. void loop(){
  25.    
  26.    char key = keypad.getKey();
  27.    char a[8]={1,2,4,8,16,32,64,128};
  28.   switch(key)
  29.   {
  30.     case '1':digitalWrite(latchpin,LOW);
  31.              shiftOut(datapin,clockpin,MSBFIRST,a[0]);
  32.              digitalWrite(latchpin,HIGH);
  33.              delay(500);
  34.              break;
  35.     case '2':digitalWrite(latchpin,LOW);
  36.              shiftOut(datapin,clockpin,MSBFIRST,a[1]);
  37.              digitalWrite(latchpin,HIGH);
  38.              delay(500);
  39.              break;
  40.     case '3':digitalWrite(latchpin,LOW);
  41.              shiftOut(datapin,clockpin,MSBFIRST,a[2]);
  42.              digitalWrite(latchpin,HIGH);
  43.              delay(500);
  44.               break;
  45.     case '4':digitalWrite(latchpin,LOW);
  46.              shiftOut(datapin,clockpin,MSBFIRST,a[3]);
  47.              digitalWrite(latchpin,HIGH);
  48.              delay(500);
  49.              break;   
  50.     case '5':digitalWrite(latchpin,LOW);
  51.              shiftOut(datapin,clockpin,MSBFIRST,a[4]);
  52.              digitalWrite(latchpin,HIGH);
  53.              delay(500);
  54.              break;
  55.     case '6':digitalWrite(latchpin,LOW);
  56.              shiftOut(datapin,clockpin,MSBFIRST,a[5]);
  57.              digitalWrite(latchpin,HIGH);
  58.             delay(500);
  59.              break;
  60.     case '7':digitalWrite(latchpin,LOW);
  61.              shiftOut(datapin,clockpin,MSBFIRST,a[6]);
  62.              digitalWrite(latchpin,HIGH);
  63.              delay(500);
  64.              break;
  65.     case '8':digitalWrite(latchpin,LOW);
  66.              shiftOut(datapin,clockpin,MSBFIRST,a[7]);
  67.              digitalWrite(latchpin,HIGH);
  68.              delay(500);
  69.              break;
  70.            }
  71. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2015-9-7 09:49:52 | 显示全部楼层
现在两片的话,按两次会把第一片的数据传入第二片。现在我想读取第二片的数据一起传入第一片,但不知道如何获取
回复 支持 反对

使用道具 举报

发表于 2015-9-7 11:24:48 | 显示全部楼层
有做好的模块不行么?

实在不行直接上  2560 可不可以?

越简单越可靠啊
回复 支持 反对

使用道具 举报

发表于 2015-9-7 11:43:47 | 显示全部楼层
不明白什么意识?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-7 12:16:49 | 显示全部楼层
zoologist 发表于 2015-9-7 11:24
有做好的模块不行么?

实在不行直接上  2560 可不可以?

嗯。打算用51的,引脚比较多。
回复 支持 反对

使用道具 举报

发表于 2015-9-7 17:12:58 | 显示全部楼层
如果你是4片级联,最好是每次都将四组数据写入后在将ST_CP送入上升沿,这样就不会出现这种情况了。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 04:24 , Processed in 0.038068 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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