스캔코드
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
스캔 코드는 컴퓨터 키보드에서 각 키의 눌림과 떼어짐을 나타내기 위해 사용되는 고유한 코드이다. 스캔 코드 체계는 컴퓨터 기종 및 인터페이스 규격에 따라 다르며, PC/AT 및 PS/2 키보드는 다양한 세트의 스캔 코드를 지원한다. USB 키보드는 "Usage"라는 용어를 사용하여 키 입력을 나타내며, 멀티미디어 및 인스턴트 키와 같은 추가 기능을 지원한다. 대한민국에서는 키 배열 설정에 따라 키보드 배열이 다를 수 있으며, Macintosh ADB 키보드 및 PC-9800 키보드와 같은 다른 키보드 유형도 고유한 스캔 코드를 사용한다.
더 읽어볼만한 페이지
- 컴퓨터 자판 - 한글 자판
한글 자판은 한글 입력 방식의 배열을 의미하며, 두벌식, 세벌식, 타자기 자판, 휴대 전화 자판 등 다양한 종류가 있고, 리듬감, 도깨비불 현상, 오타 수정 가능성 등 다양한 논점을 가지고 있다. - 컴퓨터 자판 - 터치 타이핑
터치 타이핑은 키보드를 보지 않고 손가락 위치를 기억해 타이핑하는 기술로, 효율적인 방법으로 알려져 있으며 꾸준한 연습으로 속도와 정확성을 향상시킬 수 있다. - 부호화 - 바코드
바코드는 다양한 폭의 막대와 공백 조합으로 정보를 나타내는 기호로, 상품 식별, 재고 관리 등에 사용되며 1차원과 2차원 바코드가 존재하고 바코드 스캐너로 판독되어 산업 효율성을 높인다. - 부호화 - 춤추는 사람
《춤추는 사람》은 셜록 홈즈가 그림 암호 메시지를 통해 벌어지는 사건을 해결하는 이야기로, 암호 해독, 엘시의 과거, 옛 연인의 등장, 살인 사건 등이 전개된다. - 데이터 전송 - 대역폭 제한
대역폭 제한은 네트워크 혼잡 방지, 특정 사용자 과도한 사용 방지, 서비스 품질 관리 등을 위해 컴퓨터 네트워크에서 데이터 전송 속도를 인위적으로 제한하는 기술이다. - 데이터 전송 - 데이터 링크
데이터 링크는 데이터를 송수신하기 위한 통신 연결로, 단방향, 반이중, 전이중 통신으로 나뉘며, 다양한 분야에서 활용되고 특히 항공 분야에서 항공 교통 관제 및 정보 교환, 무인 시스템 제어에 사용된다.
스캔코드 |
---|
2. 스캔 코드의 동작 원리
키보드 컨트롤러는 키가 눌리거나 떼어질 때 해당 키에 고유한 스캔 코드를 CPU에 보낸다.[6] 스캔 코드는 키보드의 키를 물리적으로 식별하는 것이며, 해당 키가 나타내는 문자나 기능과는 관계가 없다. CPU는 스캔 코드를 받으면 키 배열 설정, 수정 키·고정 키 등의 상태를 참조하여 해당 문자를 입력하거나 수정 키, 펑션 키 처리를 실행한다.
스캔 코드 체계는 컴퓨터 기종에 따라 다르며, 인터페이스 규격에 따라 정해지기도 한다. 같은 기종·인터페이스라도 여러 체계를 가질 수 있다. 따라서 운영 체제(OS)는 받은 스캔 코드를 OS 고유의 가상 키 코드로 변환·통일하여 처리하는 것이 일반적이다.
2. 1. 메이크 코드와 브레이크 코드
키가 눌렸을 때 발생하는 스캔 코드를 '''메이크'''(make) 코드, 떼어졌을 때 발생하는 것을 '''브레이크'''(break) 코드라고 한다.[1] 같은 키의 메이크와 브레이크는 MSB나 프리픽스 코드로 구분되는 경우가 많다.[1] 오토 리피트 처리를 키보드 측에서 하는 경우, 키가 눌려 있는 동안 메이크 코드를 주기적으로 발생시킨다.[1]2. 2. 오토 리피트 (타이프매틱)
키보드 측에서 오토 리피트 (타이프매틱) 기능을 처리하는 경우, 키가 눌려 있는 동안 메이크 코드를 주기적으로 발생시킨다.3. 스캔 코드 체계
스캔 코드 체계는 컴퓨터 기종 및 인터페이스 규격에 따라 다르며, 같은 기종 및 인터페이스에서도 여러 체계를 가질 수 있다.
과거에는 소프트웨어나 펌웨어를 사용하여 스캔 코드를 텍스트 문자로 변환하는 것이 텍스트 문자로 키보드를 배선하는 것보다 비용이 저렴했다.[6] 그러나 오늘날에는 이러한 비용 차이가 크지 않다. 그럼에도 불구하고 많은 컴퓨터들이 하위 호환성을 위해 여전히 기존의 스캔 코드를 사용하고 있다.
일부 키보드 표준은 눌린 각 키와 해제된 각 키에 대해 서로 다른 스캔 코드를 포함한다. 또한 IBM PC 호환 표준과 같이, 키보드 자체에서 "자동 반복"을 지원하여 키가 눌린 상태에서는 눌린 키 스캔 코드를 반복적으로 생성하고, 키가 해제될 때 해제 스캔 코드를 한 번 보내는 경우가 많다.
컴퓨터 키보드에서 "A" 키를 누르면 "A"라는 문자 코드(ASCII 등)가 직접 전송되지 않는다. 키보드 컨트롤러는 키의 누름 또는 해제를 감지하여 해당 키에 고유한 스캔 코드를 CPU에 보낸다. 스캔 코드는 키보드의 키를 물리적으로 식별하며, 해당 키가 나타내는 문자나 기능과는 관계가 없다. CPU는 스캔 코드를 받아 키 배열 설정, 수정 키·고정 키 상태 등을 참조하여 해당 문자를 입력하거나 수정 키, 펑션 키 처리를 실행한다.
키가 눌렸을 때 발생하는 스캔 코드를 '''메이크'''(make) 코드, 떼어졌을 때 발생하는 것을 '''브레이크'''(break) 코드라고 한다. 같은 키의 메이크와 브레이크는 MSB나 프리픽스 코드로 구분된다. 오토 리피트(타이프매틱) 처리를 키보드에서 하는 경우, 키가 눌려 있는 동안 메이크 코드를 주기적으로 발생시킨다.
운영 체제(OS)는 받은 스캔 코드를 OS 고유의 가상 키 코드로 변환하여 통일한 후 처리하는 것이 일반적이다.
3. 1. PC/AT 및 PS/2 키보드의 스캔 코드
PC/AT 호환기종의 스캔 코드는 역사적인 경위로 인해 복잡한 체계를 이루고 있다. 여러 버전의 스캔 코드 세트가 존재한다.[6]PC 호환 컴퓨터의 컴퓨터 키보드에서 스캔 코드는 키보드에서 전송되는 1~3 바이트 세트이다. 대부분의 문자 키는 단일 바이트 스캔 코드를 가지지만, 특수 기능을 수행하는 키는 2바이트 또는 3바이트 스캔 코드를 가지며, 일반적으로 16진수 `E0`, `E1` 또는 `E2`로 시작한다.
PS/2 키보드 이후의 PC 키보드는 최대 3개의 스캔 코드 세트를 지원한다. 가장 일반적으로 사용되는 것은 IBM PC XT 및 이전 버전에서 사용된 83키 키보드를 기반으로 하는 "XT"("세트 1") 스캔 코드이다. 이들은 대부분 단일 바이트로 구성되며, 낮은 7비트는 키를 식별하고 최상위 비트는 키 누름의 경우 지워지고 키 해제의 경우 설정된다.
IBM PC AT는 "AT"("세트 2") 스캔 코드를 도입했다. 84키 AT 키보드에서 이들은 세트 3의 하위 집합이었으며, 기능 키의 위치와 스캔 코드가 변경되는 등 레이아웃 변경으로 인한 몇 가지 차이점이 있었다. PC AT 이후에 추가된 키는 세트 2와 세트 3에서 서로 다른 스캔 코드를 가지는 경우가 많으며, 세트 2에서는 `E0` 또는 `E1` 접두사를 자주 가진다. 키 해제는
F0
접두사로 표시된다.IBM 3270 PC는 자체 스캔 코드 세트("세트 3")를 도입했으며, 키 해제는
F0
접두사로 표시된다. 하위 호환성을 위해 3270 PC는 이를 XT(세트 1) 스캔 코드로 변환했다.[2]IBM PC AT 이후 컴퓨터의 경우 마더보드의 키보드 컨트롤러는 AT(세트 2) 스캔 코드를 ''변환 모드''에서 XT(세트 1) 스캔 코드로 변환한다.[3] 이 변환은 ''패스 스루 모드''에서 비활성화하여 원시 스캔 코드를 볼 수 있다.[4]
호환되는 PS/2 키보드는 세트 1, 2 또는 3에서 스캔 코드를 전송하도록 지시할 수 있다.
키 | 세트 1 (IBM PC XT) | 세트 2 (IBM PC AT) | 세트 3 (IBM 3270 PC) | |||
---|---|---|---|---|---|---|
누름 | 해제 | 누름 | 해제 | 누름 | 해제 | |
A (단순 문자) | 1E | 9E | 1C | F0 1C | 1C | F0 1C |
Enter (주 키보드) | 1C | 9C | 5A | F0 5A | 5A | F0 5A |
Enter (숫자 키패드) | E0 1C | E0 9C | E0 5A | E0 F0 5A | 79 | F0 79 |
왼쪽 윈도우 키 | E0 5B | E0 DB | E0 1F | E0 F0 1F | 8B | F0 8B |
오른쪽 윈도우 키 | E0 5C | E0 DC | E0 27 | E0 F0 27 | 8C | F0 8C |
3. 1. 1. 83 키보드 (IBM PC, PC/XT)
최초의 PC에 사용된 83 키보드는 스캔 코드가 01~53으로 정렬되어 있다.[6] 브레이크 코드는 최상위 비트(MSB)를 설정하여 표시한다.[1]3. 1. 2. 84 키보드 (PC/AT)
IBM PC/AT에서 도입된 84 키보드는 SysReq 키(54)를 추가했다.[6] 스캔 코드 자체는 83 키보드와 동일하게 유지되었다.3. 1. 3. 101 확장 키보드 (PC/AT)
- 101 확장 키보드(PC/AT)에서는 키가 대폭 추가되었다.
- 오른쪽 Ctrl, 오른쪽 Alt, 키패드의 Enter, 키패드의 / (슬래시)는 각각 왼쪽 Ctrl(1D), 왼쪽 Alt(38), Enter(1C), /(35)에 프리픽스 E0이 붙는다.[6]
- 기존에 키패드와 겸용하던 커서 키, Insert, Delete, Home, End, PageUp, PageDown은 독립된 키로 분리되었다. 이 키들은 각각 대응하는 키패드의 코드에 프리픽스 E0이 붙는다.[6]
- F11(57), F12(58) 키는 새롭게 추가된 코드이다.[6]
- PrintScreen 키는 83/84 키보드에서 Shift(2A)+키패드의 *(37) 조합이었으므로, E0 2A E0 37을 발생한다.[6]
- SysReq 키(54)는 Alt+PrintScreen 조합으로 변경되었으므로, Alt+PrintScreen 키를 누르면 54를 발생한다.[6]
- Pause 키는 83/84 키보드에서 Ctrl(1D)+NumLock(45) 조합이었으므로, E1 1D 45를 발생한다. 이 키는 오토 리피트 대상에서 제외되며, 눌렀을 때 즉시 브레이크 코드(E1 9D C5)를 발생한다.[6]
- Ctrl+Pause(Break) 키는 83/84 키보드의 Scroll Lock(46)에 해당하므로, E0 46을 발생한다. 이 키 역시 오토 리피트 대상에서 제외되며, 눌렀을 때 즉시 브레이크 코드(E0 C6)를 발생한다.[6]
3. 1. 4. 101 확장 키보드 (PS/2)
PC/AT 호환기종의 스캔 코드는 역사적인 경위로 인해 복잡한 체계를 이루고 있다. 101 확장 키보드 (PS/2)에서는 기존의 코드 체계(세트 1) 외에 새로운 코드 세트 2와 3이 정의되었다.[2]코드 세트 2는 코드 세트 1의 프리픽스와 특례를 유지하면서 브레이크 코드를 F0 프리픽스로 나타낸다. 코드 세트 3은 모든 키가 1바이트 메이크 코드를 발생하며, 브레이크 코드는 F0 프리픽스로 나타낸다.[2]
오늘날의 PC/AT 호환 기종에서는 키보드가 스캔 코드 세트 2를 발생시키고, 본체의 키보드 컨트롤러가 이를 세트 1로 변환하여 CPU로 보내는 것이 일반적이다. (이 변환을 하지 않는 설정도 가능하다. PC나 PC/XT에는 이 변환이 없으므로 세트 1밖에 받아들일 수 없다) 다만, 노트 PC에서는 직접 세트 1을 발생시켜 변환하지 않는 경우도 있다. 세트 3은 3270 PC 등에서 사용되지만, UNIX워크스테이션의 키보드에서 세트 3을 발생시키는 것은 PC의 BIOS나 OS에서는 통상 사용할 수 없다.[2]
리피트는 메이크만을 반복하고, 키를 뗀 시점에서 브레이크 코드가 발생한다.
3. 2. USB 키보드의 Usage
USB 키보드는 HID (Human Interface Device) 장치 클래스의 일부로 정의되며, 스캔 코드에 해당하는 것은 '''Usage'''라는 용어로 불린다.[5]USB는 특정 기종에 의존하지 않으므로, 키보드는 AT 호환기, Mac, PC-9800/9821 시리즈, UNIX 워크스테이션 등 다양한 기종 간에 가능한 한 공통화될 수 있도록 규정되어 있다. 따라서 다른 기종용 USB 키보드를 연결해도 기본적으로 조작이 가능하다.
초기 Mac용 USB 키보드에는 이전의 ADB용 키보드와 마찬가지로 파워 키가 있었는데, 이는 신호선과 GND를 연결하는 구조로 USB 규격 외이다.
3. 2. 1. Usage의 구조
Usage는 32비트 부호 없는 정수로, 상위 16비트는 'Usage page', 하위 16비트는 'Usage ID'로 구성된다.[5] Usage는 HID 장치가 전송(또는 수신)하는 수치(Report)가 어떤 물리적 상태를 표현하고 있는지를 호스트에 알리기 위해 사용된다. 즉, Usage는 값(report)의 사용법(usage)을 정의한다.Usage는 32비트이지만 모두 전송하면 비경제적이므로 생략하여 전송할 수 있다. Report 집합이 공통 Usage Page를 가진 경우 그룹화하여 하위 16비트 Usage ID만 전송할 수 있다. Usage Page나 Usage ID 상위 비트가 0인 경우에도 생략 가능하다. 예를 들어, 키보드 "A" 키는 '0x00070004'가 아닌 '0x04'만 보낼 수 있다.
3. 2. 2. USB 키보드의 데이터 전송 방식
USB 키보드는 USB 표준에 명시된 새로운 스캔 코드를 사용하며, USB 키보드를 인식하는 모든 컴퓨터는 이 새로운 스캔 코드를 인식한다.[5] USB에서는 키보드가 휴먼 인터페이스 장치 (HID) 장치 클래스의 일부로 정의되며, 스캔 코드에 해당하는 것은 '''Usage'''라는 용어로 불린다.일반적인 키보드는 눌리거나 떨어진 키의 스캔 코드만 보내지만, USB 키보드의 데이터 전송 방식은 이와 다르다. USB 키보드는 현재 눌려 있는 모든 키의 정보를 정적(static)으로 보낸다. 이러한 방식은 다음과 같은 특징을 가진다.
- A 키를 누른 상태에서 B 키를 누르면, B 키를 누른 시점에 전송되는 HID 리포트에는 A 키와 B 키의 두 Usage ID가 모두 포함된다. 따라서 이번에 새로 눌린 키가 B 키라는 것은 본체(컴퓨터) 측에서 판정해야 한다.
- 키를 뗄 때도 어떤 키가 떨어졌는지 보내는 것이 아니라, 떨어진 후의 상태를 보내기 때문에, 키가 떨어진 것 역시 본체 측에서 판정해야 한다. (따라서 브레이크 코드에 해당하는 것은 없다.)
또한, 오토 리피트나 LED의 제어도 키보드 내부에서 수행하지 않는다. 이는 키보드를 단순한 스위치로 간주하는 설계 사상에 따른 것이다.
많은 USB 키보드가 전송하는 HID 리포트는 USB HID 규격서에 있는 '''"Boot protocol"'''과 동일하며 8바이트이다. 첫 번째 바이트는 눌려 있는 수정 키(Modifier key)를 나타내는 8비트 플래그이다. PC용 키보드의 Alt 키, Windows 키와 Mac용 키보드의 Option 키, Command 키는 각각 동일하게 취급된다. HID 리포트의 뒤 6바이트는 눌려 있는 키(최대 6개, 수정 키는 제외)의 Usage ID가 들어간다. 잠금 키도 일반 키와 마찬가지로 취급된다.
3. 2. 3. 멀티미디어 키 및 인스턴트 키
최근 키보드는 CD, DVD 등을 재생하는 "멀티미디어 키"나, 웹 브라우저, 전자 메일 클라이언트 등을 기동하는 "인스턴트 키"를 갖는 경우가 많다. 하지만 키보드의 Usage page (0x0007)의 Usage ID 정의에는 이러한 키는 포함되어 있지 않다(볼륨 조절 관련 키는 예외). 이러한 키는 Consumer page의 Usage ID로 정의된다.[5]이러한 키를 갖는 USB 키보드는, 일반적으로 내부적으로 keyboard usage page를 생성하는 장치와 Consumer usage page를 생성하는 장치(리모컨 등의 종류)의 복합 장치가 되어 있다. Boot protocol에서의 report가 keyboard usage page만으로 구성되어 있기 때문에 호환성 확보를 위해 이러한 구현이 많은 것으로 생각된다.[5]
4. 대한민국에서의 키보드 배열과 스캔 코드
대한민국에서는 주로 JIS 키보드 배열과 유사한 키 배열을 사용하며, 한글 각인이 추가되어 있다. 같은 기종, 같은 인터페이스의 키보드라면 키 캡 각인에 관계없이 물리적으로 같은 위치에 있는 키는 같은 스캔 코드를 발생시킨다. 한글/영어 전환과 같이 운영체제에서 키보드 배열 설정을 변경하여 각 키에 할당된 문자나 기능을 변경할 수 있다.[6]
4. 1. 키 배열 설정
같은 기종, 같은 인터페이스의 키보드라면 키 캡 각인에 관계없이 물리적으로 같은 위치에 있는 키는 같은 스캔 코드를 발생시킨다. 운영체제에서 키보드 배열 설정을 변경하여(예: 한글/영어 전환) 각 키에 할당된 문자나 기능을 변경할 수 있다. 예를 들어, 개인용 컴퓨터(PC)의 키보드에서 "1"의 왼쪽 키는 JIS 배열에서는 "반각/전각", US 배열에서는 "` ~"이지만, 스캔 코드는 같다.[6]JIS 키보드 배열에 US 키보드 배열 설정을 적용하는 등, 대부분의 키는 문제없이 US 배열로 동작한다. 다만, 물리적으로 키의 유무나 위치가 다른 경우에는 그렇지 않다.[6]
5. 기타 키보드 스캔 코드
(주어진 원본 소스에 해당 섹션에 대한 내용이 없으므로 아무것도 출력하지 않음)
5. 1. Macintosh ADB 키보드의 스캔 코드
(주어진 원본 소스에 내용이 없으므로 아무것도 출력하지 않음)5. 2. PC-9800 키보드의 스캔 코드
PC-9800/9821 시리즈의 키보드는 몇몇 키가 추가된 정도 외에는 큰 변화가 없었기 때문에 스캔 코드도 정연하다. 브레이크는 최상위 비트(MSB)를 설정하여 나타낸다. 리피트는 메이크와 브레이크의 연속을 반복한다. 좌우의 SHIFT 키와 오른쪽 SHIFT 위의 리턴 및 텐키의 리턴은 각각 전기적으로 병렬로 연결되어 있어 구별할 수 없다.[1]일부 하이레조 기종용 키보드에 있는 HOME 키 (←와 → 사이)・CLR 키 (텐키) 모두 일반 기종의 키보드에 있는 HOME CLR 키와는 코드가 다르다.[1]
PC-9800 시리즈의 자료에서는 스캔 코드가 아닌 키 코드로 부르고 있다.[1]
참조
[1]
문서
[2]
간행물
AT and PS/2 keyboard driver (atkbd.c)
https://github.com/t[...]
2022-02-18
[3]
간행물
Keyboard scancodes
http://www.win.tue.n[...]
2004-05-20
[4]
간행물
Keyboard scancodes
http://www.win.tue.n[...]
2009-07-07
[5]
간행물
Microsoft Keyboard Scan Code Specification
http://download.micr[...]
2000-03-16
[6]
문서
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com