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セグのテストに読んだボタンをそのまま入れてるだけですね。チャタリングの対処は入ってません。連打になってしまっても困らないですからね。