手っ取り早くマトリックスLEDを使う その2 [Arduino]
前回のスケッチだと、マトリックスLEDに何か表示することが目的となっており他の処理がしづらい状態でした。
表示自体は割り込みを使って、CPUを解放してみました。
交互に顔が変わります。
loop() 関数内は、Lチカみたいな感じかな?
表示自体は割り込みを使って、CPUを解放してみました。
// Arduino Pro Miniで手っ取り早くマトリックスLEDを使うスケッチ (Arduino Pro Mini専用)
// (SZ420788K: 8x8, 0.8inch, カソードコモン)
// timer2使用
const uint8_t MATRIX_ROW[] = { 2, 7, 17, 5, 10, 16, 11, 14 }; // 行 → デジタルピン番号
const uint8_t MATRIX_COL[] = { 9, 8, 4, 15, 3, 13, 12, 6 }; // 列 → デジタルピン番号 (左からMSB -> LSB)
uint8_t *MATRIX_IMAGE; // イメージのポインタ
uint8_t face_smile[] = { // にこにこ
B00111100,
B01000010,
B10100101,
B10000001,
B10100101,
B10011001,
B01000010,
B00111100 };
uint8_t face_angry[] = { // ぷんぷん
B00111100,
B01000010,
B10100101,
B10000001,
B10011001,
B10100101,
B01000010,
B00111100 };
void setup() {
for( int i = 2; i <= 17; i++ ) pinMode( i, OUTPUT );
TCCR2A = B00000000; // Timer2 (8bit) のオーバーフローで割り込む。ちらつきがない分周比は
TCCR2B = B00000010; // dot毎なら010(8分周まで),line毎なら101(128分周まで)くらい。
TIMSK2 = B00000001; // TOIE2 (オーバーフロー割り込み許可)
}
void loop() {
MATRIX_IMAGE = face_smile;
delay(1000);
MATRIX_IMAGE = face_angry;
delay(1000);
}
ISR( TIMER2_OVF_vect ) {
static uint8_t row, col;
digitalWrite( MATRIX_COL[ col ], LOW );
if( ++col == 8 ) {
col = 0;
digitalWrite( MATRIX_ROW[ row ], HIGH );
row = ( row + 1 ) % 8;
digitalWrite( MATRIX_ROW[ row ], LOW );
}
digitalWrite( MATRIX_COL[ col ], ( MATRIX_IMAGE[ row ] >> col ) & 1 );
}
交互に顔が変わります。
loop() 関数内は、Lチカみたいな感じかな?
2014-04-13 03:58
nice!(0)
コメント(0)
トラックバック(0)
コメント 0