iT邦幫忙

0

Arduino 中使用LED呈現二進位計數

  • 分享至 

  • xImage

如題要計數0 ~ 255,過程中遇到的瓶頸是,8個LED中最高為元的2個LED永遠不會亮,當要進位到第7個位元後就開始會出問題,程式碼如下:

//file.ino

#include"library.h"

void setup()
{
  init();
}

void loop()
{
  run();
}
//library.h

#ifndef _LIBRARY_H
#define _LIBRARY_H
#include<Arduino.h>
#define L0 4
#define L1 5
#define L2 6
#define L3 7
#define L4 8
#define L5 9
#define L6 10
#define L7 11
#define delay_time 250

void init(); //初始化

void reset();

void run();

void binary(int);

#endif
//library.cpp

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

int flag[8]; //紀錄8個LED亮還是不亮

void init()
{
  for(int i = L0 ; i <= L7 ; i++)
  {
    pinMode(i,OUTPUT);
    digitalWrite(i,LOW);
  }
}
void reset()
{
  for(int i = L0 ; i <= L7 ; i++)
  {
    digitalWrite(i,LOW);
  }
}
void run()
{
  for(int i = 0 ; i < 256 ; i++)
  {
    binary(i);
    digitalWrite(L0,flag[7]);
    digitalWrite(L1,flag[6]);
    digitalWrite(L2,flag[5]);
    digitalWrite(L3,flag[4]);
    digitalWrite(L4,flag[3]);
    digitalWrite(L5,flag[2]);
    digitalWrite(L6,flag[1]);
    digitalWrite(L7,flag[0]);
    delay(delay_time);
    reset();
  }
}
void binary(int num)
{
    int bits = floor(log(num) / log(2)); //找出位元數-1
    int index = 8 - bits + 1; //要從哪個LED開始顯示
    flag[8] = {LOW};
    while(bits) //先找出最左邊的bit,再來找第二個,依此類推找到倒數第二個bit。
    {
        if((num >> bits) & 1) //如果是1就亮
        {
          flag[index++] = HIGH;
        }
        else
        {
          flag[index++] = LOW;
        }
        bits--; //找到最左邊的後換找第二個
    }
    if(num & 1) //最高位元
    {
      flag[index++] = HIGH;
    }
    else
    {
      flag[index++] = LOW;
    }
}

以上是我的程式碼,想請教問題到底是出在哪呢?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2022-10-24 10:09:57
最佳解答
int index = 8 - bits + 1; //要從哪個LED開始顯示

改成

int index = 8 - bits - 1; //要從哪個LED開始顯示

試試看

vuj8104 iT邦新手 4 級 ‧ 2022-10-24 12:42:04 檢舉

您好,問題已經解決,想請問為何這樣問題就能解決了呢?

因為程式裡的 bits 是「位元數減一」
所以
1.位元數=8-->bits=7-->應該從 index=0 開始顯示-->index=8-7-1
2.位元數=4-->bits=3-->應該從 index=4 開始顯示-->index=8-3-1

vuj8104 iT邦新手 4 級 ‧ 2022-10-24 19:02:04 檢舉

好的了解,非常感謝,但我現在遇到了另一個,當數字到255時,8個LED都亮了,但是並不會從0重新開始,高位元的燈都還是亮著,請問您是否知道是出在哪呢?

我要發表回答

立即登入回答