1. 程式人生 > >Arduino 數碼管LED驅動 陣列法

Arduino 數碼管LED驅動 陣列法

上個例子講到驅動LED數碼管,採用一種最直接的方案,對每個LED進行高低電平的控制,這樣的優點是每個LED都是受控可檢的,避免了由於短路造成的假象,但對於數字變化來說,寫起來就非常冗餘,因此這次嘗試用陣列的方法實現。

//設定陰極介面
int d1 = 1;
int d2 = 2;
int d3 = 3;
int d4 = 4;
int d5 = 5;
int d6 = 6;
int d7 = 7;
//設定陽極介面
int a = 8;
int b = 9;
int c = 10;
int d = 11;
int e = 12;
int f = 13;
int g = A0;
int h = A1;

byte gyang[8] = { a, b, c, d, e, f, g, h };
byte gyin[7] = { d1, d2, d3, d4, d5, d6, d7 };
 
byte gong_yang[14][8] = { 
                          { 1,1,0,0,0,0,0,0 },  // 0 = 缺水
                          { 0,0,1,1,0,0,0,0 },  // 1 = 低水位
                          { 0,0,0,0,1,1,1,0 },  // 2 = 定時關機
                          { 1,1,1,1,1,1,0,0 },  // 3 = 0
                          { 0,1,1,0,0,0,0,0 },  // 4 = 1
                          { 1,1,0,1,1,0,1,0 },  // 5 = 2
                          { 1,1,1,1,0,0,1,0 },  // 6 = 3
                          { 0,1,1,0,0,1,1,0 },  // 7 = 4
                          { 1,0,1,1,0,1,1,0 },  // 8 = 5
                          { 1,0,1,1,1,1,1,0 },  // 9 = 6
                          { 1,1,1,0,0,0,0,0 },  // 10 = 7
                          { 1,1,1,1,1,1,1,0 },  // 11 = 8
                          { 1,1,1,1,0,1,1,0 },  // 12 = 9
                          { 0,0,0,0,0,0,0,1 },  // 13 = 攝氏度符號、睡眠符號
                        }; 
                        
byte gong_yin[5][7] = { 
                          { 1,1,1,1,1,1,0 },  // 0 = 缺水、低水位、定時關機
                          { 0,1,1,1,1,1,1 },  // 1 = 溫度十位、攝氏度符號
                          { 1,0,1,1,1,1,1 },  // 2 = 溫度個位、睡眠符號
                          { 0,0,1,1,1,1,1 },  // 3 = 溫度個和十位
                          { 1,1,0,0,0,0,1 },  // 4 = 時鐘個、十位和兩點
                        }; 
void setup()
{
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(d5, OUTPUT);
pinMode(d6, OUTPUT);
pinMode(d7, OUTPUT);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(h, OUTPUT);
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(h, LOW);
digitalWrite(d1, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
digitalWrite(d5, HIGH);
digitalWrite(d6, HIGH);
digitalWrite(d7, HIGH);
}

void loop()
{
  GongYang(0);
  GongYin(0);
  delay(300);
  GongYang(1);
  delay(300);
  GongYang(2);
  delay(300);
  GongYin(3);
  GongYang(3);
  delay(300);
  GongYang(4);
  delay(300);
  GongYang(5);
  delay(300);
  GongYang(6);
  delay(300);
  GongYang(7);
  delay(300);
  GongYang(8);
  delay(300);
  GongYang(9);
  delay(300);
  GongYang(10);
  delay(300);
  GongYang(11);
  delay(300);
  GongYang(12);
  delay(300);
  GongYang(13);
  GongYin(1);
  delay(300);
  GongYin(2);
  delay(300);
  GongYin(4);
  GongYang(3);
  delay(300);
  GongYang(4);
  delay(300);
  GongYang(5);
  delay(300);
  GongYang(6);
  delay(300);
  GongYang(7);
  delay(300);
  GongYang(8);
  delay(300);
  GongYang(9);
  delay(300);
  GongYang(10);
  delay(300);
  GongYang(11);
  delay(300);
  GongYang(12);
  delay(300);
}

void GongYang(int x)
{
  for (int i = 0; i < 8; i++) 
  {
    digitalWrite(gyang[i], gong_yang[x][i]);
  }
}

void GongYin(int y)
{
  for (int i = 0; i < 7; i++) 
  {
    digitalWrite(gyin[i], gong_yin[y][i]);
  }
}

SETUP語句和LOOP語句還有很多冗餘的程式碼,用for迴圈優化程式碼。

//設定陰極介面
int d1 = 1;
int d2 = 2;
int d3 = 3;
int d4 = 4;
int d5 = 5;
int d6 = 6;
int d7 = 7;
//設定陽極介面
int a = 8;
int b = 9;
int c = 10;
int d = 11;
int e = 12;
int f = 13;
int g = A0;
int h = A1;

byte gyang[8] = { a, b, c, d, e, f, g, h };
byte gyin[7] = { d1, d2, d3, d4, d5, d6, d7 };
 
byte gong_yang[14][8] = { 
                          { 1,1,0,0,0,0,0,0 },  // 0 = 缺水
                          { 0,0,1,1,0,0,0,0 },  // 1 = 低水位
                          { 0,0,0,0,1,1,1,0 },  // 2 = 定時關機
                          { 1,1,1,1,1,1,0,0 },  // 3 = 0
                          { 0,1,1,0,0,0,0,0 },  // 4 = 1
                          { 1,1,0,1,1,0,1,0 },  // 5 = 2
                          { 1,1,1,1,0,0,1,0 },  // 6 = 3
                          { 0,1,1,0,0,1,1,0 },  // 7 = 4
                          { 1,0,1,1,0,1,1,0 },  // 8 = 5
                          { 1,0,1,1,1,1,1,0 },  // 9 = 6
                          { 1,1,1,0,0,0,0,0 },  // 10 = 7
                          { 1,1,1,1,1,1,1,0 },  // 11 = 8
                          { 1,1,1,1,0,1,1,0 },  // 12 = 9
                          { 0,0,0,0,0,0,0,1 },  // 13 = 攝氏度符號、睡眠符號
                        }; 
                        
byte gong_yin[5][7] = { 
                          { 1,1,1,1,1,1,0 },  // 0 = 缺水、低水位、定時關機
                          { 0,1,1,1,1,1,1 },  // 1 = 溫度十位、攝氏度符號
                          { 1,0,1,1,1,1,1 },  // 2 = 溫度個位、睡眠符號
                          { 0,0,1,1,1,1,1 },  // 3 = 溫度個和十位
                          { 1,1,0,0,0,0,1 },  // 4 = 時鐘個、十位和兩點
                        }; 
void setup()
{
  pinMode(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  for(int i=1; i<14;i++)
  {
    pinMode(i,OUTPUT);
  }
}

void loop()
{
  GongYin(0);
  for(int i=0; i<3; i++)
  {
    GongYang(i);
    delay(300);
  }
  GongYin(3);
  for(int i=3; i<13; i++)
  {
    GongYang(i);
    delay(300);
  }
  GongYang(13);
  GongYin(1);
  delay(300);
  GongYin(2);
  delay(300);
  GongYin(4);
  for(int i=3; i<13; i++)
  {
    GongYang(i);
    delay(300);
  }
}

void GongYang(int x)
{
  for (int i = 0; i < 8; i++) 
  {
    digitalWrite(gyang[i], gong_yang[x][i]);
  }
}

void GongYin(int y)
{
  for (int i = 0; i < 7; i++) 
  {
    digitalWrite(gyin[i], gong_yin[y][i]);
  }
}