☛ 功能說明

使用電腦鍵盤控制 8×8 矩陣型 LED 顯示器動態左、右移顯示字元 A。 當按下 R 鍵時,顯示字元右移;當按下 L 鍵時,顯示字元左移;按其他鍵時,則停止移動。 常見的字元移動變化如左移、右移上移、下移等,如圖所示為 8×8 矩陣型 LED 顯示器與 MAX7219 接腳的對應,無論是左移、右移、上移、下移,移動 8 次後即會重複相同的畫面。

⚑字元左移

先將陣列資料 character[0] 的內容移入 temp 暫存器中,再依次將 character[1] 的內容移入 character[0],character[2] 的內容移入 character[1]… 等,最後再將 temp 暫存器中的內容移入character[7]中,畫面即會左移一行。

⚑ 字元右移

先將陣列資料 character[7] 的內容移入 temp 暫存器中,再依次將 character[6] 的內容移入 character[7],character[5] 的內容移入 character[6]… 等,最後再將 temp 暫存器中的內容移入character[0]中,畫面即會右移一行。

⚑ 字元上移

只要將每個陣列資料位元組右移一位元畫面即可上移一列。

⚑ 字元下移

只要將每個陣列資料位元組左移一位元畫面即可下移一列。

☛ 使用材料

Arduino UNO R3 開發板 × 1、8×8 共陰極矩陣型 LED 顯示器 ( MAX7219 ) 模組 × 1 。

☛ 電路圖及麵包板接線圖

☛ 程式码

#include <SPI.h>                                        //使用 SPI 函式庫

const int slaveSelect=10;                               //數位接腳 10 接 MAX7219 致能腳
const int decodeMode=9;                                 //MAX7219 解碼模式暫存器
const int intensity=10;                                 //MAX7219 亮度控制暫存器
const int scanLimit=11;                                 //MAX7219 掃描限制暫存器
const int shutDown=12;                                  //MAX7219 關閉模式暫存器
const int dispTest=15;                                  //MAX7219 顯示測試暫存器

int ch;                                                 //鍵盤按鍵值
byte i;                                                 //陣列指標
byte temp;                                              //位元組資料暫存區
byte character[8]=                                      //字元 A
     { 0x00, 0xfc, 0x12, 0x11, 0x11, 0x12, 0xfc, 0x00 };

void setup()
{
     Serial.begin(9600);                                //串列埠初始化,設定鮑率 9600bps
     SPI.begin();                                       //SPI 介面初始化
     pinMode(slaveSelect,OUTPUT);                       //設定數位接腳 10 為輸出模式
     digitalWrite(slaveSelect,HIGH);                    //除能 MAX7219
     sendCommand(shutDown,1);                           //MAX7219 正常工作
     sendCommand(dispTest,0);                           //關閉 MAX7219 顯示測試
     sendCommand(intensity,1);                          //設定 MAX7219 亮度為 1
     sendCommand(scanLimit,7);                          //設定 MAX7219 掃描位數為8位
     sendCommand(decodeMode,0);                         //設定 MAX7219 不解碼

     for(i=0;i<8;i++)                                   //顯示字元 A
         sendCommand(i+1,character[i]);
}

void loop()
{
     if(Serial.available())                             //鍵盤按下任意鍵??
          ch=Serial.read();                             //讀取按鍵值

     if(ch=='R' || ch=='r')                             //按 R 鍵(右移)?
     {
          temp=character[7];
          for(i=7;i>0;i--)                              //右移一行
              character[i]=character[i-1];
          character[0]=temp;
     }

    if(ch=='L' || ch=='l')                              //按 L 鍵(左移)?
    {
          temp=character[0];
          for(i=0;i<7;i++)                              //左移一行
              character[i]=character[i+1];
          character[7]=temp;
    }

    for(i=0;i<8;i++)                                    //顯示字元 A
        sendCommand(i+1,character[i]);

    delay(500);                                         //延遲 500ms
}

void sendCommand(byte command, byte value)
{
     digitalWrite(slaveSelect,LOW);                     //致能 MAX7219
     SPI.transfer(command);                             //傳送第一位元組資料至 MAX7219
     SPI.transfer(value);                               //傳送第二位元組資料至 MAX7219
     digitalWrite(slaveSelect,HIGH);                    //除能 MAX7219
}

 

☛ 練習

⑴ 設計 Arduino 程式,使用 Arduino 開發板控制 8×8 矩陣型 LED 顯示器動態上、下顯示字元 A。 由電腦鍵盤輸入透過串列埠傳送至 Arduino 開發板,當按下 U 鍵時,顯示字元 A 上移;當按下 D 鍵時,顯示字元下移;按其它鍵則停止移動。

#include <SPI.h>                                        //使用 SPI 函式庫

const int slaveSelect=10;                               //數位接腳 10 接 MAX7219 致能腳
const int decodeMode=9;                                 //MAX7219 解碼模式暫存器
const int intensity=10;                                 //MAX7219 亮度控制暫存器
const int scanLimit=11;                                 //MAX7219 掃描限制暫存器
const int shutDown=12;                                  //MAX7219 關閉模式暫存器
const int dispTest=15;                                  //MAX7219 顯示測試暫存器

int ch;                                                 //鍵盤按鍵值
byte i;                                                 //陣列指標
byte temp;                                              //位元組資料暫存區
byte character[8]=                                      //字元 A
     { B00000000, B11111100, B00010010, B00010001, 
       B00010001, B00010010, B11111100, B00000000 };

void setup()
{
     Serial.begin(9600);                                //串列埠初始化,設定鮑率 9600bps
     SPI.begin();                                       //SPI 介面初始化
     pinMode(slaveSelect,OUTPUT);                       //設定數位接腳 10 為輸出模式
     digitalWrite(slaveSelect,HIGH);                    //除能 MAX7219
     sendCommand(shutDown,1);                           //MAX7219 正常工作
     sendCommand(dispTest,0);                           //關閉 MAX7219 顯示測試
     sendCommand(intensity,1);                          //設定 MAX7219 亮度為 1
     sendCommand(scanLimit,7);                          //設定 MAX7219 掃描位數為 8 位
     sendCommand(decodeMode,0);                         //設定 MAX7219 不解碼

     for(i=0;i<8;i++)                                   //顯示字元 A
         sendCommand(i+1,character[i]);
}

void loop()
{
     if(Serial.available())                             //鍵盤按下任意鍵??
          ch=Serial.read();                             //讀取按鍵值

     if(ch=='D' || ch=='d')                             //按 D 鍵(下移)?
     {
          for(i=0;i<8;i++)
          {
               temp=bitRead(character[i],7);
               character[i]=character[i]<<1;
               character[i]=bitWrite(character[i],0,temp);
          }
     }

    if(ch=='U' || ch=='u')                              //按 U 鍵(上移)?
    {
          for(i=0;i<8;i++)
          {
               temp=bitRead(character[i],0);
               character[i]=character[i]>>1;
               character[i]=bitWrite(character[i],7,temp);
          }
    }

    if(ch!='D' && ch!='d' && ch!='U' && ch!='u')        //按鍵不為 U 或 D ? 
       ch=' ';

    for(i=0;i<8;i++)                                    //顯示字元 A
        sendCommand(i+1,character[i]);

    delay(500);                                         //延遲 500ms
}

void sendCommand(byte command, byte value)
{
     digitalWrite(slaveSelect,LOW);                     //致能 MAX7219
     SPI.transfer(command);                             //傳送第一位元組資料至 MAX7219
     SPI.transfer(value);                               //傳送第二位元組資料至 MAX7219
     digitalWrite(slaveSelect,HIGH);                    //除能 MAX7219
}

 

⑵ 設計 Arduino 程式,使用 Arduino 開發板控制 8×8 矩陣型 LED 顯示器動態上、下、左、右顯示字元 A。 由電腦鍵盤輸入透過串列埠傳送至 Arduino 開發板,當按下 U 鍵時,顯示字元 A 上移;當按下 D 鍵時,顯示字元下移;當按下 R 鍵時,顯示字元 A 右移;當按下 L 鍵時,顯示字元左移;按其它鍵則停止移動。

#include <SPI.h>                                        //使用 SPI 函式庫

const int slaveSelect=10;                               //數位接腳 10 接 MAX7219 致能腳
const int decodeMode=9;                                 //MAX7219 解碼模式暫存器
const int intensity=10;                                 //MAX7219 亮度控制暫存器
const int scanLimit=11;                                 //MAX7219 掃描限制暫存器
const int shutDown=12;                                  //MAX7219 關閉模式暫存器
const int dispTest=15;                                  //MAX7219 顯示測試暫存器

int ch;                                                 //鍵盤按鍵值
byte i;                                                 //陣列指標
byte temp;                                              //位元組資料暫存區
byte character[8]=                                      //字元 A
     { B00000000, B11111100, B00010010, B00010001, 
       B00010001, B00010010, B11111100, B00000000 };

void setup()
{
     Serial.begin(9600);                                //串列埠初始化,設定鮑率 9600bps
     SPI.begin();                                       //SPI 介面初始化
     pinMode(slaveSelect,OUTPUT);                       //設定數位接腳 10 為輸出模式
     digitalWrite(slaveSelect,HIGH);                    //除能 MAX7219
     sendCommand(shutDown,1);                           //MAX7219 正常工作
     sendCommand(dispTest,0);                           //關閉 MAX7219 顯示測試
     sendCommand(intensity,1);                          //設定 MAX7219 亮度為 1
     sendCommand(scanLimit,7);                          //設定 MAX7219 掃描位數為 8 位
     sendCommand(decodeMode,0);                         //設定 MAX7219 不解碼

     for(i=0;i<8;i++)                                   //顯示字元 A
         sendCommand(i+1,character[i]);
}

void loop()
{
     if(Serial.available())                             //鍵盤按下任意鍵??
          ch=Serial.read();                             //讀取按鍵值

     switch(ch)
     {
          case 'U':                                     //字元上移
          case 'u':
                   moveUp();
                   break;
          case 'D':                                     //字元下移
          case 'd':
                   moveDown();
                   break;
          case 'R':                                     //字元右移
          case 'r':
                   moveRight();
                   break;
          case 'L':                                     //字元左移
          case 'l':
                   moveLeft();
                   break;
          default:                                      //停止字元移動
                   ch=' ';
                   break;
     }
               
    charDisplay();                                      //顯示字元
    delay(500);                                         //延遲 500ms
}

void sendCommand(byte command, byte value)
{
     digitalWrite(slaveSelect,LOW);                     //致能 MAX7219
     SPI.transfer(command);                             //傳送第一位元組資料至 MAX7219
     SPI.transfer(value);                               //傳送第二位元組資料至 MAX7219
     digitalWrite(slaveSelect,HIGH);                    //除能 MAX7219
}

void charDisplay()
{
     for(i=0;i<8;i++)                                   //顯示字元 A
        sendCommand(i+1,character[i]);

}

void moveUp()
{
     for(i=0;i<8;i++)                                   //位元右移
     {
         temp=bitRead(character[i],0);
         character[i]=character[i]>>1;
         character[i]=bitWrite(character[i],7,temp);
     }
}

void moveDown()
{
     for(i=0;i<8;i++)                                   //位元左移
     {
         temp=bitRead(character[i],7);
         character[i]=character[i]<<1;
         character[i]=bitWrite(character[i],0,temp);
     }
}

void moveRight()
{
     temp=character[7];
     for(i=7;i>0;i--)                                   //右移一行
         character[i]=character[i-1];
     character[0]=temp;
}

void moveLeft()
{
     temp=character[0];
     for(i=0;i<7;i++)                                   //左移一行
         character[i]=character[i+1];
     character[7]=temp;
}