// 『昼夜逆転』工作室 http://jsdiy.web.fc2.com/ // ATtiny2313 // 7セグ4桁ボード // // アップダウンカウンタ // スイッチA0:カウントアップ A1:カウントダウン // // 2008/10/09 v1.00 初版 (UDCounterK.c) /* ポート対応 [ATtiny2313] bit 7 6 5 4 3 2 1 0 PORTA - - - - - - swL swR PORTB - - - DP 桁4 桁3 桁2 桁1 LEDボードでは左から桁1-桁4 PORTD - G F E D C B A 7セグのセグメント(下図) 7セグのセグメント図 +-A-+ F B +-G-+ E C +-D-+ DP */ #define F_CPU 1000000UL //1MHz #include #include const uint8_t SEGCHAR[] = { // 0b0GFEDCBA 0b00111111, //0 0b00000110, //1 0b01011011, //2 0b01001111, //3 0b01100110, //4 0b01101101, //5 0b01111101, //6 0b00100111, //7 0b01111111, //8 0b01101111, //9 0b00000000, //null 0b01000000 //- }; enum _SIDX { SIDX_NULL = 10, SIDX_MINUS }; int main(void) { uint8_t sidx[] = { 0, 0, 0, 0 }; uint8_t n, sw, psw, i; int16_t cnt, tmp; DDRD = 0b01111111; //7seg A-G = D0-D6 DDRB = 0b00011111; //7seg 桁(左から) = B0-B3, 7seg DP = B4 PORTA = 0b00000011; //スイッチが2個(右から) A0-A1 n = 0; cnt = 0; psw = sw = 0; while (1) { //スイッチ入力 sw = PINA; if (psw != sw) { if (~sw & 0b00000001) //up { if (cnt < 9999) cnt++; } if (~sw & 0b00000010) //down { if (-999 < cnt) cnt--; } psw = sw; _delay_ms(10); //チャタリング対策 } //現在のカウントを数字の配列(数字や記号のインデックスを格納する配列)に格納する if (0 <= cnt) { tmp = cnt; sidx[0] = tmp / 1000; tmp %= 1000; sidx[1] = tmp / 100; tmp %= 100; sidx[2] = tmp / 10; tmp %= 10; sidx[3] = tmp; //ゼロサプレス for (i = 0; i < 3 && sidx[i] == 0; i++) sidx[i] = SIDX_NULL; } else { tmp = -cnt; sidx[0] = SIDX_MINUS; sidx[1] = tmp / 100; tmp %= 100; sidx[2] = tmp / 10; tmp %= 10; sidx[3] = tmp; //ゼロサプレス for (i = 1; i < 3 && sidx[i] == 0; i++) sidx[i] = SIDX_NULL; } //表示 PORTB = 1 << n; PORTD = SEGCHAR[sidx[n]]; n = (n + 1) % 4; } return 0; }