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); // data와 0000 0001 and 후 그 값이 0이면(data는 1110) 4번 키패드를 누른 것이므로 LED에 4를 표시(키패드 구성도 참조하면 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에 대해서 배우도록 하겠습니다. 수고 하셨어요!
'Study > AVR ATmega128 Easy Processor Kit' 카테고리의 다른 글
13. Keypad와 7-Segment를 활용한 심화 작품 만들기 (0) | 2016.01.27 |
---|---|
12. Easy Processor Kit 7-segment 제어하기 (0) | 2016.01.21 |
10. 외부 LED와 Dip Switch를 활용한 심화 작품 만들기 (1) | 2016.01.12 |
9. Dip Switch 및 외부 LED 제어 (0) | 2016.01.11 |
8. AVR의 GPIO 특성 이해 (0) | 2016.01.10 |