#include #include #include #define LED_ON(COL) PORTB &= ~_BV(COL) #define LED_OFF(COL) PORTB |= _BV(COL) #define RED 2 #define GREEN 1 #define BLUE 0 volatile char color = 1; volatile char mode = 0; volatile int count = 0; volatile char R = 64; // 初期カラーは春香さん volatile char G = 0; volatile char B = 0; // ピン変化割り込み ISR(PCINT0_vect) { _delay_us(100); // チャタリング対策 if(!(PINB & 0b00010000) && !(PINB & 0b0001000)) // ボタン両押し { mode++; if(mode > 2) { TCCR0B = 0b00000000; // Timer off mode = 0; } unsigned char i; for(i = 0; i<2; i++) { LED_OFF(RED); LED_OFF(GREEN); LED_OFF(BLUE); _delay_ms(10); _delay_ms(10); LED_ON(RED); LED_ON(GREEN); LED_ON(BLUE); _delay_ms(10); _delay_ms(10); } return; } // モード0:プリセット if(mode == 0) { if(!(PINB & 0b00010000)) color++; // ボタン上 else if(!(PINB & 0b00001000)) color--; // ボタン下 if(color >= 12) color = 1; if(color <= 0) color = 11; switch(color) { case 1: // 春香(レッド) R = 64; G = 0; B = 0; break; case 2: // 千早(ブルー) R = 0; G = 0; B = 64; break; case 3: // 雪歩(ホワイト) R = 64; G = 64; B = 60; break; case 4: // やよい(オレンジ) R = 60; G = 10; B = 0; break; case 5: // 律子(ノーマルグリーン) R = 0; G = 64; B = 0; break; case 6: // あずささん(パープル) R = 64; G = 0; B = 23; break; case 7: // 伊織(ピンク) R = 64; G = 24; B = 24; break; case 8: // 亜美真美(イエロー) R = 64; G = 64; B = 0; break; case 9: // 美希(フレッシュグリーン) R = 15; G = 64; B = 3; break; case 10: // 響(ライトブルー) R = 0; G = 64; B = 32; break; case 11: // 貴音(カーマイン) R = 64; G = 5; B = 3; break; default: break; } } // モード1:オートローテーション else if(mode == 1) { TCCR0B = 0b00000100; // Timer clk/256 } // モード2:なめらか調光 else { if(!(PINB & 0b00010000) || !(PINB & 0b0001000)) TCCR0B = 0b00000011; // Timer clk/64 else TCCR0B = 0b00000000; // Timer stop } } // タイマー割り込み ISR(TIM0_OVF_vect) { if(mode == 2) { if(!(PINB & 0b00010000)) count++; // ボタン上 else if(!(PINB & 0b00001000)) count--; // ボタン下 } else count++; if(count > 384) count = 0; else if(count < 0) count = 384; if(0 <= count && count < 64) { R = 64; G = count; B = 0; } else if(64 <= count && count < 128) { R = 128 - count; G = 64; B = 0; } else if(128 <= count && count < 192) { R = 0; G = 64; B = count - 128; } else if(192 <= count && count < 256) { R = 0; G = 256 - count; B = 64; } else if(256 <= count && count < 320) { R = count -256; G = 0; B = 64; } else if(320 <= count && count < 384) { R = 64; G = 0; B = 384 - count; } } // メイン int main() { // PORT初期設定 DDRB = 0b00000111; // 0,1,2:LED 3,4:ボタン PORTB = 0b00011111; // 0,1,2:初期High 3,4 内部プルアップ GIMSK = 0b00100000; // ピン変化割り込み許可 PCMSK = 0b00011000; // PORT3,4許可 TIMSK0 = 0b00000010; // Timer0オーバーフロー割り込み許可 sei(); // 割り込み許可 unsigned char cnt = 0; unsigned char PWM_R = 0; unsigned char PWM_G = 0; unsigned char PWM_B = 0; for(;;) { cnt = 64; PWM_R = R; PWM_G = G; PWM_B = B; if(PWM_R) LED_ON(RED); if(PWM_G) LED_ON(GREEN); if(PWM_B) LED_ON(BLUE); while(cnt--) { if(!(PWM_R--)) LED_OFF(RED); if(!(PWM_G--)) LED_OFF(GREEN); if(!(PWM_B--)) LED_OFF(BLUE); } } }