Study/AVR ATmega128 Easy Processor Kit

11. Easy Processor Kit 외부 keypad 제어 하기

안녕하세요^^ 


오늘은 외부 keypad를 제어 해보려고 합니다~!!! 


우선 key pad가 무엇인지 알아야겠죠??


 - Keypad란?


 

 여러가지 기능을 수행할 수 있도록 만들어진 독립된 작은 장치입니다. 키를 누르게 되면 ON이 되어 Low 값이든, High 값이든 기계로 흘러 들어가게 된답니다. 값에 따라 여러가지 기능들을 수행 할 수 있겠죠?? 일종의 스위치라고 생각하면 됩니다!


 키패드를 과연 어떻게 제어를 할까요?? 알아보도록 하죠.


 - keypad 제어 방법


 자 키패드 회로도를 한번 살펴보죠~~ 화질이 좋지는 않은데, 이전에 공유해 드렸던 easy-pro-kit-base-v12.pdf 파일을 참조하세요!ㅎㅎ 6강에 올려놓았습니다!!(http://feelsoverygood.tistory.com/35)


 어라?? LED와 Dip switch 번에 보던 칩들이 한꺼번에 붙어 있네요! 버퍼(위쪽, 열에 해당)와 D 플립플롭(아래쪽, 행에 해당)을 이용하는군요. 그러고 보니 풀업저항 또한 이용하네요 Dip switch와 거의 모양이 흡사하죠?? 동작 방식 또한 스위치 형태이기 때문에 비슷하답니다.

 또한, 자세히 보시면 버퍼에도 4개의 포트만, 플립플롭에도 4개의 포트만을 사용한 것을 볼 수 있답니다. 즉, 총 8개의 포트로 4*4의 키패드를 입력 받을 수 있게 해놓았답니다.


- Keypad 흐름도

 키를 눌렀을 때의 흐름을 처음부터 설명하자면, MCUCR 레지스터에서 외부 메모리를 쓰겠다고 입력되면, 하위, 상위포트로 어드레가 나눠지고 각 포트의 값은 CPLD에 들어가게 되어 어떤 외부장치를 이용할 것인지 결정하게 됩니다. 그럼 이제 아래 표처럼 KEY_DATA와 KEY_SCAN의 값이 각각 플립플롭과 버퍼에 들어가게 됩니다.

- 이제는 다 알죠?? 외부 메모리 맵핑 주소입니다.

 그런 다음 이제 버튼이 눌러졌는지 읽고 싶은 행에 Low의 값을 주게 되면 버튼을 누른 열은 Low의 값이 버퍼로 들어가겠죠?? 즉, 키패드가 총 4행으로 이루어져 있으니 KEY_DATA에 1행씩 Low 값을 주어(나머지 행들은 High 값으로 주어야합니다! 그렇게 해야 한줄씩만 확인이 가능하기 때문이죠.) 키패드가 눌러졌는지 KEY_SCAN의 값으로 확인이 되겠죠??? 물론! KEY_DATA의 값이 while문을 통해 1행~4행을 반복하여 Low 값을 주어 확인을 하고 있답니다!!


즉! KEY_DATA에는 1행씩 Low값을 주고, KEY_SCAN으로는 눌러진 키에 해당하는 곳에 Low값이 들어오게 되는 겁니다.

 이런 방식(한 행씩 스캔하는 방식)이 다이나믹 구동이라고 한답니다~!


 - 실습


 이해 되셨나요?? 아마 이해가 안되시면 소스코드를 통하여 이해를 해보도록 하죠!! 그럼 이제 소스코드를 작성해 봅시다.




#include <avr/io.h>

 

#define LED_CS (*(volatile unsigned char *)0x4800) // LED 주소 지정

#define KEY_DATA (*(volatile unsigned char *)0x5400) // KEY_DATA 주소 지정

#define KEY_SCAN (*(volatile unsigned char *)0x5800) // KEY_SCAN 주소 지정

 

void Platform_Init(void) // 레지스터 설정 함수

{

    MCUCR |= 0x80 ; // 외부 메모리 사용

}

 

void LED_ON(uint8_t data) // LED 키는 함수

{

    LED_CS = data; // data 값에 해당하는 LED

}

 

void Write_KeyPadData(uint8_t data) // 확인하고 싶은 행에 해당하는 값 입력

{

    KEY_DATA = data;

}

uint8_t Read_KeyPadData(void) // 열에 해당하는 값 리턴

{

    return KEY_SCAN;

}

 

void KeyPadScan()

{

    register unsigned int Key_Data;

    uint8_t data;

    uint16_t led;

 

    Write_KeyPadData(0x0E); // 0000 1110으로 1행을 확인하기 위함

    data = Read_KeyPadData(); // 열에 해당하는 누른 키패드는 0, 누르지 않은 키패드는 1의 값을 data에 저장

    if(!(data&0x01))LED_ON(0x04); // data0000 0001 and 후 그 값이 0이면(data1110) 4번 키패드를 누른 것이므로 LED4를 표시(키패드 구성도 참조하면 4번째 열이 제일 하단비트인 것을 알 수 있다.)

    if(!(data&0x02))LED_ON(0x03); // 3번 키패드 표시(1101)

    if(!(data&0x04))LED_ON(0x02); // 2번 키패드 표시(1011)

    if(!(data&0x08))LED_ON(0x01); // 1번 키패드 표시(0111)

 

    Write_KeyPadData(0x0D); // 이번에는 0000 1101으로 2행을 확인하기 위함

    data = Read_KeyPadData(); // 열에 해당하는 값 대입

    if(!(data&0x01))LED_ON(0x08); // 8번 키패드 표시(1110)

    if(!(data&0x02))LED_ON(0x07); // 7번 키패드 표시(1101)

    if(!(data&0x04))LED_ON(0x06); // 6번 키패드 표시(1011)

    if(!(data&0x08))LED_ON(0x05); // 같은 방법으로 반복

     

    Write_KeyPadData(0x0B); // 3행 확인

    data = Read_KeyPadData();

    if(!(data&0x01))LED_ON(0x0C);

    if(!(data&0x02))LED_ON(0x0B);

    if(!(data&0x04))LED_ON(0x0A);

    if(!(data&0x08))LED_ON(0x09);

     

    Write_KeyPadData(0x07); // 4행 확인

    data = Read_KeyPadData();

    if(!(data&0x01))LED_ON(0x10);

    if(!(data&0x02))LED_ON(0x0F);

    if(!(data&0x04))LED_ON(0x0E);

    if(!(data&0x08))LED_ON(0x0D);

}

 

int main(void){

    Platform_Init();

    while(1){

        KeyPadScan();

    }

}



 위의 소스코드가 이해가 가시나요?? 그럼 Keypad에 관해서 다 배우신 겁니다.ㅎㅎ

설명하자면 LED에 keypad의 번호를 표시하는 소스코드입니다. 

 그리고, 프로테우스로 테스트 시뮬레이션을 하고자 하시는분은 외부 메모리 설정 대신 DDRn, PORTn, PINn 을 쓰시면 됩니다.


 앞서 설명 한 것과 같이 KEY_DATA에 1행씩 Low 값을 주고, KEY_SCAN의 값을 반환 받아서 확인하는 것 보이시죠??

실험 결과는 아래와 같습니다~!


- 왼쪽 : 키패드 1번, 오른쪽 : 키패드 16번


키패드 위치는 외부 LED 오른쪽 아래에 있답니다~ 참조하시구요!! 오늘은 여기까지 입니다!

다음시간에는 7-segment에 대해서 배우도록 하겠습니다. 수고 하셨어요!



,

최근 댓글

최근 트랙백

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

링크

Yuria

카운터

Today :
Yesterday :
Total :