Arduino基礎入門篇21—點陣流動顯示

在各種公共場合看到的點陣屏大多都有流動顯示效果,顯示內容可以上下左右的滾動,本篇我們來實現點陣屏的流動顯示。

1. 實驗材料

  • Uno R3開發板
  • 配套USB數據線
  • 麪包板及配套連接線
  • 8*8點陣屏

2. 實驗步驟

1. 根據原理圖搭建電路。

依然是前篇點陣屏電路連接方式。根據點陣屏管腳定義,點陣屏的[9, 14, 8, 12, 1, 7, 2, 5]分別連接開發板的[6,11, 5, 9, 14, 4, 15, 2],點陣屏的[13, 3, 4, 10, 6, 11, 15, 16]分別連接開發板的[10,16, 17, 7, 3, 8, 12, 13]。

這裏需要注意,Uno R3開發板的A0A5也可以做普通GPIO使用,編號分別爲1419。

實驗原理圖如下圖所示:

實驗原理圖

實物連接圖如下圖所示:

實驗原理圖

2. 新建sketch,拷貝如下代碼替換自動生成的代碼並進行保存。

/*
   Roll
   點陣屏流動顯示
*/
int leds[8] = {6, 11, 5, 9, 14, 4, 15, 2}; //點陣屏正極引腳
int gnds[8] = {10, 16, 17, 7, 3, 8, 12, 13}; //點陣屏負極引腳

//字庫
char test[] = {
  0x00, 0x7C, 0x8A, 0x92, 0xA2, 0x7C, 0x00, 0x00, // -0-
  0x00, 0x00, 0x42, 0xFE, 0x02, 0x00, 0x00, 0x00, // -1-
  0x00, 0x46, 0x8A, 0x92, 0x92, 0x62, 0x00, 0x00, // -2-
  0x00, 0x84, 0x82, 0x92, 0xB2, 0xCC, 0x00, 0x00, // -3-
  0x00, 0x18, 0x28, 0x48, 0xFE, 0x08, 0x00, 0x00, // -4-
  0x00, 0xE4, 0xA2, 0xA2, 0xA2, 0x9C, 0x00, 0x00, // -5-
  0x00, 0x3C, 0x52, 0x92, 0x92, 0x8C, 0x00, 0x00, // -6-
  0x00, 0x80, 0x8E, 0x90, 0xA0, 0xC0, 0x00, 0x00, // -7-
  0x00, 0x6C, 0x92, 0x92, 0x92, 0x6C, 0x00, 0x00, // -8-
  0x00, 0x62, 0x92, 0x92, 0x94, 0x78, 0x00, 0x00, // -9-
  0x00, 0x3E, 0x48, 0x88, 0x48, 0x3E, 0x00, 0x00, // -A-
  0x00, 0xFE, 0x92, 0x92, 0x92, 0x6C, 0x00, 0x00, // -B-
  0x00, 0x7C, 0x82, 0x82, 0x82, 0x44, 0x00, 0x00, // -C-
  0x00, 0xFE, 0x82, 0x82, 0x82, 0x7C, 0x00, 0x00, // -D-
  0x00, 0xFE, 0x92, 0x92, 0x92, 0x82, 0x00, 0x00, // -E-
  0x00, 0xFE, 0x90, 0x90, 0x90, 0x80, 0x00, 0x00, // -F-

};

void setup() {
  for (int i = 0; i < 8; i++)
  {
    pinMode(leds[i], OUTPUT);
    pinMode(gnds[i], OUTPUT);
    digitalWrite(gnds[i], HIGH); //負極引腳拉高,熄滅所有LED
  }
}

void ledclean()
{
  for (int i = 0; i < 8; i++)//將點陣屏正極ladies,負極拉高,關斷顯示
  {
    digitalWrite(leds[i], LOW);
    digitalWrite(gnds[i], HIGH);
  }
}

//字符顯示
void ledShow(char num, char dat)
{
  digitalWrite(gnds[num], LOW);
  for (int i = 0; i < 8; i++)
  {
    digitalWrite(leds[i], dat & 0x80); // 1 0 0 0 0 0 0 0
    dat <<= 1;
  }
  delayMicroseconds(100);
  digitalWrite(gnds[num], HIGH);
  ledclean();
}

void loop() {

  for (int a = 0; a < 120; a++) //控制流動顯示內容
  {
    for (int i = 0 ; i < 200 ; i++)//循環顯示達到延時效果
    {
      for (int c = 0; c < 8; c++) //8列循環掃描,達到點陣屏驅動效果
      {
        ledShow(c, test[c + a]);
      }
    }
  }

}

3. 連接開發板,設置好對應端口號和開發板類型,進行程序下載。

程序下載

4. 程序下載後,點陣屏從右往左流動顯示。

流動顯示

5. 我們對loop()部分的程序進行修改,來改變每次流動的列數。

void loop() {

  for (int a = 0; a < 16; a++) //控制流動顯示內容
  {
    for (int i = 0 ; i < 200 ; i++)//循環顯示達到延時效果
    {
      for (int c = 0; c < 8; c++) //8列循環掃描,達到點陣屏驅動效果
      {
        ledShow(c, test[c + a*8]);
      }
    }
  }

}

6. 當每次移動8列時,就會整屏覆蓋翻頁顯示,效果如下:

翻頁顯示

3. 實驗分析

  1. 程序中定義了一個數組用於存儲需要顯示的字庫,每8個表示一個字符,然後通過ledShow()函數來進行解析顯示。使用for循環控制指定的列然後將傳入的字符數據進行按位與,取出每一位進行操作。
  2. 在loop()中三重for循環,最裏面控制8列掃描顯示,中間for循環用於控制顯示時間,最外層for循環用於控制流動位置。
  3. 依次移動需要顯示的字符數據,就達到了流動顯示效果。可以控制每次移動的間距,當每次移動8列就會實現整屏覆蓋的效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章