펌웨어로 키패드 프로그램을 만들 때가 많다. 키 패드를 사용하는 제품은 눌러진 키를 어플리케이션 단에 전달을 해야 하는데 하나만 눌러진 경우와 멀티 키가 눌러진 경우에 따라 처리가 달라지곤 한다.
조건 없이 눌러진 키들을 그냥 전달만 해야 하는 경우는 어려운 것이 없으나, 직접 하드웨어를 컨트롤하는 (호이스트나 모터를 제어하는) 경우에는 키 패드에서도 멀티 키, 다중 키에 대해 처리가 필요하다.
2개 이상 눌러진 경우, 무시
보통 키 패드는 매크릭스 구조로 되어 있는데, 2개 이상 눌러진 경우 보내지 않는 조건으로 어플리케이션이 설계되어 있다면 어려울 것이 없다. 눌러진 키값이 여러 개이면 안 보내면 되기 때문이다.
특정 패턴의 키가 눌러지는 경우만 무시
모터를 제어하는 경우, 반대되는 키들의 조합이 눌러지면 안된다는 조건이 붙기도 한다.
모터가 쌍방향으로 움직이는 도중, 하 방향으로 움직이는 키를 동시에 누른다면
모터가 이상 동작을 할 수가 있기 때문이다.
내가 만든 키패드 프로그램은 아래처럼 구현되어 있었다.
긴급 정지를 제외하고는 4x4 매트릭스 키를 읽고 그 값을 리턴하는 구조였다.
uint32_t ReadKeyPads() { uint16_t i,j; uint32_t retKey = 0,tmpKey,allkey; g_keyInt = 0; if(CheckEmergencyKey()) return EMERGENCY_DATA; for(i=4;i>0;i--) { SelectKeyColum(0);USTIMER_DelayIntSafe(10); SelectKeyColum(i);USTIMER_DelayIntSafe(100); tmpKey=RemoveBoundKey(); retKey<<=4; retKey |= tmpKey; } return retKey; }
상 버튼과 동 버튼, 북 버튼은 각자 상관없는 방향이라 상관없지만,
상하, 동서는 상반되는 방향이라 같이 눌러지면 안 되었다.
상하 버튼이 동시에 눌리면 키값은 0x01 or 0x10 = 0x11 이 나오도록 설계했고, 동서는 0x22가 나오게 했다.
만약, 상하동 버튼이 동시에 눌러지면 0x01 | 0x10 | 0x02 = 0x13 값이 나온다.
여기에 0x11을 반전시켜 AND 처리하면 0x02 만 남으며 이 값만 전달하면 된다.
0x13 & ~0x11 = 0x13 & 0xEE = 0x02
반대되는 키값을 정리한 다음, 그 값을 배열에 넣고 for 문으로 처리하게 한 소스는 다음과 같다.
uint32_t CovertSendKeyData(uint32_t now_Key) { uint32_t KeyCheckMask[4][4] ={ {0x8888,0x0088,0x0880,0x8800}, {0x4444,0x0044,0x0440,0x4400}, {0x2222,0x0022,0x0220,0x2200}, {0x1111,0x0011,0x0110,0x1100}, }; uint32_t tmpData; char i,j; for(i = 0; i < 4; i++) { tmpData = now_Key & KeyCheckMask[i][0]; if(tmpData == 0) continue; for(j = 0 ; j < 3 ; j++) { if((tmpData & KeyCheckMask[i][j+1])==KeyCheckMask[i][j+1]) { now_Key &= ~KeyCheckMask[i][0]; break; } } } return now_Key; }
사실 위에 내용보다 고스트키에 대한 내용이 더 중요한데.. 이는 다음에 업로드를...
'개발이야기' 카테고리의 다른 글
무선단말기로 둠 실행하기 (0) | 2021.09.18 |
---|---|
펌웨어 강좌 #07 키패드 제어와 고스트 키 (0) | 2021.09.18 |
AnySign for PC #발견하면 반드시 지워야 합니다. (0) | 2021.08.31 |
[C언어/API] 변수의 비트 수 체크하기 (0) | 2021.08.01 |
[C언어/API] 버튼 입력 채터링 관련한 팁 (0) | 2021.08.01 |