본문 바로가기

[ATmega128] 아트메가랑 PC랑 통신하기2

반응형

2. 1번 스위치를 누르면 숫자 1, 3번 스위치를 누르면 숫자 3PC로 전송되는 프로그램을 작성하시오.

   

   

   

   

   

#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;  

}

반응형
-->