キーボードのしくみ
普段使っているキーボードについて誰にでもわかりやすく解説
はじめに
PCを使っている方なら、おそらくキーボードを使わない日は無いと思います。キーボードは文字を入力するという重要な役割を果たしていますが、どのようにして実現しているのでしょうか。「どのボタン(スイッチ)が押されたか、状態をみているだけじゃないの?」と思われるかも知れません。確かにその通り、スイッチの状態をみているのですが、PCのキーボードだとスイッチの数が100個以上もあります。そんなに多くのスイッチをどうやってみているのでしょうか。
キーボードマトリクス
スイッチの数が少なければ一度にみることができるのですが、さすがに100個を超えると一度にみることはできません。(※)そのような場合、一般的には下図のようなキーボードマトリクスという方法で行います。
この例では、5×5=25個のスイッチの状態をみることができます。出力ポートO1~O5に順番に信号を出しながら、その都度入力ポートI1~I5の状態を5回にわけて確認します。これをゆっくりやると、短時間のタッチを取りこぼす可能性がありますが、通常は人間のスピードとは比較にならないほど高速にスキャンしますので、短時間のタッチでも取りこぼす心配はありません。
このようにして、スイッチが100個のときは、10×10のマトリクスを構成すれば全てのスイッチの状態を知ることができるというしかけになっているのです。
※ 一般的に出力ポートや入力ポートの数は8の倍数になっており、8/16/32が多くなっています。従って、100を超えるスイッチの状態を一度にみることはできないため、キーボードマトリクスの手法が使われます。
文字コードとは
ご存じのように、キーボードから文字を入力するときは様々な入力方法の切り替えが必要で、初めてキーボードを使う人は戸惑うかも知れませんが、頻繁に利用するのは半角と全角の切り替えと思われます。
入力モード | 概要 |
半角 | 主にアルファベットや数字を入力するときに使用する |
全角 | 主にひらがなやカタカナ、漢字を入力するときに使用する |
では、半角と全角って何のことなのでしょうか?実は、コンピュータが出来た頃はこのような区別は無く、1種類(半角)のみでした。その後、漢字など様々な文字が必要になったため、文字コードが拡張され全角が誕生したという経緯になっています。
文字コードはコンピュータにそれぞれの文字を認識させるために固有のコード(番号)を割り振ったものですが、最初の頃はアルファベットと数字、記号が有れば良かったので文字コードはシンプルなものでした。アルファベットや数字などが0 ~ 127(16進数:7F)の中に割り振られています。
なお、0 ~ 31(16進数:1F)の部分は文字ではなく特殊なコードが割り振られています。例えば、10(16進数:0A)は改行(LF: Line Feed)が割り振られています。また、32(16進数:20)のSPはSpace(空白)となっており、127(16進数:7F)のDELはDelete(削除)を意味するコードとなっています。
このように、0 ~ 127(16進数:7F)の中に割り振られているのですが、これを2進数で表現すると、
0000000 ~ 1111111(7ビット)であり1バイト(8ビット)に収まることから1バイトコードとも呼ばれます。なお、このコードは米国の規格協会(ANSI)で規格化されており、ASCII(アスキー)コードとも呼ばれています。
※ASCII: American Standard Code for Information Interchange
10進 | 16進 | ASCII | 10進 | 16進 | ASCII | 10進 | 16進 | ASCII | 10進 | 16進 | ASCII |
0 | 0 | 32 | 20 | SP | 64 | 40 | @ | 96 | 60 | ` | |
1 | 1 | 33 | 21 | ! | 65 | 41 | A | 97 | 61 | a | |
2 | 2 | 34 | 22 | “ | 66 | 42 | B | 98 | 62 | b | |
3 | 3 | 35 | 23 | # | 67 | 43 | C | 99 | 63 | c | |
4 | 4 | 36 | 24 | $ | 68 | 44 | D | 100 | 64 | d | |
5 | 5 | 37 | 25 | % | 69 | 45 | E | 101 | 65 | e | |
6 | 6 | 38 | 26 | & | 70 | 46 | F | 102 | 66 | f | |
7 | 7 | 39 | 27 | ‘ | 71 | 47 | G | 103 | 67 | g | |
8 | 8 | 40 | 28 | ( | 72 | 48 | H | 104 | 68 | h | |
9 | 9 | 41 | 29 | ) | 73 | 49 | I | 105 | 69 | i | |
10 | A | 42 | 2A | * | 74 | 4A | J | 106 | 6A | j | |
11 | B | 43 | 2B | + | 75 | 4B | K | 107 | 6B | k | |
12 | C | 44 | 2C | , | 76 | 4C | L | 108 | 6C | l | |
13 | D | 45 | 2D | – | 77 | 4D | M | 109 | 6D | m | |
14 | E | 46 | 2E | . | 78 | 4E | N | 110 | 6E | n | |
15 | F | 47 | 2F | / | 79 | 4F | O | 111 | 6F | o | |
16 | 10 | 48 | 30 | 0 | 80 | 50 | P | 112 | 70 | p | |
17 | 11 | 49 | 31 | 1 | 81 | 51 | Q | 113 | 71 | q | |
18 | 12 | 50 | 32 | 2 | 82 | 52 | R | 114 | 72 | r | |
19 | 13 | 51 | 33 | 3 | 83 | 53 | S | 115 | 73 | s | |
20 | 14 | 52 | 34 | 4 | 84 | 54 | T | 116 | 74 | t | |
21 | 15 | 53 | 35 | 5 | 85 | 55 | U | 117 | 75 | u | |
22 | 16 | 54 | 36 | 6 | 86 | 56 | V | 118 | 76 | v | |
23 | 17 | 55 | 37 | 7 | 87 | 57 | W | 119 | 77 | w | |
24 | 18 | 56 | 38 | 8 | 88 | 58 | X | 120 | 78 | x | |
25 | 19 | 57 | 39 | 9 | 89 | 59 | Y | 121 | 79 | y | |
26 | 1A | 58 | 3A | : | 90 | 5A | Z | 122 | 7A | z | |
27 | 1B | 59 | 3B | ; | 91 | 5B | [ | 123 | 7B | { | |
28 | 1C | 60 | 3C | < | 92 | 5C | \ | 124 | 7C | | | |
29 | 1D | 61 | 3D | = | 93 | 5D | ] | 125 | 7D | } | |
30 | 1E | 62 | 3E | > | 94 | 5E | ^ | 126 | 7E | ~ | |
31 | 1F | 63 | 3F | ? | 95 | 5F | _ | 127 | 7F | DEL |
文字コードの拡張
すでにお気づきかも知れませんが、さきほどの1バイトコードでは1バイトの中の0 ~ 127(16進数:7F)を使用しており、128(16進数:80)~255(16進数:FF)は空きになっています。日本では、この空いている領域に半角カタカナを割り振っており、当然ながら海外には無い日本独自の仕様となっています。このため、半角カタカナを含むメールを送ると途中のメールサーバで処理できずに「文字化け」を起こすことがありますので注意が必要です。
次の段階として漢字に対応することが必要となり、1バイトでは対応できませんので次のような2バイト(全角)コードが登場しました。
コード名称 | 概要 |
EBCDIC | IBMにより開発されたメインフレーム用標準コード |
JIS | 日本のJIS規格により規定されたコード |
シフトJIS | Microsoftなどによって策定されPC用として普及したコード |
EUC | 世界各国の言語に対応することを考慮されたもので、主にUNIX系のOSで普及 文字によっては3バイトコードになる場合もある |
Unicode | Unicodeコンソシアムによって世界中の文字をひとつのコード体系で扱えるようにしたもので、WindowsやUNIXなど様々なOSで対応している。 文字によっては3バイトや4バイトになることもある |
関連情報
プログラミングって、そもそもナニ? https://www.keisoku.co.jp/pw/u-po/402_prg/