LoginSignup
1
0

More than 1 year has passed since last update.

MAX7219を使った8桁7セグメントLEDディスプレイを制御|その2

Last updated at Posted at 2021-12-12

この記事は前回の続編みたいなものです。まだ見てない方ははじめにこちらを見ていただいた方が分かりやすいかもしれません。

では本編へ、この記事では僕が作った関数をまとめています。ちょっと複雑なコトをしたいときに使ってるので使えそうなのがあれば使ってみてください

Err. を表示する

処理中に異常が発生したときなどに使えます

void Display_Err(){
  LED_OUT(0x9, 0x00);
  LED_OUT(0x1, 0b10000101);  //r.:
  LED_OUT(0x2, 0b00000101);  //r:
  LED_OUT(0x3, 0b01001111);  //E:
  LED_OUT(0x4, 0b00000000);
  LED_OUT(0x5, 0b00000000);
  LED_OUT(0x6, 0b00000000);
  LED_OUT(0x7, 0b00000000);
  LED_OUT(0x8, 0b00000000);
}

「なにもない」を表示する

表示をクリアしたいときに使ってます

void Display_null(){
  LED_OUT(0x9, 0x00);
  LED_OUT(0x1, 0b00000000);
  LED_OUT(0x2, 0b00000000);
  LED_OUT(0x3, 0b00000000);
  LED_OUT(0x4, 0b00000000);
  LED_OUT(0x5, 0b00000000);
  LED_OUT(0x6, 0b00000000);
  LED_OUT(0x7, 0b00000000);
  LED_OUT(0x8, 0b00000000);
}

すべてのビットを0にするだけです

すべて光らせる

あまり使いませんが一応。演出には使えるんじゃないですかね

void Display_full(){
  LED_OUT(0x9, 0x00);
  LED_OUT(0x1, 0b11111111);
  LED_OUT(0x2, 0b11111111);
  LED_OUT(0x3, 0b11111111);
  LED_OUT(0x4, 0b11111111);
  LED_OUT(0x5, 0b11111111);
  LED_OUT(0x6, 0b11111111);
  LED_OUT(0x7, 0b11111111);
  LED_OUT(0x8, 0b11111111);
}

on.を表示

void Display_on(){
  LED_OUT(0x9, 0x00);
  LED_OUT(0x1, 0b10010101);  //n.:
  LED_OUT(0x2, 0b00011101);  //o:
  LED_OUT(0x3, 0b00000000);
  LED_OUT(0x4, 0b00000000);
  LED_OUT(0x5, 0b00000000);
  LED_OUT(0x6, 0b00000000);
  LED_OUT(0x7, 0b00000000);
  LED_OUT(0x8, 0b00000000);
}

off.を表示

void Display_off(){
  LED_OUT(0x9, 0x00);
  LED_OUT(0x1, 0b11000111);  //f.:
  LED_OUT(0x2, 0b01000111);  //f:
  LED_OUT(0x3, 0b00011101);  //o
  LED_OUT(0x4, 0b00000000);
  LED_OUT(0x5, 0b00000000);
  LED_OUT(0x6, 0b00000000);
  LED_OUT(0x7, 0b00000000);
  LED_OUT(0x8, 0b00000000);
}

ナンバーデコーダ

ICに実装されてはいますが僕はソフトウェア的に実装しています。その方が僕にとっては都合がいいので
対応範囲はo-9です。拡張すればA-Fにも対応させれます
ちなみに表示できる範囲を超えた数値を指定した場合-を表示するようにしています

void Display_Number_Decode(byte digit, byte number){
  switch(number){
    case 0:
      LED_OUT(digit, 0b01111110);
      break;
    case 1:
      LED_OUT(digit, 0b00110000);
      break;
    case 2:
      LED_OUT(digit, 0b01101101);
      break;
    case 3:
      LED_OUT(digit, 0b01111001);
      break;
    case 4:
      LED_OUT(digit, 0b00110011);
      break;
    case 5:
      LED_OUT(digit, 0b01011011);
      break;
    case 6:
      LED_OUT(digit, 0b01011111);
      break;
    case 7:
      LED_OUT(digit, 0b01110010);
      break;
    case 8:
      LED_OUT(digit, 0b01111111);
      break;
    case 9:
      LED_OUT(digit, 0b01111011);
      break;
    default:
      LED_OUT(digit, 0b00000001);
  }
}

ナンバーデコーダ(16進対応版)

2021-12-15追記
上のデコーダの16進版です。

void Display_Number_Hex(byte digit, byte number){
  switch(number){
    case 0:
      LED_OUT(digit, 0b01111110);
      break;
    case 1:
      LED_OUT(digit, 0b00110000);
      break;
    case 2:
      LED_OUT(digit, 0b01101101);
      break;
    case 3:
      LED_OUT(digit, 0b01111001);
      break;
    case 4:
      LED_OUT(digit, 0b00110011);
      break;
    case 5:
      LED_OUT(digit, 0b01011011);
      break;
    case 6:
      LED_OUT(digit, 0b01011111);
      break;
    case 7:
      LED_OUT(digit, 0b01110010);
      break;
    case 8:
      LED_OUT(digit, 0b01111111);
      break;
    case 9:
      LED_OUT(digit, 0b01111011);
      break;
    case 10:
      LED_OUT(digit, 0b01110111);
      break;
    case 11:
      LED_OUT(digit, 0b00011111);
      break;
    case 12:
      LED_OUT(digit, 0b00001101);
      break;
    case 13:
      LED_OUT(digit, 0b00111100);
      break;
    case 14:
      LED_OUT(digit, 0b01001111);
      break;
    case 15:
      LED_OUT(digit, 0b01000111);
      break;
    default:
      LED_OUT(digit, 0b00000001);
  }
}

数字を表示する

対応範囲は-9999999から99999999です。この範囲を超えた場合「Err.」が表示されます。ここでは省きますが使用する際は忘れないでくださいね
また上記のデコーダを使用していますのでそれも忘れずに追記しておいてください。ここでは省きます

void Display_Number(long a){
  byte Digit8 = 0;
  byte Digit7 = 0;
  byte Digit6 = 0;
  byte Digit5 = 0;
  byte Digit4 = 0;
  byte Digit3 = 0;
  byte Digit2 = 0;
  byte Digit1 = 0;
  long b = abs(a);
  Display_null();
  if(a > 99999999 || a < -9999999){  //例外処理:
   Display_Err();
  }else{
    if(a >= 10000000){        //8ケタ目の処理:
      Digit8 = floor(b / 10000000);
      Display_Number_Decode(8, Digit8);
      b = b - (Digit8 * 10000000);
    }else if(a <= -1000000 && a >= -9999999){  
      Display_Number_Decode(8, 10);
    }
    if(abs(a) >= 1000000){    //7ケタ目の処理:
      Digit7 = floor(b / 1000000);
      Display_Number_Decode(7, Digit7);
      b = b - (Digit7 * 1000000);
    }else if(a <= -100000 && a >= -999999){  
      Display_Number_Decode(7, 10);
    }
    if(abs(a) >= 100000){     //6ケタ目の処理:
      Digit6 = floor(b / 100000);
      Display_Number_Decode(6, Digit6);
      b = b - (Digit6 * 100000);
    }else if(a <= -10000 && a >= -99999){  
      Display_Number_Decode(6, 10);
     }
   if(abs(a) >= 10000){      //5ケタ目の処理:
      Digit5 = floor(b / 10000);
      Display_Number_Decode(5, Digit5);
      b = b - (Digit5 * (long)10000);
    }else if(a <= -1000 && a >= -9999){  
      Display_Number_Decode(5, 10);
    }
    if(abs(a) >= 1000){       //4ケタ目の処理:
      Digit4 = floor(b / 1000);
      Display_Number_Decode(4, Digit4);
      b = b - (Digit4 * 1000);
    }else if(a <= -100 && a >= -999){  
      Display_Number_Decode(4, 10);
    }
    if(abs(a) >= 100){        //3ケタ目の処理:
      Digit3 = floor(b / 100);
      Display_Number_Decode(3, Digit3);
      b = b - (Digit3 * 100);
    }else if(a <= -10 && a >= -99){  
      Display_Number_Decode(3, 10);
    }
    if(abs(a) >= 10){         //2ケタ目の処理:
      Digit2 = floor(b / 10);
      Display_Number_Decode(2, Digit2);
      b = b - (Digit2 * 10);
    }else if(a <= -1 && a >= -9){  
      Display_Number_Decode(2, 10);
    }
    if(abs(a) >= 0){          //1ケタ目の処理:
      Digit1 = b;
      Display_Number_Decode(1, Digit1);
    }
  }
}

ぐるぐる

かなり非効率なことをしています。挙動は実際に実行してみてください
第一引数はループさせたい回数、第二引数はDelayです

void LED_LOOP(int a, int b){
  LED_OUT(0x9, 0x00);
  LED_OUT(0x1, 0b00000000);
  LED_OUT(0x2, 0b00000000);
  LED_OUT(0x3, 0b00000000);
  LED_OUT(0x4, 0b00000000);
  LED_OUT(0x5, 0b00000000);
  LED_OUT(0x6, 0b00000000);
  LED_OUT(0x7, 0b00000000);
  LED_OUT(0x8, 0b00000000);
  for(int i=0; i<a; i++){
    LED_OUT(0x1, 0b01000000);
    delay(b);
    LED_OUT(0x1, 0b00000000);
    LED_OUT(0x2, 0b01000000);
    delay(b);
    LED_OUT(0x2, 0b00000000);
    LED_OUT(0x3, 0b01000000);
    delay(b);
    LED_OUT(0x3, 0b00000000);
    LED_OUT(0x4, 0b01000000);
    delay(b);
    LED_OUT(0x4, 0b00000000);
    LED_OUT(0x5, 0b01000000);
    delay(b);
    LED_OUT(0x5, 0b00000000);
    LED_OUT(0x6, 0b01000000);
    delay(b);
    LED_OUT(0x6, 0b00000000);
    LED_OUT(0x7, 0b01000000);
    delay(b);
    LED_OUT(0x7, 0b00000000);
    LED_OUT(0x8, 0b01000000);
    delay(b);
    LED_OUT(0x8, 0b00000000);
    LED_OUT(0x8, 0b00000010);
    delay(b);
    LED_OUT(0x8, 0b00000000);
    LED_OUT(0x8, 0b00000100);
    delay(b);
    LED_OUT(0x8, 0b00000000);
    LED_OUT(0x8, 0b00001000);
    delay(b);
    LED_OUT(0x8, 0b00000000);
    LED_OUT(0x7, 0b00001000);
    delay(b);
    LED_OUT(0x7, 0b00000000);
    LED_OUT(0x6, 0b00001000);
    delay(b);
    LED_OUT(0x6, 0b00000000);
    LED_OUT(0x5, 0b00001000);
    delay(b);
    LED_OUT(0x5, 0b00000000);
    LED_OUT(0x4, 0b00001000);
    delay(b);
    LED_OUT(0x4, 0b00000000);
    LED_OUT(0x3, 0b00001000);
    delay(b);
    LED_OUT(0x3, 0b00000000);
    LED_OUT(0x2, 0b00001000);
    delay(b);
    LED_OUT(0x2, 0b00000000);
    LED_OUT(0x1, 0b00001000);
    delay(b);
    LED_OUT(0x1, 0b00000000);
    LED_OUT(0x1, 0b00010000);
    delay(b);
    LED_OUT(0x1, 0b00000000);
    LED_OUT(0x1, 0b00100000);
    delay(b);
    LED_OUT(0x1, 0b00000000);
  }
}

増えたり機能拡張をしたりしたら追記していきます

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0