1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | 까까 | 판매 납포인트 | 무료 | 평점 | 1.0점 / 총 1명 참여 |
---|
작동완전 잘됨...테스트 버젼이라서 쏘스가 엉망..ㅋ
동작 동영상 링크 : http://blog.naver.com/ka2great/70050335483
Chip type : ATmega128
Clock frequency : 16.000000 MHz
Memory model : Small
오실로 스코프로 찍어본 리모콘 파형 분석 코드 :
리모콘 코드 테이블 | ||||
custom | custom2 | data | data2 | |
select1 | C1 | A2 | 30 | CF |
select2 | C1 | A2 | B0 | 4F |
select3 | C1 | A2 | 70 | 8F |
select4 | C1 | A2 | F0 | 0F |
1 | C1 | A2 | 48 | B7 |
2 | C1 | A2 | C8 | 37 |
3 | C1 | A2 | 28 | D7 |
4 | C1 | A2 | A8 | 57 |
5 | C1 | A2 | 68 | 97 |
6 | C1 | A2 | E8 | 17 |
7 | C1 | A2 | 18 | E7 |
8 | C1 | A2 | 98 | 67 |
9 | C1 | A2 | 58 | A7 |
0 | C1 | A2 | 38 | C7 |
ok | C1 | A2 | B8 | 47 |
save | C1 | A2 | D8 | 27 |
#include <mega128.h>
#include <stdio.h>
#include <delay.h>
// define
// 매크로
#define clear_bit(data, push) ( (data) &= ~(0x1<<(push)) ) // 특정 비트만 '0'으로 클리어
#define set_bit(data, push) ( (data) |= (0x1<<(push)) ) // 특정 비트만 '1'로 셋
#define check_bit(data, push) ( (data) & (0x1<<(push)) ) // 특정 비트값을 읽어 온다.
// 함수 선언
void Signal(void);
void Sig_cmp(void);
void Copy_func(unsigned char value);
// 전역변수
unsigned ch = 0 ; // Select FND
unsigned store_= 0;
int sw = 2;
unsigned char Buffer[5] = {0xc0,0xc0,0xc0,0xc0,0xc0};
unsigned char fnd1_Buffer[5] = {0xc0,0xc0,0xc0,0xc0,0xc0};
unsigned char fnd2_Buffer[5] = {0xc0,0xc0,0xc0,0xc0,0xc0};
unsigned char fnd3_Buffer[5] = {0xc0,0xc0,0xc0,0xc0,0xc0};
unsigned char fnd4_Buffer[5] = {0xc0,0xc0,0xc0,0xc0,0xc0};
unsigned int time_count = 0;
unsigned int custom_code = 0x0000;
unsigned int data_code = 0x0000;
unsigned char Lead_sig = 0;
unsigned char bit_data ;
unsigned char custom_code_count=0;
unsigned char data_code_count=0;
// 7Segment 진리표
/***************************************************
< 7Segment Data Table !!> ==커먼 캐써드= 타입=
MSB | LSB
g f e | d c b a
----------------|--------------------------------
0 : 1 0 0 | 0 0 0 0 0xc0
----------------|--------------------------------
1 : 1 1 1 | 1 0 0 1 0xf9
----------------|--------------------------------
2 : 0 1 0 | 0 1 0 0 0xa4
----------------|--------------------------------
3 : 0 1 1 | 0 0 0 0 0xb0
----------------|--------------------------------
4 : 1 0 1 | 1 0 0 1 0x99
----------------|--------------------------------
5 : 0 0 1 | 0 0 1 0 0x92
----------------|--------------------------------
6 : 0 0 0 | 0 0 1 0 0x82
----------------|--------------------------------
7 : 0 1 1 | 1 0 0 0 0xf8
----------------|--------------------------------
8 : 0 0 0 | 0 0 0 0 0x80
----------------|--------------------------------
9 : 0 0 1 | 0 0 0 0 0x90
----------------|--------------------------------
A : 0 0 0 | 1 0 0 0 0x88
----------------|--------------------------------
B : 0 0 0 | 0 0 1 1 0x83
----------------|--------------------------------
C : 0 1 0 | 0 1 1 1 0xc6
----------------|--------------------------------
D : 0 1 0 | 0 0 0 1 0xa1
----------------|--------------------------------
E : 0 0 0 | 0 1 1 0 0x86
----------------|--------------------------------
F : 0 0 0 | 1 1 1 0 0x8e
----------------|--------------------------------
****************************************************/
// FND에 표시할 숫자
enum { // g f e d c b a
FND_0, // 0 1 1 1 1 1 1
FND_1, // 0 0 0 0 1 1 0
FND_2, // 1 0 1 1 0 1 1
FND_3, // 0 0 1 1 1 1 1
FND_4, // 0 1 0 0 1 1 1
FND_5, // 1 1 0 1 1 0 1
FND_6, // 1 1 1 1 1 0 1
FND_7, // 1 0 0 0 1 1 1
FND_8, // 1 1 1 1 1 1 1
FND_9, // 1 1 0 1 1 1 1
FND_A, // 1 1 1 0 1 1 1
FND_B, // 1 1 1 1 1 0 0
FND_C, // 1 0 1 1 0 0 0
FND_D, // 1 0 1 1 1 1 0
FND_E, // 1 1 1 1 0 0 1
FND_F, // 1 1 1 0 0 0 1
FND_VALUE
};
static unsigned char FND_font[] =
{
0xc0, // 0
0xf9, // 1
0xa4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90, // 9
0x88, // A
0x83, // B
0xC6, // C
0xA1, // D
0x86, // E
0x8E // F
};
void port_init(void)
{
DDRC = 0xFF; // 포트 C 출력 설정 - FND 핀 연결
DDRB = 0xFF;
DDRA = 0xFF;
DDRD = 0xFF;
DDRF = 0xFF;
DDRE = 0b00000010; // PE4 - PE7 핀 입력 설정 - 외부 인터럽트
}
// Timer_Counter0 Initialize Function(타이머카운터0 초기화 함수)
void Timer_Counter0_init(void)
{
// 타이머/카운터0 출력비교(TCNT0 = OCRO 일때) 인터럽트 서비스 루틴
// 인터럽트 발생 주기 1/16us * 8분주 * 200 = 100us = 0.1ms
TIMSK = 0x02; // OCIE0 = 1 출력 비교 인터럽트 인에이블
TCCR0 = 0x0A; // 프리스케일 = CK/8, CTC 모드
OCR0 = 199; // 출력 비교 레지스터값
TCNT0 = 0x00; // 타이머/카운터0 레지스터 초기값
SREG = 0x80; // 전역 인터럽트 인에이블 비트 I 셋.
}
// 외부인터럽트 초기화 함수
void External_Interrupt_init(void)
{
// 인터럽트 초기화
EICRB = 0x02; // 외부 인터럽트 4 : 하강 에지
EIMSK = 0x10; // 외부 인터럽트 4 인에이블
}
void main(void)
{
int i;
unsigned int twincle = 0;
port_init();
External_Interrupt_init();
Timer_Counter0_init();
while(1) // 무한 루프
{
switch(sw)
{
case 1 :
///////////////////////////////////////////////////////////////////////////
if(ch == 1)
{
twincle++;
if(twincle == 150)
twincle = 0;
if(twincle >= 80)
{
PORTA = 0x00;
PORTD = 0x00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTF = 0x01 << i;
PORTC = Buffer[i];
if(i==2)
{
clear_bit(PORTC,7); // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
}
PORTA = 0x00;
PORTF = 0X00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTD = 0x01 << i;
PORTC = fnd2_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
PORTD = 0X00;
PORTF = 0X00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTA = 0x01 << i;
PORTC = fnd3_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
PORTA = 0x00;
PORTD = 0X00;
PORTF = 0X00;
for(i=0; i<5; i++)
{
PORTB = 0x01 << i;
PORTC = fnd4_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
}
///////////////////////////////////////////////////////////////////////////////
if(ch == 2)
{
twincle++;
if(twincle == 150)
twincle = 0;
PORTA = 0x00;
PORTD = 0x00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTF = 0x01 << i;
PORTC = fnd1_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7); // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
if(twincle >=80)
{
PORTA = 0x00;
PORTF = 0X00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTD = 0x01 << i;
PORTC = Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
}
PORTD = 0X00;
PORTF = 0X00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTA = 0x01 << i;
PORTC = fnd3_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
PORTA = 0x00;
PORTD = 0X00;
PORTF = 0X00;
for(i=0; i<5; i++)
{
PORTB = 0x01 << i;
PORTC = fnd4_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
}
///////////////////////////////////////////////////////////////////////////////
if(ch == 3)
{
twincle++;
if(twincle == 150)
twincle = 0;
PORTA = 0x00;
PORTD = 0x00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTF = 0x01 << i;
PORTC = fnd1_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7); // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
PORTA = 0x00;
PORTF = 0X00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTD = 0x01 << i;
PORTC = fnd2_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
if(twincle >=80)
{
PORTD = 0X00;
PORTF = 0X00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTA = 0x01 << i;
PORTC = Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
}
PORTA = 0x00;
PORTD = 0X00;
PORTF = 0X00;
for(i=0; i<5; i++)
{
PORTB = 0x01 << i;
PORTC = fnd4_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
}
///////////////////////////////////////////////////////////////////////////////
if(ch == 4)
{
twincle++;
if(twincle == 150)
twincle = 0;
PORTA = 0x00;
PORTD = 0x00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTF = 0x01 << i;
PORTC = fnd1_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7); // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
PORTA = 0x00;
PORTF = 0X00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTD = 0x01 << i;
PORTC = fnd2_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
PORTD = 0X00;
PORTF = 0X00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTA = 0x01 << i;
PORTC = fnd3_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
if(twincle >=80)
{
PORTA = 0x00;
PORTD = 0X00;
PORTF = 0X00;
for(i=0; i<5; i++)
{
PORTB = 0x01 << i;
PORTC = Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
}
}
break;
///////////////////////////////////////////////////////////////////////////////
case 2 :
PORTA = 0x00;
PORTD = 0x00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTF = 0x01 << i;
PORTC = fnd1_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7); // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
PORTA = 0x00;
PORTF = 0X00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTD = 0x01 << i;
PORTC = fnd2_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
PORTD = 0X00;
PORTF = 0X00;
PORTB = 0x00;
for(i=0; i<5; i++)
{
PORTA = 0x01 << i;
PORTC = fnd3_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
PORTA = 0x00;
PORTD = 0X00;
PORTF = 0X00;
for(i=0; i<5; i++)
{
PORTB = 0x01 << i;
PORTC = fnd4_Buffer[i];
if(i==2)
{
clear_bit(PORTC,7) ; // 점 찍기 (000.00), "."
delay_us(50);
}
delay_us(500);
}
break;
}
}
}
// 타이머/카운터0 출력비교(TCNT0 = OCRO 일때) 인터럽트 서비스 루틴
interrupt [TIM0_COMP] void timer_comp0(void)
{
time_count++;
}
// 외부 인터럽트 4 서비스 루틴
interrupt[EXT_INT4] void external_int4(void)
{
Signal();
Sig_cmp();
time_count = 0 ;
}
void Signal(void)
{
if( (time_count > 90) && (time_count < 145) ) // 입력 신호가 Lead 신호.
{
Lead_sig = 1;
custom_code_count = 0;
data_code_count =0;
custom_code = 0x0000;
data_code = 0x0000;
}
else if ( (time_count > 5) && (time_count < 17) ) //입력 bit가 0일 경우
{
bit_data = 0x0000;
if (custom_code_count < 16) // custom_code_count 가 16보다 작을 경우
{
custom_code_count++ ; // custom_code_count 의 자리 수 증가
custom_code = (custom_code <<= 1) | (bit_data) ; //비트를 1자리 이동후 최하위 비트에 0을 대입
}
else if (data_code_count < 16 ) // data_code_count가 16보다 작을 경우
{
data_code_count++ ; // data_code_count 의 자리 수 증가
data_code = (data_code <<= 1) | (bit_data) ; //비트를 1자리 이동후 최하위 비트에 0을 대입
}
}
else if ( (time_count > 17) && (time_count < 28) ) //입력 bit가 1일 경우
{
bit_data = 0x0001;
if (custom_code_count < 16) // custom_code_count 가 16보다 작을 경우
{
custom_code_count++ ; // custom_code_count 의 자리 수 증가
custom_code = (custom_code <<= 1) | (bit_data) ; //비트를 1자리 이동후 최하위 비트에 0을 대입
}
else if (data_code_count < 16 ) // data_code_count가 16보다 작을 경우
{
data_code_count++ ; // data_code_count 의 자리 수 증가
data_code = (data_code <<= 1) | (bit_data) ; //비트를 1자리 이동후 최하위 비트에 0을 대입
}
}
else
{
Lead_sig = 0;
}
}
void Sig_cmp(void)
{
int i;
if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0x30CF) ) // 메뉴 1번 키
{
ch = 1;
sw = 1;
for(i=0; i<5; i++)
{
Buffer[i] = 0xc0;
}
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0xB04F) ) // 메뉴 2번 키
{
ch = 2;
sw = 1;
for(i=0; i<5; i++)
{
Buffer[i] = 0xc0;
}
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0x708F) ) // 메뉴 3번 키
{
ch = 3;
sw = 1;
for(i=0; i<5; i++)
{
Buffer[i] = 0xc0;
}
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0xF00F) ) // 메뉴 4번 키
{
ch = 4;
sw = 1;
for(i=0; i<5; i++)
{
Buffer[i] = 0xc0;
}
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0x48b7) ) // 1 숫자
{
Copy_func(FND_font[FND_1]);
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0xc837) ) // 2 숫자
{
Copy_func(FND_font[FND_2]);
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0x28d7) ) // 3 숫자
{
Copy_func(FND_font[FND_3]);
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0xa857) ) // 4 숫자
{
Copy_func(FND_font[FND_4]);
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0x6897) ) // 5 숫자
{
Copy_func(FND_font[FND_5]);
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0xe817) ) // 6 숫자
{
Copy_func(FND_font[FND_6]);
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0x18e7) ) // 7 숫자
{
Copy_func(FND_font[FND_7]);
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0x9867) ) // 8 숫자
{
Copy_func(FND_font[FND_8]);
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0x58a7) ) // 9 숫자
{
Copy_func(FND_font[FND_9]);
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0x38c7) ) // 0 숫자
{
Copy_func(FND_font[FND_0]);
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0xd827) ) // SAVE
{
switch(ch)
{
case 1 :
if( !((Buffer[0]== 0x86) && (Buffer[1]==0xc1) && (Buffer[2]==0x88) &&(0x7f)) )
{
for(i=0; i<5; i++)
{
fnd1_Buffer[i] = Buffer[i];
store_ = 1;
}
}
break;
case 2 :
if( !((Buffer[0]== 0x86) && (Buffer[1]==0xc1) && (Buffer[2]==0x88) &&(0x7f)) )
{
for(i=0; i<5; i++)
{
fnd2_Buffer[i] = Buffer[i];
store_ = 2;
}
}
break;
case 3 :
if( !((Buffer[0]== 0x86) && (Buffer[1]==0xc1) && (Buffer[2]==0x88) &&(0x7f)) )
{
for(i=0; i<5; i++)
{
fnd3_Buffer[i] = Buffer[i];
store_ = 3;
}
}
break;
case 4 :
if( !((Buffer[0]== 0x86) && (Buffer[1]==0xc1) && (Buffer[2]==0x88) &&(0x7f)) )
{
for(i=0; i<5; i++)
{
fnd4_Buffer[i] = Buffer[i];
store_ = 4;
}
}
break;
default :
break;
}
Buffer[0] = 0x86;
Buffer[1] = 0xc1;
Buffer[2] = 0x88;
Buffer[3] = 0x92;
Buffer[4] = 0x7f;
}
else if ( (Lead_sig == 1) && (custom_code == 0xC1A2) && (data_code == 0xb847) ) // 출력
{
sw = 2;
}
}
// value값을 Buffer에 복사하는 함수
void Copy_func(unsigned char value)
{
Buffer[4] = Buffer[3];
Buffer[3] = Buffer[2];
Buffer[2] = Buffer[1];
Buffer[1] = Buffer[0];
Buffer[0] = value;
}