SSブログ

16x8マトリックスLED 第二弾 その2 [Arduino]

ATtiny2313でシリアル入力をして、それをマトリックスLEDに表示していくスケッチです。
よく分からないながらも、いろんなサイトを参考にして、何とか形になりました。

new_matrix_on.jpg

こんな感じでワイヤーを4本つなぎ、シリアル入力選択用のジャンパを外しておきます。
そしてATtiny2313 (Int. 8MHz) に、次のスケッチを書き込みます。

// 電光掲示板(シリアル受信, ATtiny2313):シリアルでデータを受信し、受信されるごとにスライドしていく
#define  BAUD  9600    // ボーレート
  // ATtiny2313 のピンとマトリックスLEDの対応配列(ポート PD0 なら 0xD0 ということにした)
const byte pin_matrixCol[8] = { 0xB4, 0xA1, 0xA0, 0xB1, 0xD3, 0xB2, 0xB6, 0xB7};  // Matrxの列のポート
const byte pin_matrixRow[8] = { 0xB0, 0xB5, 0xD5, 0xB3, 0xD6, 0xD4, 0xD1, 0xD2};  // Matrxの行のポート
byte matrixImage[16];     // イメージの配列
byte matrixIndex = 0;     // イメージの表示開始位置 

void setup() {
  UBRRH = (F_CPU / 16 / BAUD - 1) >> 8;
  UBRRL = (F_CPU / 16 / BAUD - 1);
  UCSRB = (1 << RXEN) | (0 << TXEN) | (1 << RXCIE);    // 受信許可,送信不可,割り込み許可
  UCSRC = (0 << USBS) | (3 << UCSZ0);                  // stopbit 1bit , 8bit送信
  sei();
}

void loop() {
  byte x, y;
  for( x = 0; x < 8; x++ ) {
    for( y = 0; y < 8; y++ ) {
      if ( matrixImage[ ( x     + matrixIndex ) % 16 ] & (1 << y) ) setPixelTn2313( pin_matrixCol[x], pin_matrixRow[y]);
      else setMatrixAllOffTn2313();
      if ( matrixImage[ ( x + 8 + matrixIndex ) % 16 ] & (1 << y) ) setPixelTn2313( pin_matrixRow[y], pin_matrixCol[x]);
      else setMatrixAllOffTn2313();
    }
  }
}

ISR(USART_RX_vect) {     // 割り込みによる受信
  matrixImage[matrixIndex++] = UDR;
  matrixIndex %= 16;
}

void setMatrixAllOffTn2313() {    // Tiny2313をすべて入力に(ハイ・インピーダンスに)
  DDRA = B00000000;  PORTA  = B00000000;
  DDRB = B00000000;  PORTB  = B00000000;
  DDRD = B00000000;  PORTD &= B00000001;  // PD0 は RXD (シリアル受信用なので触らず)
}

void setPixelTn2313(byte pin_H, byte pin_L) {
  setMatrixAllOffTn2313();
  switch (pin_H & 0xF0) {
    case 0xA0: DDRA  = 1 << (pin_H & 0x0F);  PORTA  = 1 << (pin_H & 0x0F);  break;
    case 0xB0: DDRB  = 1 << (pin_H & 0x0F);  PORTB  = 1 << (pin_H & 0x0F);  break;
    case 0xD0: DDRD  = 1 << (pin_H & 0x0F);  PORTD |= 1 << (pin_H & 0x0F);  break;
  }
  switch (pin_L & 0xF0) {
    case 0xA0: DDRA |= 1 << (pin_L & 0x0F);  break;
    case 0xB0: DDRB |= 1 << (pin_L & 0x0F);  break;
    case 0xD0: DDRD |= 1 << (pin_L & 0x0F);  break;
  }  
}

ATtiny2313 に書き込みが終わったら、ワイヤーをはずして、ジャンパーピンをArduinoの0番ピンからの入力にします(FT232RLからのデータを直接受け取る)。

そしたら、シリアルモニターでボーレートを合わせ(とりあえず9600にしてみた)、なにか適当に入力するとその文字が2進数表記で表示されるようになりました。

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。