MINO-o'-2016 15. FW(3)
テスト用ファーム、その3。
ボタンテスト。
#include<avr/io.h> #include<avr/interrupt.h> #include<avr/sleep.h> #include<avr/cpufunc.h> #include<stdint.h> #define LATCH595() do{\ PORTB &= ~(1<<0);\ _NOP();\ PORTB |= (1<<0);\ } while(0) #define SEND2SPI2(p,s) do{\ SPDR = (p);\ while(SPSR&0x80);\ SPDR = (s);\ } while(0) EMPTY_INTERRUPT( TIMER0_OVF_vect ); int main(){ uint8_t column = 0; uint8_t keyin; DDRB = 0x2e; // PB1,2,3,5=OUT PORTB = 0x00; // PB1, PB2=L DDRD = 0xfd; PORTD = 0xfc; PORTC = 0x1f; // PC[0:4] PullUP SPCR = 0x5c; SEND2SPI2(0x00,0xff); set_sleep_mode( SLEEP_MODE_IDLE ); sleep_enable(); TCCR0A = 0x00; TMSK0 = 0x01; TCNT0 = 0; TCCR0B = 0x05; sei(); for(;;){ keyin = PINC | 0xe0; switch( column ) { case 0: // COL.1 PORTD = 0xfc; LATCH595(); PORTD = 0xb4; // 7SEGA1 to LO, SCAN=100 PORTB = 0x00; // BOTH LED OFF SEND2SPI2(~keyin,0xff); break; case 4: // COL.10 PORTD = 0xfc; LATCH595(); PORTD = 0x78; // 7SEGA0 to LO, SCAN=1000 PORTB = 0x02; // LED#1 ON SEND2SPI2(0xff,~keyin); break; case 8: // COL.100 PORTD = 0xfc; LATCH595(); PORTD = 0xe4; // 7SEGA1 to LO, SCAN=1 PORTB = 0x04; // LED #2 ON SEND2SPI2(0xff,~keyin); break; case 12: // COL.1000 PORTD = 0xfc; LATCH595(); PORTD = 0xd8; // 7SEGA0 to LO, SCAN=10 PORTB = 0x06; // BOTH LED ON SEND2SPI2(~keyin,0xff); break; default: break; } sleep_cpu(); ++column; column &= 0x0f; } }
7セグのテストに読んだボタンをそのまま入れてるだけですね。チャタリングの対処は入ってません。連打になってしまっても困らないですからね。