2. 1번 스위치를 누르면 숫자 1이, 3번 스위치를 누르면 숫자 3이 PC로 전송되는 프로그램을 작성하시오.
#define PINE (*(volatile unsigned char *)0x21)
#define DDRE (*(volatile unsigned char *)0x22)
#define PORTE (*(volatile unsigned char *)0x23)
//---------USART 레지스트리 설정
#define UDR1 (*(volatile unsigned char *)0x9C)
#define UCSR1A (*(volatile unsigned char *)0x9B)
#define UCSR1B (*(volatile unsigned char *)0x9A)
#define UCSR1C (*(volatile unsigned char *)0x9D)
#define UBRR1L (*(volatile unsigned char *)0x99)
#define UBRR1H (*(volatile unsigned char *)0x98)
//--------- 통신 값 설정
#define CPU_CLOCK 16000000
#define BAUD_RATE 19200
#define BAUD_RATE_L (CPU_CLOCK/(16l*BAUD_RATE))-1
#define BAUD_RATE_H ((CPU_CLOCK/(16l*BAUD_RATE))-1)>>8
//--------- 레지스트리 비트값(UCSR1C)
#define UPM1 5
#define UPM0 4
#define USBS 3
#define UCSZ1 2
#define UCSZ0 1
//--------- 레지스트리 비트값(UCSR1B)
#define TXEN 3
#define RXEN 4
#define UCSZ2 2
//--------- 레지스트리 비트값(UCSR1A)
#define UDRE 5
#define NOP() asm volatile ("nop");
#define DELAY_MS 400 //딜레이 시간 설정.
void uart_send(unsigned char st)
{
while(!(UCSR1A & (1<<UDRE)));
UDR1 = st;
}
int main(void)
{
unsigned char buf ;
//unsigned int i;
UBRR1L = (unsigned char)BAUD_RATE_L;
UBRR1H = (unsigned char)BAUD_RATE_H;
UCSR1C = (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0);
UCSR1B = (1<<TXEN) | (1<<RXEN) | (0<<UCSZ2);
while(1)
{
buf = ~(PINE);
if(buf !=0)
{
switch(buf)
{
int ms =0;
int us =0;
case 1:
uart_send('1');
for(ms=0; ms<DELAY_MS; ms++) // 16 * ms * 1000
{
for(us=0; us<1000; us++)
{ //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4 = 16
}
}
break;
case 2:
uart_send('2');
for(ms=0; ms<DELAY_MS; ms++) // 16 * ms * 1000
{
for(us=0; us<1000; us++)
{ //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4 = 16
}
}
break;
case 4:
uart_send('3');
for(ms=0; ms<DELAY_MS; ms++) // 16 * ms * 1000
{
for(us=0; us<1000; us++)
{ //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4 = 16
}
}
break;
case 8:
uart_send('4');
for(ms=0; ms<DELAY_MS; ms++) // 16 * ms * 1000
{
for(us=0; us<1000; us++)
{ //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4 = 16
}
}
break;
case 16:
uart_send('5');
for(ms=0; ms<DELAY_MS; ms++) // 16 * ms * 1000
{
for(us=0; us<1000; us++)
{ //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4 = 16
}
}
break;
case 32:
uart_send('6');
for(ms=0; ms<DELAY_MS; ms++) // 16 * ms * 1000
{
for(us=0; us<1000; us++)
{ //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4 = 16
}
}
break;
case 64:
uart_send('7');
for(ms=0; ms<DELAY_MS; ms++) // 16 * ms * 1000
{
for(us=0; us<1000; us++)
{ //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4 = 16
}
}
break;
case 128:
uart_send('8');
for(ms=0; ms<DELAY_MS; ms++) // 16 * ms * 1000
{
for(us=0; us<1000; us++)
{ //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4
NOP(); NOP(); NOP(); NOP(); //4 = 16
}
}
break;
}
}
}
return 0;
}
'About 프로그래밍!!! > ATmega128' 카테고리의 다른 글
[ATmega128] 문자열 보내는 함수 구현. (0) | 2010.07.20 |
---|---|
[ATmega128] 양방향 직렬통신 (0) | 2010.07.20 |
[ATmega128] 아트메가랑 PC랑 통신하기1 (0) | 2010.07.20 |
[ATmega128]단방향 직렬통신 테스트 (0) | 2010.07.20 |
[ATmega128] 복습 (0) | 2010.07.20 |