1.PS/2的電氣特性如下(電腦端):

| 1 | DATA | Key Data |
| 2 | n/c | Not connected |
| 3 | GND | Gnd |
| 4 | VCC | Power , +5 VDC |
| 5 | CLK | Clock |
| 6 | n/c | Not connected |
2.數據格式如下:
| 1個起始位 | 總是邏輯0 |
| 8個數據位 | (LSB)低位在前 |
| 1個奇偶校驗位 | 奇校驗 |
| 1個停止位 | 總是邏輯1 |
| 1個應答位 | 僅用在主機對設備的通訊中 |
如果數據位中1的個數為偶數,校驗位就為1;如果數據位中1的個數為奇數,校驗位就為0;總之,數據位中1的個數加上校驗位中1的個數總為奇數,因此總進行奇校驗。
3.PS/2發送時序

其中a為鍵盤到PC機的發送時序(如果你用單片機接收,就按照此時序),在時鐘的下降沿,數據被PC讀入。
b為PC機到鍵盤的時序。
4.鍵盤返回值
需要說明的是:鍵盤的返回值并不是和ASCII碼相對應!
一次按鍵過程至少會發送兩組碼,通碼和斷碼,通碼是按鍵被按下時發送,斷碼是當按鍵釋放時發送,按住不動將發送通碼。每個鍵的通碼和斷碼都是唯一的,因此通過查唯一的掃描碼,就可以知道哪個鍵被按下或釋放。
掃描碼集有三套標準,分別是第一套,第二套和第三套,所有現代的鍵盤默認使用第二套掃描碼。
就以大定字母“A”,首先得按住Shift鍵,然后按下A鍵,再松開A鍵,再松開Shift鍵。查下面的碼表,就得到這樣一組鍵碼:
12 1C F0 1C F0 12
5.第二套掃描碼
101 102 和104 鍵的鍵盤:
| KEY | 通碼 | 斷碼 | | KEY | 通碼 | 斷碼 | | KEY | 通碼 | 斷碼 |
| A | 1C | F0 1C | 9 | 46 | F0 46 | [ | 54 | F0 54 |
| B | 32 | F0 32 | ` | 0E | F0 0E | INSERT | E0 70 | E0 F0 70 |
| C | 21 | F0 21 | - | 4E | F0 4E | HOME | E0 6C | E0 F0 6C |
| D | 23 | F0 23 | = | 55 | F0 55 | PG UP | E0 7D | E0 F0 7D |
| E | 24 | F0 24 | \ | 5D | F0 5D | DELETE | E0 71 | E0 F0 71 |
| F | 2B | F0 2B | BKSP | 66 | F0 66 | END | E0 69 | E0 F0 69 |
| G | 34 | F0 34 | SPACE | 29 | F0 29 | PG DN | E0 7A | E0 F0 7A |
| H | 33 | F0 33 | TAB | 0D | F0 0D | U ARROW | E0 75 | E0 F0 75 |
| I | 43 | F0 43 | CAPS | 58 | F0 58 | L ARROW | E0 6B | E0 F0 6B |
| J | 3B | F0 3B | L SHFT | 12 | F0 12 | D ARROW | E0 72 | E0 F0 72 |
| K | 42 | F0 42 | L CTRL | 14 | F0 14 | R ARROW | E0 74 | E0 F0 74 |
| L | 4B | F0 4B | L GUI | E0 1F | E0 F0 1F | NUM | 77 | F0 77 |
| M | 3A | F0 3A | L ALT | 11 | F0 11 | KP / | E0 4A | E0 F0 4A |
| N | 31 | F0 31 | R SHFT | 59 | F0 59 | KP * | 7C | F0 7C |
| O | 44 | F0 44 | R CTRL | E0 14 | E0 F0 14 | KP - | 7B | F0 7B |
| P | 4D | F0 4D | R GUI | E0 27 | E0 F0 27 | KP + | 79 | F0 79 |
| Q | 15 | F0 15 | R ALT | E0 11 | E0 F0 11 | KP EN | E0 5A | E0 F0 5A |
| R | 2D | F0 2D | APPS | E0 2F | E0 F0 2F | KP | 71 | F0 71 |
| S | 1B | F0 1B | ENTER | 5A | F0 5A | KP 0 | 70 | F0 70 |
| T | 2C | F0 2C | ESC | 76 | F0 76 | KP 1 | 69 | F0 69 |
| U | 3C | F0 3C | F1 | 05 | F0 05 | KP 2 | 72 | F0 72 |
| V | 2A | F0 2A | F2 | 06 | F0 06 | KP 3 | 7A | F0 7A |
| W | 1D | F0 1D | F3 | 04 | F0 04 | KP 4 | 6B | F0 6B |
| X | 22 | F0 22 | F4 | 0C | F0 0C | KP 5 | 73 | F0 73 |
| Y | 35 | F0 35 | F5 | 03 | F0 03 | KP 6 | 74 | F0 74 |
| Z | 1A | F0 1A | F6 | 0B | F0 0B | KP 7 | 6C | F0 6C |
| 0 | 45 | F0 45 | F7 | 83 | F0 83 | KP 8 | 75 | F0 75 |
| 1 | 16 | F0 16 | F8 | 0A | F0 0A | KP 9 | 7D | F0 7D |
| 2 | 1E | F0 1E | F9 | 01 | F0 01 | ] | 58 | F0 58 |
| 3 | 26 | F0 26 | F10 | 09 | F0 09 | ; | 4C | F0 4C |
| 4 | 25 | F0 25 | F11 | 78 | F0 78 | ' | 52 | F0 52 |
| 5 | 2E | F0 2E | F12 | 07 | F0 07 | , | 41 | F0 41 |
| 6 | 36 | F0 36 | PRNT SCRN | E0 12 E0 7C | E0 F0 7C E0 F0 12 | . | 49 | F0 49 |
| 7 | 3D | F0 3D | SCROLL | 7E | F0 7E | / | 4A | F0 4A |
| 8 | 3E | F0 3E | PAUSE | E1 14 77 E1 F0 14 F0 77 | -NONE- | | | |
Widows多媒體碼:
| KEY | 通碼 | 斷碼 |
| Next Track | E0 4D | E0 F0 4D |
| Previous Track | E0 15 | E0 F0 15 |
| Stop | E0 3B | E0 F0 3B |
| Play/Pause | E0 34 | E0 F0 34 |
| Mute | E0 23 | E0 F0 23 |
| Volume Up | E0 32 | E0 F0 32 |
| Volume Down | E0 21 | E0 F0 21 |
| Media Select | E0 50 | E0 F0 50 |
| E-Mail | E0 48 | E0 F0 48 |
| Calculator | E0 2B | E0 F0 2b |
| My Computer | E0 40 | E0 F0 40 |
| WWW Search | E0 10 | E0 F0 10 |
| WWW Home | E0 3A | E0 F0 3a |
| WWW Back | E0 38 | E0 F0 38 |
| WWW Forward | E0 30 | E0 F0 20 |
| WWW Stop | E0 28 | E0 F0 28 |
| WWW Refresh | E0 20 | E0 F0 20 |
| WWW Favorites | E0 18 | E0 F0 18 |
以下是51單片機的讀取鍵碼程序,此程序僅僅是取得鍵盤的通碼和斷碼,要得到ASCII還需要解碼程序,要看到結果還得要顯示程序。其它請看本站相關文章。
#define sck P3_3//寫義時鐘線,選用中斷口#define dat P3_4//定義數據線unsigned char keyvalue;//鍵碼unsigned char intnum=0;//中斷次數bit bf=0//已經取得一個鍵碼時為1/*------------------------------------------------------51單片機設為低電平觸發中斷當時鐘線為低時,觸發中斷,然后讀數,等待高電平退出中斷*/------------------------------------------------------void int1(void) interrupt 2//中斷處理{ if( (intnum>0) && (intnum<9) )//只讀取第1--8位,也就是鍵碼位,拋棄起始位0,校驗位9與停止位10 { keyvalue>>=1;//因為鍵盤先發送的是最低位,所以右移一位 if(dat) { keyvalue|=0x80;//當數據線為1時,將最高位置1 } } intnum++;//中斷次數加1 while(!sck);//當時鐘線為低電平時循環至到時鐘線為高電平 if(intnum>10)//當中斷11次后,表示一個字已經發完,禁止中斷,等待處理,處理完后,清零bf { intnum=0; bf=1; EA=0; }}