BASIC4MCU | 센서 | 적외선리모콘 | [프로젝트 1] 삼보 컴퓨터 리모콘으로 LED 제어하기 (5)| - [펌]
페이지 정보
작성자 키트 작성일2017-08-29 17:02 조회2,186회 댓글0건본문
[프로젝트 1] 삼보 컴퓨터 리모콘으로 LED 제어하기 (5) ┗ AVR 프로젝트
1997년에 구입한 삼보컴퓨터(펜티엄 166) 에 있던 리모콘의 키 입력 값을 아래와 같이 알아 보았습니다.
순서대로 전원, 인터넷, TV, CD, 채널 +, 채널 -, 음량 +, 음량 -, 음소거, Enter, 열림/닫힘, 플래이(>), 앞으로(>>), 정지([]) 뒤로(<<) 입니다. D6121 타입이고, 커스텀코드는 06F9 이네요.
아래 프로그램은 버튼 입력값을 반전해서 포트 B 에 연결되어 있는 LED 에 출력하는 프로그램입니다.
#include
#include
#includetypedef unsigned int byte;
#define IR_READY 0
#define IR_START 1
#define IR_DATA_IN 2
#define IR_DATA_END 3
#define LF 0x0a
#define CR 0x0d
byte IR_recv[4] = {0x00, 0x00, 0x00, 0x00};
byte IR_STATE = 0;
byte IR_TIMER_CNT = 0;
byte IR_recv_CNT = 0;
byte IR_BIT_CNT = 0;
SIGNAL(SIG_OVERFLOW0) /* signal handler for tcnt0 overflow interrupt */
{
IR_TIMER_CNT++;
TCNT0 = 0x76;
}
SIGNAL(SIG_INTERRUPT0) /* signal handler for external interrupt int0 */
{
cli(); //__disable_interrupt();switch(IR_STATE)
{
case IR_READY :
IR_STATE = IR_START;
IR_BIT_CNT = 0;
IR_recv_CNT = 0;
break;case IR_START :
if(IR_TIMER_CNT > 85 && IR_TIMER_CNT < 92)
{
IR_STATE = IR_DATA_IN;
}
else if(IR_TIMER_CNT > 128 && IR_TIMER_CNT < 135)
{
IR_STATE = IR_DATA_IN;
}
else
{
IR_STATE = IR_START;
}
break;case IR_DATA_IN :
IR_recv_CNT = IR_BIT_CNT / 8;if(IR_TIMER_CNT < 9 || IR_TIMER_CNT > 25)
{
IR_STATE = IR_READY;
break;
}if(IR_TIMER_CNT > 20 && IR_TIMER_CNT < 25)
{
switch(IR_BIT_CNT % 8)
{
case 0 : IR_recv[IR_recv_CNT] |= 0X01; break;
case 1 : IR_recv[IR_recv_CNT] |= 0X02; break;
case 2 : IR_recv[IR_recv_CNT] |= 0X04; break;
case 3 : IR_recv[IR_recv_CNT] |= 0X08; break;
case 4 : IR_recv[IR_recv_CNT] |= 0X10; break;
case 5 : IR_recv[IR_recv_CNT] |= 0X20; break;
case 6 : IR_recv[IR_recv_CNT] |= 0X40; break;
case 7 : IR_recv[IR_recv_CNT] |= 0X80; break;
}
}
else
{
if(IR_TIMER_CNT > 9 && IR_TIMER_CNT < 13)
{
switch(IR_BIT_CNT % 8)
{
case 0 : IR_recv[IR_recv_CNT] &= ~0x01; break;
case 1 : IR_recv[IR_recv_CNT] &= ~0x02; break;
case 2 : IR_recv[IR_recv_CNT] &= ~0x04; break;
case 3 : IR_recv[IR_recv_CNT] &= ~0x08; break;
case 4 : IR_recv[IR_recv_CNT] &= ~0x10; break;
case 5 : IR_recv[IR_recv_CNT] &= ~0x20; break;
case 6 : IR_recv[IR_recv_CNT] &= ~0x40; break;
case 7 : IR_recv[IR_recv_CNT] &= ~0x80; break;
}
}
}IR_BIT_CNT++;
if(IR_BIT_CNT == 32)
{
IR_BIT_CNT = 0;
PORTB = ~IR_recv[2];
}
break;default:
break;
}
IR_TIMER_CNT = 0;
sei(); // enable_interrupt();
}int main(void)
{
MCUCR = 0x02;
DDRB = 0xff;
GICR = 0x40;
PORTD = 0x04; // int0 pull up
TIMSK = (1< TCNT0 = 0x76;
TCCR0 = 2;);
DDRB = 0xff;
PORTB = 0xff;
sei(); // enable_interrupt();
while(1);
}
댓글 0
조회수 2,186등록된 댓글이 없습니다.