极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20574|回复: 11

20個按鍵->20個LED

[复制链接]
发表于 2016-6-7 10:05:50 | 显示全部楼层 |阅读模式
想請教大家
目前要做一個 20個按鍵->20個LED
每一個按鍵對應一個LED燈
輸入端用74165收集,輸出端用74595擴充
請問ShiftOut指令要怎麼處理這麼長的bit串

因為按鈕資料進ARDUINO後 還要處理,不是單純輸出到LED。
想請教大家要怎麼將20bit資料,做有效的輸入輸出?

謝謝

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2016-6-7 11:33:58 | 显示全部楼层
一个int就有32位了,还可以用bool型的数组处理。
回复 支持 反对

使用道具 举报

发表于 2016-6-7 11:35:59 | 显示全部楼层
可以参考下我用的这个按键处理,http://www.geek-workshop.com/thread-26618-1-1.html
回复 支持 反对

使用道具 举报

发表于 2016-6-7 12:18:21 | 显示全部楼层
用数组,char型的 char switch[3]  ,从165读取按键值,放到数组中,然后将数组里的值输出到595,这样就可以了。因为是20位按键和led,所以要用 8*3 也就是24位来存储。
另外纠正一下楼上, 8位avr单片机的Arduino,int 型是16位,2个字节。
回复 支持 反对

使用道具 举报

发表于 2016-6-7 12:29:13 | 显示全部楼层
楼上说得对,arduino的int是16位的

num=位数; a=存储值
那么
(a>>num)&0x01  就可以判断那个位是否为1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-7 13:00:58 | 显示全部楼层
本帖最后由 hss03100130 于 2016-6-7 13:12 编辑
164335413 发表于 2016-6-7 12:18
用数组,char型的 char switch[3]  ,从165读取按键值,放到数组中,然后将数组里的值输出到595,这样就可以 ...


謝謝你
這個char switch[3] (多出了switch)的用法我不太清楚,能否給個提示?
若是將165資料存到 long 再輸出,會不會比較方便?
只是ShiftOut ,一次只有8bit,要怎麼拆開傳輸到74595?


回复 支持 反对

使用道具 举报

发表于 2016-6-7 19:28:32 | 显示全部楼层
164335413 发表于 2016-6-7 12:18
用数组,char型的 char switch[3]  ,从165读取按键值,放到数组中,然后将数组里的值输出到595,这样就可以 ...

还真是这样,去查了下:
On the Arduino Uno (and other ATMega based boards) an int stores a 16-bit (2-byte) value.
On the Arduino Due, an int stores a 32-bit (4-byte) value.
回复 支持 反对

使用道具 举报

发表于 2016-6-7 22:21:04 | 显示全部楼层
wwwymq 发表于 2016-6-7 19:28
还真是这样,去查了下:
On the Arduino Uno (and other ATMega based boards) an int stores a 16-bit  ...

恩,一开始学C语言时,我只知道在计算机上的int是32位的,后来学8位单片机,int就变成16位了。
回复 支持 反对

使用道具 举报

发表于 2016-6-7 22:23:43 | 显示全部楼层
hss03100130 发表于 2016-6-7 13:00
謝謝你
這個char switch[3] (多出了switch)的用法我不太清楚,能否給個提示?
若是將165資料存到 lon ...

这就是为什么让你用char形 或者说是byte型 了,因为他是8位的,处理起来只需要循环三次,每次移动8位就可以实现了。
或者long型的 每次取8位,循环三次也可以。
回复 支持 反对

使用道具 举报

发表于 2016-6-8 00:43:39 | 显示全部楼层
wwwymq 发表于 2016-6-7 19:28
还真是这样,去查了下:
On the Arduino Uno (and other ATMega based boards) an int stores a 16-bit  ...

连用几次shiftout试试看,移位寄存器不是可以级联吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-13 21:08:14 | 显示全部楼层
本帖最后由 hss03100130 于 2016-6-13 21:16 编辑

請高手幫我看看
程式這樣的流程有沒有問題。
功能為:
20個按鈕->對應20顆LED
按下按鈕,對應的LED會發光,但是放開按鈕的時候LED不會熄;
直到按其它鈕,對應的LED亮起,原來的LED熄滅。
int 165_dataPin = 3;
int 165_loadPin = 4;
int 165_clockPin = 5;

int 595_dataPin = 8;
int 595_latchPin = 9;
int 595_clockPin = 10;


void setup()
{
      
        pinMode(165_clockPin,OUTPUT);
        pinMode(165_loadPin,OUTPUT);
        pinMode(165_dataPin,INPUT);

        pinMode(595_clockPin,OUTPUT);
        pinMode(595_latchPin,OUTPUT);
        pinMode(595_dataPin,OUTPUT);
}        



void loop()
{
  int i=0
  long temp = 0;  //BUFFER 32BIT
  long data = 0
  digitalWrite(165_loadPin,LOW);  //PL->LOW
  delay(1);      
  digitalWrite(165_loadPin,HIGH); //PL->HIGH

  data = 0

  for(i=0;i<23;i++)      //GET 24BIT
  {
    data = data << 1;
    temp = digitalRead(165_dataPin);
    data |= temp;
    digitalWrite(165_clockPin,LOW);//CK->LOW
    delay(10);
    digitalWrite(165_clockPin,HIGH);//CK->HIGH
  }

   if (data > 31);  //SOME BUTTON BE PRESSED
{
    for (int led = 0; led < 23,  ; led++)
   {
    digitalWrite(595_latchPin, LOW)
    shiftOut(595_dataPin, 595_clockPin, MSBFIRST, data / 65536)
    shiftOut(595_dataPin, 595_clockPin, MSBFIRST, data / 256)
    shiftOut(595_dataPin, 595_clockPin, MSBFIRST, data)&#128;
    digitalWrite(595_latchPin, HIGH)
   }
  
}
因為只控制20 BIT
所以74165的末4BIT 補1
74595的末4BIT空接不用

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-15 00:11:31 | 显示全部楼层
int x165dataPin = 3;
int x165loadPin = 4;
int x165clockPin =5;

int x595dataPin = 13;
int x595latchPin = 12;
int x595clockPin = 11;


void setup()
{
      
        pinMode(x165clockPin,OUTPUT);
        pinMode(x165loadPin,OUTPUT);
        pinMode(x165dataPin,INPUT);

        pinMode(x595clockPin,OUTPUT);
        pinMode(x595latchPin,OUTPUT);
        pinMode(x595dataPin,OUTPUT);
}        



void loop()
{
  int i;
  long temp = 0;  //BUFFER 32BIT
  long data = 0;
  digitalWrite(x165loadPin,LOW);  //PL->LOW
  delay(10);      
  digitalWrite(x165loadPin,HIGH); //PL->HIGH

  data = 0;

  for(i=0;i<23;i++)      //GET 24BIT
  {
    data = data << 1;
    temp = digitalRead(x165dataPin);
    data |= temp;
    digitalWrite(x165clockPin,LOW);//CK->LOW
    delay(10);
    digitalWrite(x165clockPin,HIGH);//CK->HIGH
  }

  if (data >15 && data<16777231 )  //2^4   ~   2^24
  {
    for (int led = 0; led < 23 ; led++)
    {
    digitalWrite(x595latchPin, LOW);
   
    shiftOut(x595dataPin, x595clockPin, MSBFIRST, data );
    shiftOut(x595dataPin, x595clockPin, MSBFIRST, data / 256);
    shiftOut(x595dataPin, x595clockPin, MSBFIRST, data / 65536);
    digitalWrite(x595latchPin, HIGH);
    }
  }  
}
求救阿  程式不會動
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-20 18:46 , Processed in 0.043769 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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