☛ 功能說明

使用電腦鍵盤輸入數位 0~9 並經由串列埠傳送至 Arduino UNO 開發板,控制 8×8 矩陣型 LED 顯示器 顯示如下圖數位 0~9。 上傳完畢后,開啟串列埠監控視窗,鍵盤輸入數位 0~9 即可顯示於8×8矩陣型LED顯示器上。

☛ 使用材料

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 顯示測試暫存器

byte i;                                                        //資料指標
const byte character[10][8]=                                   //R1~R8=MAX7219 (PABCDEFG)
      { { 0x00, 0x00, 0x7f, 0x41, 0x41, 0x7f, 0x00, 0x00 },    //數字 0
        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00 },    //數字 1
        { 0x00, 0x00, 0x79, 0x49, 0x49, 0x4f, 0x00, 0x00 },    //數字 2
        { 0x00, 0x00, 0x49, 0x49, 0x49, 0x7f, 0x00, 0x00 },    //數字 3
        { 0x00, 0x00, 0x0f, 0x08, 0x08, 0x7f, 0x00, 0x00 },    //數字 4
        { 0x00, 0x00, 0x4f, 0x49, 0x49, 0x79, 0x00, 0x00 },    //數字 5
        { 0x00, 0x00, 0x7f, 0x49, 0x49, 0x79, 0x00, 0x00 },    //數字 6
        { 0x00, 0x00, 0x01, 0x01, 0x01, 0x7f, 0x00, 0x00 },    //數字 7
        { 0x00, 0x00, 0x7f, 0x49, 0x49, 0x7f, 0x00, 0x00 },    //數字 8
        { 0x00, 0x00, 0x4f, 0x49, 0x49, 0x7f, 0x00, 0x00 } };  //數字 9

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++)                                          //顯示數字 0
         sendCommand(i+1,character[0][i]);
}

void loop()
{
     if(Serial.available())                                    //鍵盤輸入任意鍵?
     {
        int ch=Serial.read();                                  //讀取按鍵值
        if(ch>='0' && ch<='9')                                 //輸入數字 0~9?
        {
           for(i=0;i<8;i++)                                    //顯示數字
               sendCommand(i+1,character[ch-'0'][i]);
        }
     }
}

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

 

☛ 練習

⑴ 設計 Arduino 程式,使用使用電腦鍵盤控制 8×8 矩陣型 LED 顯示器閃爍顯示數位 0~9,顯示數位與鍵盤值相同。

#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 顯示測試暫存器

byte i;                                                        //資料指標
const byte character[10][8]=                                   //R1~R8=MAX7219 (PABCDEFG)
      { { 0x00, 0x00, 0x7f, 0x41, 0x41, 0x7f, 0x00, 0x00 },    //數字 0
        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00 },    //數字 1
        { 0x00, 0x00, 0x79, 0x49, 0x49, 0x4f, 0x00, 0x00 },    //數字 2
        { 0x00, 0x00, 0x49, 0x49, 0x49, 0x7f, 0x00, 0x00 },    //數字 3
        { 0x00, 0x00, 0x0f, 0x08, 0x08, 0x7f, 0x00, 0x00 },    //數字 4
        { 0x00, 0x00, 0x4f, 0x49, 0x49, 0x79, 0x00, 0x00 },    //數字 5
        { 0x00, 0x00, 0x7f, 0x49, 0x49, 0x79, 0x00, 0x00 },    //數字 6
        { 0x00, 0x00, 0x01, 0x01, 0x01, 0x7f, 0x00, 0x00 },    //數字 7
        { 0x00, 0x00, 0x7f, 0x49, 0x49, 0x7f, 0x00, 0x00 },    //數字 8
        { 0x00, 0x00, 0x4f, 0x49, 0x49, 0x7f, 0x00, 0x00 } };  //數字 9

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++)                                          //顯示數字 0
         sendCommand(i+1,character[0][i]);
}

void loop()
{
     if(Serial.available())                                    //鍵盤輸入任意鍵?
     {
        int ch=Serial.read();                                  //讀取按鍵值
        if(ch>='0' && ch<='9')                                 //輸入數字 0~9?
        {
           for(i=0;i<8;i++)                                    //顯示數字
               sendCommand(i+1,character[ch-'0'][i]);
        }
     }
     delay(200);                                               //延遲 200ms
     sendCommand(shutDown,0);                                  //MAX7219 不工作
     delay(200);                                               //延遲 200ms
     sendCommand(shutDown,1);                                  //MAX7219 正常工作
}

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

 

⑵ 設計 Arduino 程式,使用使用電腦鍵盤控制 8×8 矩陣型 LED 顯示器顯示數位,按下 F 鍵閃爍顯示數位,按 S 鍵則停止。

#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 顯示測試暫存器

byte i;                                                        //資料指標
const byte character[10][8]=                                   //R1~R8=MAX7219 (PABCDEFG)
      { { 0x00, 0x00, 0x7f, 0x41, 0x41, 0x7f, 0x00, 0x00 },    //數字 0
        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00 },    //數字 1
        { 0x00, 0x00, 0x79, 0x49, 0x49, 0x4f, 0x00, 0x00 },    //數字 2
        { 0x00, 0x00, 0x49, 0x49, 0x49, 0x7f, 0x00, 0x00 },    //數字 3
        { 0x00, 0x00, 0x0f, 0x08, 0x08, 0x7f, 0x00, 0x00 },    //數字 4
        { 0x00, 0x00, 0x4f, 0x49, 0x49, 0x79, 0x00, 0x00 },    //數字 5
        { 0x00, 0x00, 0x7f, 0x49, 0x49, 0x79, 0x00, 0x00 },    //數字 6
        { 0x00, 0x00, 0x01, 0x01, 0x01, 0x7f, 0x00, 0x00 },    //數字 7
        { 0x00, 0x00, 0x7f, 0x49, 0x49, 0x7f, 0x00, 0x00 },    //數字 8
        { 0x00, 0x00, 0x4f, 0x49, 0x49, 0x7f, 0x00, 0x00 } };  //數字 9

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++)                                          //顯示數字 0
         sendCommand(i+1,character[0][i]);
}

void loop()
{
     int ch;                                                   
     if(Serial.available())                                    //鍵盤輸入任意鍵?
     {
        ch=Serial.read();                                      //讀取按鍵值
        if(ch>='0' && ch<='9')                                 //輸入數字 0~9?
        {
           for(i=0;i<8;i++)                                    //顯示數字
               sendCommand(i+1,character[ch-'0'][i]);
        }
     }
     if(ch=='F' || ch=='f')                                    //閃爍顯示
     {
        delay(200);                                            //延遲 200ms
        sendCommand(shutDown,0);                               //MAX7219 不工作
        delay(200);                                            //延遲 200ms
        sendCommand(shutDown,1);                               //MAX7219 正常工作
     }
     if(ch=='S' || ch=='s')                                    //停止閃爍顯示
        sendCommand(shutDown,1);                               //MAX7219 正常工作
}

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