☛ 功能說明

使用Arduino開發板配合 MAX7219 晶片控制四位數共陰極七段顯示器,顯示電腦所輸入的0000~9999數位。

☛ 使用材料

Arduino UNO R3 開發板 × 1、電阻 10KΩ × 1、電容 0.1μF 及 10μF × 1、共陰極七段顯示器 5461AS × 1。

☛ 電路圖及麵包板接線圖

☛ 程式碼

#include<SPI.h>                              //使用 SPI 函數庫
const int slaveSelect=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 顯示測試暫存器
unsigned long number=0;                      //最大數值為 9999×10+9999

void setup()
{
     SPI.begin();                            //初始化 SPI 介面
     Serial.begin(9600);                     //初始化串列埠,鮑率為 9600bps
     pinMode(slaveSelect,OUTPUT);            //設定數位接腳 10 為輸出模式
     digitalWrite(slaveSelect,LOW);          //除能 MAX7219
     sendCommand(shutDown,1);                //MAX7219 正常工作
     sendCommand(dispTest,0);                //關閉顯示器測試
     sendCommand(intensity,1);               //中等顯示亮度
     sendCommand(scanLimit,7);               //掃描 8 位數
     sendCommand(decodeMode,255);            //使用 MAX7219 內部解碼器
     for(int i=1;i<=8;i++)                   //四位七段顯示器顯示 0000
         sendCommand(i,0);
}

void loop()
{
     if(Serial.available())                  //電腦鍵盤輸入任意鍵?
     {
        char ch=Serial.read();               //讀取按鍵值
        if(ch>='0' && ch<='9')               //鍵值為 0~9
        {
           number=number*10+ch-'0';          //計算並儲存數值
           number=number%10000;              //截取最後四位數
           displayNumber(number);            //顯示所輸入的數值
        }
     }
}

void displayNumber(int number)               //顯示函式
{
     sendCommand(1,number/100/10);           //顯示千位數
     sendCommand(2,number/100%10);           //顯示百位數
     sendCommand(3,number%100/10);           //顯示十位數
     sendCommand(4,number%100%10);           //顯示個位數
}

void sendCommand(byte command,byte value)    //MAX7219 設定命令函式
{
     digitalWrite(slaveSelect,LOW);          //致能 MAX7219
     SPI.transfer(command);                  //寫入命令字元
     SPI.transfer(value);                    //寫入資料字元
     digitalWrite(slaveSelect,HIGH);         //除能 MAX7219
}

 

☛ 練習

⑴ 設計 Arduino 程式,使用 MAX7219 晶片控制四位數共陰極七段顯示器,閃爍顯示所輸入的數位 0000~9999。

#include<SPI.h>                              //使用 SPI 函數庫
const int slaveSelect=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 顯示測試暫存器
unsigned long number=0;                      //最大數值為 9999×10+9999

void setup()
{
     SPI.begin();                            //初始化 SPI 介面
     Serial.begin(9600);                     //初始化串列埠,鮑率為 9600bps
     pinMode(slaveSelect,OUTPUT);            //設定數位接腳 10 為輸出模式
     digitalWrite(slaveSelect,LOW);          //除能 MAX7219
     sendCommand(shutDown,1);                //MAX7219 正常工作
     sendCommand(dispTest,0);                //關閉顯示器測試
     sendCommand(intensity,1);               //中等顯示亮度
     sendCommand(scanLimit,7);               //掃描 8 位數
     sendCommand(decodeMode,255);            //使用 MAX7219 內部解碼器
     for(int i=1;i<=8;i++)                   //四位七段顯示器顯示 0000
         sendCommand(i,0);
}

void loop()
{
     if(Serial.available())                  //電腦鍵盤輸入任意鍵?
     {
        char ch=Serial.read();               //讀取按鍵值
        if(ch>='0' && ch<='9')               //鍵值為 0~9
        {
           number=number*10+ch-'0';          //計算並儲存數值
           number=number%10000;              //截取最後四位數
        }
     }
     for(int i=0;i<2;i++)                    //閃爍顯示數字
     {
         sendCommand(intensity,0);           //低等顯示亮度
         displayNumber(number);              //顯示所輸入的數值
         delay(200);                         //延遲 200ms
         sendCommand(intensity,1);           //中度等顯示亮度
         displayNumber(number);              //顯示所輸入的數值
         delay(200);                         //延遲 200ms
     }
}

void displayNumber(int number)               //顯示函式
{
     sendCommand(1,number/100/10);           //顯示千位數
     sendCommand(2,number/100%10);           //顯示百位數
     sendCommand(3,number%100/10);           //顯示十位數
     sendCommand(4,number%100%10);           //顯示個位數
}

void sendCommand(byte command,byte value)    //MAX7219 設定命令函式
{
     digitalWrite(slaveSelect,LOW);          //致能 MAX7219
     SPI.transfer(command);                  //寫入命令字元
     SPI.transfer(value);                    //寫入資料字元
     digitalWrite(slaveSelect,HIGH);         //除能 MAX7219
}

 

⑵ 設計 Arduino 程式,使用 MAX7219 晶片控制四位數共陰極七段顯示器,闪烁顯示電腦所輸入的 0000~9999 數字。 當輸入 + 鍵時,顯示值開始上數,每秒加 1 至 9999 停止;當輸入 – 鍵時,顯示值開始下數,每秒減 1 至 0000 停止;按下任意鍵可以停止計數狀態。

#include<SPI.h>                              //使用 SPI 函數庫
const int slaveSelect=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 顯示測試暫存器
unsigned long number=0;                      //最大數值為 9999×10+9999
char ch;                                     //按鍵鍵值

void setup()
{
     SPI.begin();                            //初始化 SPI 介面
     Serial.begin(9600);                     //初始化串列埠,鮑率為 9600bps
     pinMode(slaveSelect,OUTPUT);            //設定數位接腳 10 為輸出模式
     digitalWrite(slaveSelect,LOW);          //除能 MAX7219
     sendCommand(shutDown,1);                //MAX7219 正常工作
     sendCommand(dispTest,0);                //關閉顯示器測試
     sendCommand(intensity,1);               //中等顯示亮度
     sendCommand(scanLimit,7);               //掃描 8 位數
     sendCommand(decodeMode,255);            //使用 MAX7219 內部解碼器
     for(int i=1;i<=8;i++)                   //四位七段顯示器顯示 0000
         sendCommand(i,0);
}

void loop()
{
     if(Serial.available())                  //電腦鍵盤輸入任意鍵?
        ch=Serial.read();                    //讀取按鍵值
     switch(ch)
     {
             case '0':                       //讀取數值 0~9
             case '1':
             case '2':
             case '3':
             case '4':
             case '5':
             case '6':
             case '7':
             case '8':
             case '9':
                   number=number*10+ch-'0';  //計算並儲存數值
                   number=number%10000;      //截取最後四位數
                   break;
             case '+':                       //鍵值為 +
                   if(number<9999)
                      number++;
                   else
                      number=9999;
                   break;
             case '-':                       //鍵值為 -
                   if(number>0)
                      number--;
                   else
                      number=0;
                   break;          
             default :                       //鍵值為其他任意鍵
                   number=number;
                   break;
     }
     flushDisplay(number);                   //閃爍顯示所輸入的數值
     if(ch=='+' || ch=='-')                  //鍵值為 + 或 -
        ch=ch;                               //保持鍵值
     else
        ch=' ';                              //鍵值為空白鍵
}

void flushDisplay(int number)                //閃爍顯示副程式
{
     for(int i=0;i<2;i++)
     {
         sendCommand(intensity,0);           //低等顯示亮度
         displayNumber(number);              //顯示所輸入的數值
         delay(250);                         //延遲 250ms
         sendCommand(intensity,1);           //中度等顯示亮度
         displayNumber(number);              //顯示所輸入的數值
         delay(250);                         //延遲 250ms
     }
}

void displayNumber(int number)               //顯示函式
{
     sendCommand(1,number/100/10);           //顯示千位數
     sendCommand(2,number/100%10);           //顯示百位數
     sendCommand(3,number%100/10);           //顯示十位數
     sendCommand(4,number%100%10);           //顯示個位數
}

void sendCommand(byte command,byte value)    //MAX7219 設定命令函式
{
     digitalWrite(slaveSelect,LOW);          //致能 MAX7219
     SPI.transfer(command);                  //寫入命令字元
     SPI.transfer(value);                    //寫入資料字元
     digitalWrite(slaveSelect,HIGH);         //除能 MAX7219
}