アノードコモンの8セグメントLEDへ表示する(その3)


アノードコモンの8セグメントLEDの完成版です。
3桁の数字を表示させす。
AからFまでの英字も表示できるようにしました。

123を表示
ABCを表示

ソースコードは以下の様になります。
delay(50)を有効にして、delayMicroseconds (100)をコメントアウトすると動きが良く分かります。(終わるまでに時間がかかりますが)

// 8segment anode led test
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <string.h>
#include <stdint.h>

#define Pins    8
#define P0      0
#define Digs    3
#define D0      10

static const uint8_t segmentDigits [] =
{
// a  b  c  d  e  f  g  p    Segments
// 0  1  2  3  4  5  6  7    wiringPi pin No.
   1, 1, 1, 1, 1, 1, 0, 0,    // 0
   0, 1, 1, 0, 0, 0, 0, 0,    // 1
   1, 1, 0, 1, 1, 0, 1, 0,    // 2
   1, 1, 1, 1, 0, 0, 1, 0,    // 3
   0, 1, 1, 0, 0, 1, 1, 0,    // 4
   1, 0, 1, 1, 0, 1, 1, 0,    // 5
   1, 0, 1, 1, 1, 1, 1, 0,    // 6
   1, 1, 1, 0, 0, 0, 0, 0,    // 7
   1, 1, 1, 1, 1, 1, 1, 0,    // 8
   1, 1, 1, 1, 0, 1, 1, 0,    // 9
   1, 1, 1, 0, 1, 1, 1, 0,    // A
   0, 0, 1, 1, 1, 1, 1, 0,    // b
   1, 0, 0, 1, 1, 1, 0, 0,    // C
   0, 1, 1, 1, 1, 0, 1, 0,    // d
   1, 0, 0, 1, 1, 1, 1, 0,    // E
   1, 0, 0, 0, 1, 1, 1, 0,    // F
   0, 0, 0, 0, 0, 0, 0, 0,    // blank
} ;
 

DisplayDigits (char* digits)
{
    int i;
    uint8_t digit, segment ;
    uint8_t index, d, segVal ;

    for (digit = 0 ; digit < Digs; ++digit) {
      digitalWrite (D0 + digit, 1) ;
      d = toupper (digits [digit]) ;
      if ((d >= '0') && (d <= '9'))           // Digit
      index = d - '0' ;
      else if ((d >= 'A') && (d <= 'F'))    // Hex
      index = d - 'A' + 10 ;
      else
      index = 16 ;                             // Blank
      for (segment = 0 ; segment < 8 ; ++segment) {
        segVal = segmentDigits [index * 8 + segment] ;
        digitalWrite (segment+P0, !segVal) ;
//delay(50)にすると動きが良く分かります
//        delay(50);
        delayMicroseconds (100) ;
        digitalWrite (segment+P0, 1) ;
      }
      digitalWrite (D0 + digit, 0) ;
    }
}

int main (void)
{
    int i;
    char digits [8] ;

    if(wiringPiSetup() == -1) return 1;
    for(i=0;i<Pins;i++) {
        pinMode(P0+i, OUTPUT);
        digitalWrite(P0+i, 0);
    }
    for(i=0;i<Digs;i++) {
        pinMode(D0+i, OUTPUT);
        digitalWrite(D0+i, 0);
    }

    strcpy(digits,"123");
    for(i=0;i<3000;i++) DisplayDigits(digits);

    strcpy(digits,"ABC");
    for(i=0;i<3000;i++) DisplayDigits(digits);

    for(i=0;i<Pins;i++) {
        digitalWrite(P0+i, 0);
    }
    for(i=0;i<Digs;i++) {
        digitalWrite(D0+i, 0);
    }
    exit;
}

アノードコモンの8セグメントLEDにも専用チップがいくつかあるようなので、そ れらを使ってRaspberry からの配線の数を減らしたいと考えています。