#include <mega128.h>

#include <delay.h>

#define RXB8 1

#define TXB8 0

#define UPE 2

#define OVR 3

#define FE 4

#define UDRE 5

#define RXC 7

#define FRAMING_ERROR (1<<FE)

#define PARITY_ERROR (1<<UPE)

#define DATA_OVERRUN (1<<OVR)

#define DATA_REGISTER_EMPTY (1<<UDRE)

#define RX_COMPLETE (1<<RXC)

// Get a character from the USART1 Receiver

#pragma used+

char getchar1(void)  // usb 송수신 함수

{

char status,data;

while (1)

{

while (((status=UCSR1A) & RX_COMPLETE)==0);

data=UDR1;

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)

return data;

};

}

#pragma used-

// Write a character to the USART1 Transmitter

#pragma used+

void putchar1(char c)  // usb 송수신 함수

{

while ((UCSR1A & DATA_REGISTER_EMPTY)==0);

UDR1=c;

}

#pragma used-

// Timer 1 overflow interrupt service routine

interrupt [TIM1_OVF] void timer1_ovf_isr(void)

{

// Place your code here

}

// Declare your global variables here

void main(void)

{

// Declare your local variables here // 사용자가 임의로 변수를 선언할 수 있는 공간

char i;

char a;

// Input/Output Ports initialization

// Port A initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTA=0x00;

DDRA=0x00;

// Port B initialization  포트 B의 초기화...

// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out

// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0

PORTB=0x00;

DDRB=0xFF;

// Port C initialization

// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out

// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0

PORTC=0x00;

DDRC=0xFF;

// Port D initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTD=0x00;

DDRD=0x00;

// Port E initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTE=0x00;

DDRE=0x00;

// Port F initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTF=0x00;

DDRF=0x00;

// Port G initialization

// Func4=In Func3=In Func2=In Func1=In Func0=In

// State4=T State3=T State2=T State1=T State0=T

PORTG=0x00;

DDRG=0x00;

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

// Mode: Normal top=FFh

// OC0 output: Disconnected

ASSR=0x00;

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 15.625 kHz

// Mode: Normal top=FFFFh

// OC1A output: Discon.

// OC1B output: Discon.

// OC1C output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer 1 Overflow Interrupt: On

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

// Compare C Match Interrupt: Off

TCCR1A=0x00;

TCCR1B=0x05;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

OCR1CH=0x00;

OCR1CL=0x00;

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;

// Timer/Counter 3 initialization

// Clock source: System Clock

// Clock value: Timer 3 Stopped

// Mode: Normal top=FFFFh

// Noise Canceler: Off

// Input Capture on Falling Edge

// OC3A output: Discon.

// OC3B output: Discon.

// OC3C output: Discon.

// Timer 3 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

// Compare C Match Interrupt: Off

TCCR3A=0x00;

TCCR3B=0x00;

TCNT3H=0x00;

TCNT3L=0x00;

ICR3H=0x00;

ICR3L=0x00;

OCR3AH=0x00;

OCR3AL=0x00;

OCR3BH=0x00;

OCR3BL=0x00;

OCR3CH=0x00;

OCR3CL=0x00;

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

// INT2: Off

// INT3: Off

// INT4: Off

// INT5: Off

// INT6: Off

// INT7: Off

EICRA=0x00;

EICRB=0x00;

EIMSK=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x04;

ETIMSK=0x00;

// USART1 initialization

// Communication Parameters: 8 Data, 1 Stop, No Parity

// USART1 Receiver: On

// USART1 Transmitter: On

// USART1 Mode: Asynchronous

// USART1 Baud rate: 9600

UCSR1A=0x00;

UCSR1B=0x18;

UCSR1C=0x06;

UBRR1H=0x00;

UBRR1L=0x67;

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;

// Global enable interrupts

#asm("sei")  // 이 코드 이후에 실제로 작성되는 코드 삽입 가능함..

for(i=0;i<100;i++){

PORTB.0 = 1;

delay_us(1500);

PORTB.0 = 0;

delay_ms(10);

}

while (1)

{

// Place your code here

a = getchar1(); // getChar1()는 usb를 통해 사용자가 입력한 글자를 받아옴

putchar1(a); // putChar1는 usb를 통해 컴퓨터로 특정한 한 단어를 보냄

if(a == 0x41) {   // A

for(i=0;i<60;i++){

PORTB.0 = 1;

delay_us(700); // 지정시간 동안 기다렸다가 다음 명령을 수행합니다. us는 마이크로 세컨드를 의미함

PORTB.0 = 0;

delay_ms(10); // 10 밀리세컨드 세컨드 동안 기다림...

}

} else if(a == 0x42) {

for(i=0;i<60;i++) {

PORTB.0 = 1;

delay_us(2300);

PORTB.0 = 0;

delay_ms(10);

}

}

}

}