기본적으로 하위비트에서 상위비트로 LED가 shift되는 실험이다. 만약 인터럽트가 발생하면 반대방향으로 작동된다. 책의 예제에서는 한 주기를 마친다음에 적용되었었는데, 바로바로 방향이 바뀌도록 수정한 코드이다.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
typedef unsigned char byte;
volatile byte state = 0;
ISR(INT0_vect)
{
state = !state;
}
int main(void)
{
byte count = 0xfe;
EICRA = 0x02; /* 하강앳지 인터럽트 */
EIMSK = 0x01; /* int0 사용 */
DDRD = 0x00;
SREG = 0x80; /* sei */
DDRB = 0xff;
while(1)
{
if (state)
{
count = count << 1;
count |= 0x01;
if (count == 0xff)
{
count = 0xfe;
}
}
else
{
count = count >> 1;
count |= 0x80;
if (count == 0xff)
{
count = 0x7f;
}
}
PORTB = count;
_delay_ms(200);
}
return 0;
}