이 매뉴얼은 JK전자(JK Electronics) 에 의해서 번역, 수정, 작성 되었고 소유권 또한
JK전자(JK Electronics)
의 것입니다. 소유권자의 허가를 받지 않고 무단으로 수정, 삭제하거나 배포 할 수 없습니다.



 

KEY/BUTTON 확장 2*4 모듈 Atmega2560 제어 예제


 
* Update history

- 2013.4.18 : 초기 Release


  1. Atmega2560 Rabbit 개발보드와 연결 실험

(1) Atmega2560 Rabbit 개발보드와 아래와 같이 Port Group H 와 연결 합니다.

전원은 3.3V/5V 모두 사용가능 합니다.



(2) 제어 소스(ATMEGA2560 Avrstudio 4.14 Build589 프로젝트 소스 다운로드 )

폴링 방식으로 KEY 입력을 받아서 UART로 표시를 합니다.



#include "hw_config.h"
#include "led.h"
#include "key.h"
#include "uart.h"

static volatile u16 s_key = 0;
static volatile u8 s_exit = 0;

void gpio_polling_key(void)
{
  s_exit = 0;

  while(!s_exit)
  {

    if( !inp(PINH, PH0) && !(s_key & KEY_KEY1) )
    {
      usart0_puts("Key1 Pressed.\r\n");
      s_key |= KEY_KEY1;
    }
    else if( inp(PINH, PH0) && (s_key & KEY_KEY1) )
    {
      usart0_puts("Key1 Released.\r\n");
      s_key &= ~KEY_KEY1;
    }

    if( !inp(PINH, PH1) && !(s_key & KEY_KEY2) )
    {
      usart0_puts("Key2 Pressed.\r\n");
      s_key |= KEY_KEY2;
    }
    else if( inp(PINH, PH1) && (s_key & KEY_KEY2) )
    {
      usart0_puts("Key2 Released.\r\n");
      s_key &= ~KEY_KEY2;
    }

    if( !inp(PINH, PH2) && !(s_key & KEY_KEY3) )
    {
      usart0_puts("Key3 Pressed.\r\n");
      s_key |= KEY_KEY3;
    }
    else if( inp(PINH, PH2) && (s_key & KEY_KEY3) )
    {
      usart0_puts("Key3 Released.\r\n");
      s_key &= ~KEY_KEY3;
    }

    if( !inp(PINH, PH3) && !(s_key & KEY_KEY4) )
    {
      usart0_puts("Key4 Pressed.\r\n");
      s_key |= KEY_KEY4;
    }
    else if( inp(PINH, PH3) && (s_key & KEY_KEY4) )
    {
      usart0_puts("Key4 Released.\r\n");
      s_key &= ~KEY_KEY4;
    }

    if( !inp(PINH, PH4) && !(s_key & KEY_KEY5) )
    {
      usart0_puts("Key5 Pressed.\r\n");
      s_key |= KEY_KEY5;
    }
    else if( inp(PINH, PH4) && (s_key & KEY_KEY5) )
    {
      usart0_puts("Key5 Released.\r\n");
      s_key &= ~KEY_KEY5;
    }

    if( !inp(PINH, PH5) && !(s_key & KEY_KEY6) )
    {
      usart0_puts("Key6 Pressed.\r\n");
      s_key |= KEY_KEY6;
    }
    else if( inp(PINH, PH5) && (s_key & KEY_KEY6) )
    {
      usart0_puts("Key6 Released.\r\n");
      s_key &= ~KEY_KEY6;
    }

    if( !inp(PINH, PH6) && !(s_key & KEY_KEY7) )
    {
      usart0_puts("Key7 Pressed.\r\n");
      s_key |= KEY_KEY7;
    }
    else if( inp(PINH, PH6) && (s_key & KEY_KEY7) )
    {
      usart0_puts("Key7 Released.\r\n");
      s_key &= ~KEY_KEY7;
    }

    if( !inp(PINH, PH7) && !(s_key & KEY_KEY8) )
    {
      usart0_puts("Key8 Pressed.\r\n");
      s_key |= KEY_KEY8;
    }
    else if( inp(PINH, PH7) && (s_key & KEY_KEY8) )
    {
      usart0_puts("Key8 Released.\r\n");
      s_key &= ~KEY_KEY8;
    }

    _delay_ms(20);
  }

}

void main(void)
{
  
  CLI();  // all interrupt disable

  bsp_usart0_gpio_init();
  bsp_usart0_init(F_CPU, EBaud115200, EData8, EParNone, EStop1, FALSE );  
  bsp_usart0_interrupt_enable();


  // set input
  cbi(DDRH, PH0);
  cbi(DDRH, PH1);
  cbi(DDRH, PH2);
  cbi(DDRH, PH3);
  cbi(DDRH, PH4);
  cbi(DDRH, PH5);
  cbi(DDRH, PH6);
  cbi(DDRH, PH7);

  gpio_polling_key();

  SEI();  // all interrupt enable



  while(1)
  {

  }

}