2021年6月13日星期日

Arduino MXA 7219 8x8 點矩陣

 使用 Arduino NANO 控制MAX7219 控制 點矩陣LED

開發環境

  Arduino IDE

材料

1.      8x8點矩陣模組

2.      Arduino nano

3.      杜邦線


接線說明
   點矩陣模組  arduino NANO
         Vcc                5V
        GND             GND
        CLK              D13
        DIN               D11
        CS                 D10 

Max7219 站存器位址資料


設定解碼模式

設定亮度

設定掃描位數

開啟關閉顯示

 





開啟關閉顯示測試


點矩陣的控制方式

1. 這次實驗我是使用Nodecode模式,因為想要比較直覺控制要把暫存器要寫入的資料先設定好要設定的有這些。

2. 一些定義的變數先定義好,方便我們閱讀程式碼,放在void setup()之前

#define No_Op  0x00

#define Digit0 0x01

#define Digit1 0x02

#define Digit2 0x03

#define Digit3 0x04

#define Digit4 0x05

#define Digit5 0x06

#define Digit6 0x07

#define Digit7 0x08

 

#define DecodeMode  0x09

#define Intensity   0x0A

#define ScanLimit   0x0B

#define Shutdown    0x0C

#define DisplayTest 0x0F 

#define CS_pin      10

3. 這邊先寫一個函式方便我們快速寫入

 void MAX7219_write(byte address, byte data)

{

  digitalWrite(CS_pin, LOW);

  SPI.transfer(address);

  SPI.transfer(data);

  digitalWrite(CS_pin, HIGH);

}

4. Void setup()裡面要寫的是下面

void setup() {

  SPISettings(1000000, MSBFIRST, SPI_MODE0);

  SPI.begin();

  pinMode(CS_pin, OUTPUT);

  //解碼模式設定

  MAX7219_write(DecodeMode, 0x00);

  //亮度設定

  MAX7219_write(Intensity, 0x02);

  //顯示開啟ON

  MAX7219_write(Shutdown, 0x01);

  //關閉顯示測試

  MAX7219_write(DisplayTest, 0x00);

  //掃描顆數

  MAX7219_write(ScanLimit, 0x07);

}

5. 接下來要建立一個欲顯示的點陣圖,這邊用int 陣列存放,0,1(0:不亮  1:亮)

int show_num1[8][8] =

{ {0, 0, 0, 0, 1, 0, 0, 0},

  {0, 0, 0, 1, 1, 0, 0, 0},

  {0, 0, 1, 1, 1, 0, 0, 0},

  {0, 0, 0, 1, 1, 0, 0, 0},

  {0, 0, 0, 1, 1, 0, 0, 0},

  {0, 0, 0, 1, 1, 0, 0, 0},

  {0, 0, 0, 1, 1, 0, 0, 0},

  {0, 0, 1, 1, 1, 1, 0, 0}

};

6. 這裡要思考一下,我們要如何取得一個byte資料並且對應寫入該暫存器首先我們要分8行,個別把0,1的資料轉乘byte,因此我們寫一個轉換的函式,這邊是使使用陣列與指標,如果不懂的朋友可以查一下關鍵字二維陣列指標喔

byte booltoByte(int (*ShowArray_ptr)[8])

{

  byte data = 0x00;

  for (int i = 0; i < 8; i++)

    data = data << 1 | ShowArray_ptr[0][i];

  return data;

}

7. 完成後呢,但是它只針對一行的資料啊,那該怎麼辦?沒關係不用緊張,我們再做一個函式進行包裝,變成下面。

void draw(int (*ShowArray_ptr)[8])

{

  MAX7219_write(Digit0, booltoByte(&ShowArray_ptr[0])); //轉換陣列第一行的資料並寫入到digit0

  MAX7219_write(Digit1, booltoByte(&ShowArray_ptr[1])); //轉換陣列第一行的資料並寫入到digit1

  MAX7219_write(Digit2, booltoByte(&ShowArray_ptr[2])); //轉換陣列第一行的資料並寫入到digit2

  MAX7219_write(Digit3, booltoByte(&ShowArray_ptr[3])); //轉換陣列第一行的資料並寫入到digit3

  MAX7219_write(Digit4, booltoByte(&ShowArray_ptr[4])); //轉換陣列第一行的資料並寫入到digit4

  MAX7219_write(Digit5, booltoByte(&ShowArray_ptr[5])); //轉換陣列第一行的資料並寫入到digit5

  MAX7219_write(Digit6, booltoByte(&ShowArray_ptr[6])); //轉換陣列第一行的資料並寫入到digit6

  MAX7219_write(Digit7, booltoByte(&ShowArray_ptr[7])); //轉換陣列第一行的資料並寫入到digit7

}

8. 接下來做個清除顯示的函式

void clear()

{

  MAX7219_write(Digit0, 0x00);

  MAX7219_write(Digit1, 0x00);

  MAX7219_write(Digit2, 0x00);

  MAX7219_write(Digit3, 0x00);

  MAX7219_write(Digit4, 0x00);

  MAX7219_write(Digit5, 0x00);

  MAX7219_write(Digit6, 0x00);

  MAX7219_write(Digit7, 0x00);

}

9. 總算要到寫loop了啊,恭喜你快要成功了,這邊只要幾行而已

void loop() {

  clear();//清除畫面

  delay(500);

  draw(&show_num1[0]);//顯示數字1

  delay(2000);

}

來看效果啦






沒有留言:

發佈留言

打賞按讚