JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

PIC16F1827 MAX7219 8×7セグメントLED表示テスト その2

2023-05-24 11:24:22 | PIC16F1827
 前の記事の続きです。
 PIC16F1827でMAX7219使用の8×7セグメントLEDに数値を表示するテストをします。

 一般に良く利用されるLCD表示器LCD1602などの場合、キャラクタコードを送るだけでよいのですが、MAX7219の場合は、Digit番号と数値を送る必要があります。そこで、PIC内の数値(バイナリ)を10進数に変換しなければなりません。

 以前、ArduinoでMAX7219のテストをしたときには、数値を文字列に変換し、LEDに表示するために、アスキーコードを数値に変換しました。その記事はこちら

  今回は、簡単なアルゴリズムで数値(バイナリ)から表示用のデータを取り出すことにしました。10のn乗で割って、商と剰余を計算し、その都度、商を表示する方法です。
 例えば数値 n=12345678とした場合、表示器の桁数が8桁ですので、除数josu=10000000で割ります。商は sho=12345678 / 10000000 = 1 です。このshoの値をDigit8にセットすればいいわけです。この時、余り(剰余)は、joyo=12345678 % 10000000 = 2345678となります。
 このjoyoをnとして、次は除数を1/10にして、josu=1000000として、同じ計算をして、Digit7にセットします。以下この繰り返しになります。
 このままだと小さい数値の場合に上位に「0」が表示されてしまいますので、ゼロ消しをします。最初にゼロフラッグzflagを立てておいて、最初の数値がゼロでなくなったときにゼロフラッグを下ろします。ゼロフラッグが立っている時には「0」ではなく、「空白」を表示するようにします。

 これをプログラムにすると次のようになります。
-------------------------------------------------------
//数値を表示する
void Num_Display(uint32_t n){
     uint32_t josu = 10000000;
     uint8_t sho;
     uint32_t joyo;
     uint8_t i=8;
     uint8_t zflag = 1;
     while(i){
         sho = n / josu;
         joyo = n % josu;
         if(zflag==1 && sho==0){
             sho = 0x0f; //空白
         }
         else{
             zflag = 0;
         }
          maxTransfer(i,sho);
         n = joyo;
         josu = josu / 10;
         i--;
    }
}
-------------------------------------------------------

 mainルーチンに
uint32_t k = 0;
     while(1){
         Num_Display(k);
         k++;
         __delay_ms(100);
    }
を書き込んで、0.1秒ごとに数値をカウントアップさせてみました。
その時の様子です。ゼロ消しがされた数値が表示され、カウントアップされました。


 もっとうまい方法があると思うのですが、とりあえず表示されました。

最新の画像もっと見る

コメントを投稿