Bilkent University EEE 212 Spring 2018 Section 1 Group 7 / PS2Keyboard

Dependents:   eee212projectWithSD

Files at this revision

API Documentation at this revision

Comitter:
Ceyhun_Emre
Date:
Sat Jun 02 09:31:29 2018 +0000
Commit message:
My team changed mapping of the keys for the sake of the constraints of our Morse Encoder/ Decoder device. ; ; Regards.

Changed in this revision

PS2ASCII.cpp Show annotated file Show diff for this revision Revisions of this file
PS2ASCII.h Show annotated file Show diff for this revision Revisions of this file
PS2Kbd.cpp Show annotated file Show diff for this revision Revisions of this file
PS2Kbd.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r ea6fa42df9ec PS2ASCII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PS2ASCII.cpp	Sat Jun 02 09:31:29 2018 +0000
@@ -0,0 +1,132 @@
+#include "PS2ASCII.h"
+
+//===================================
+//*Constructor*
+//===================================
+
+PS2ASCII::PS2ASCII(PinName data, PinName clk) : kbd(data,clk) ,_caps(false), _shift(false),  _E0flag(false) ,_numlock(false)
+{
+    
+}
+
+//===================================
+//Functions
+//===================================
+
+unsigned char PS2ASCII::getChar()
+{
+     while(1)
+     {
+         _E0flag = false;
+         unsigned char keypress = kbd.rd();                //code in
+        
+        if(keypress == 0xE0)                            //is it a special E0 key?
+        {
+            keypress = kbd.rd();                        //next byte in
+            if(keypress == 0xF0)                        //is it a break code?
+            {
+                keypress = kbd.rd();                    //if so chew it up and back to start
+                
+                continue;
+            }
+            
+            _E0flag = true;                                //tell us that it is an E0 function
+            return keypress;
+        }
+        
+        if((keypress == 0x12) || (keypress == 0x59))    //SHIFT pressed?
+        {
+            _shift = true;
+            continue;
+        }
+        
+        if(keypress == 0xF0)                            //gets rid of byte 1 of break code
+        {
+            keypress = kbd.rd();                        //byte 2 of break code in
+                
+            if((keypress == 0x12) || (keypress == 0x59))
+            {
+                _shift = false;
+            }
+            continue;
+        }
+        
+        switch (keypress) {
+            case 0x58:
+                _caps = !_caps; //CAPS LOCK key
+                kbd.wr(0xED);
+                if (_caps && _numlock)
+                    kbd.wr(0x06);
+                else if (_caps && !_numlock)
+                    kbd.wr(0x04);
+                else if (!_caps && _numlock)
+                    kbd.wr(0x02);
+                else
+                    kbd.wr(0x00);                                
+                continue;
+            case 0x77:
+                _numlock = !_numlock;
+                kbd.wr(0xED);
+                if (_caps && _numlock)
+                    kbd.wr(0x06);
+                else if (_caps && !_numlock)
+                    kbd.wr(0x04);
+                else if (!_caps && _numlock)
+                    kbd.wr(0x02);
+                else
+                    kbd.wr(0x00); 
+                continue;
+            default:
+                break;
+        }
+        
+// We do not need shift and caps lock in our project, since we do not use uppercase letters.        
+        
+//        unsigned char initial_keypress = keypress;
+        
+//        if(_shift == true)                                //if SHIFT is pressed take shifted character
+//        {
+//            keypress = shift_on[keypress];
+//        }
+//            
+//       if((_caps == true)&&(initial_keypress >= 97)&&(initial_keypress <= 127))
+//        {
+//            keypress = shift_on[keypress];                //if caps is on shift the letter up
+//        }
+
+        return(keypress);    
+              
+    }
+}
+
+unsigned char PS2ASCII::getASCII(unsigned char keypress) {
+    unsigned char character = ps2CharMap[keypress];
+    
+    if (!_E0flag && !_numlock) {
+            if (keypress == 0x70 || keypress == 0x69 || keypress == 0x72 || keypress == 0x7A ||
+                keypress == 0x6B || keypress == 0x73 || keypress == 0x74 || keypress == 0x6C ||
+                keypress == 0x75 || keypress == 0x7D)
+                character = ' ';
+                 
+        }
+        
+    return character;
+}
+    
+bool PS2ASCII::E0flag()
+{
+    return _E0flag;
+}
+
+bool PS2ASCII::numlock()
+{
+    return _numlock;
+}
+     
+bool PS2ASCII::caps() {
+    return _caps;
+}
+
+bool PS2ASCII::shift() {
+    return _shift;     
+}
\ No newline at end of file
diff -r 000000000000 -r ea6fa42df9ec PS2ASCII.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PS2ASCII.h	Sat Jun 02 09:31:29 2018 +0000
@@ -0,0 +1,48 @@
+#ifndef MBED_PS2ASCII_H
+#define MBED_PS2ASCII_H
+
+#include "PS2Kbd.h"
+#include "mbed.h"
+
+class PS2ASCII {
+
+public:
+
+    PS2ASCII(PinName data, PinName clk);
+    unsigned char getChar();
+    unsigned char getASCII(unsigned char keypress);
+    bool caps();
+    bool shift();
+    bool E0flag();
+    bool numlock();
+        
+private:
+
+    PS2Kbd kbd;
+    bool _caps;                        
+    bool _shift; 
+    bool _E0flag; 
+    bool _numlock;
+};
+
+    static const unsigned char shift_on[] = {
+//   0     1     2     3     4     5     6     7     8     9     A     B     C     D     E     F
+    ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  '`',  ' ', // 00-0F
+    ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ', // 10-1F
+    ' ', 0x21, 0x22,  '~', 0x24, 0x25, 0x26,  '@', 0x28, 0x29, 0x30, 0x31,  '<',  '_',  '>',  '?', // 20-2F
+    ')',  '!', '\"', 0x9C,  '$',  '%',  '^',  '&',  '*',  '(',  ' ',  ':',  ' ',  '+',  ' ',  ' ', // 30-3F
+    0xAA, 'a',  'b',  'c',  'd',  'e',  'f',  'g',  'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o', // 40-6F
+    'p',  'q',  'r',  's',  't',  'u',  'v',  'w',  'x',  'y',  'z',  '{',  '|',  '}',  ' ',  ' ', // 50-7F
+    ' ',  'A',  'B',  'C',  'D',  'E',  'F',  'G',  'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O', // 60-4F
+    'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',  'X',  'Y',  'Z', 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, // 70-5F
+    ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ', // 80-8F
+    ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ', // 90-9F
+    ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ', // A0-AF
+    ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ', // B0-BF
+    ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ', // C0-CF
+    ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ', // D0-DF
+    ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ', // E0-EF
+    NULL, ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ',  ' ', // F0-FF
+};
+
+#endif
diff -r 000000000000 -r ea6fa42df9ec PS2Kbd.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PS2Kbd.cpp	Sat Jun 02 09:31:29 2018 +0000
@@ -0,0 +1,73 @@
+#include "PS2Kbd.h"
+#include "mbed.h"
+
+
+/* ==================================================================
+ * Constructor
+ ================================================================= */
+
+PS2Kbd::PS2Kbd(PinName clk, PinName din) 
+    : _ps2clk(clk), _ps2din(din) {
+   
+}    
+
+// =============================
+// 
+// =============================
+unsigned char PS2Kbd::rd(void)
+{
+    unsigned int buf = 0x00;
+    int i;
+    
+    _ps2clk = 0;
+
+    // both input
+    _ps2din.input();
+    _ps2clk.input();
+
+    for(i=0;i<11;i++) {
+        while(_ps2clk);
+        while(!_ps2clk);
+        buf = buf >> 1;
+        buf |= _ps2din ? 512 : 0;
+    }
+
+    // output
+    _ps2clk.output();
+
+    buf &= 0xFF;
+
+    return(ps2KeyMap[(unsigned char)buf]);
+    //return (unsigned char)buf;
+}
+
+
+// =============================
+// 
+// =============================
+void PS2Kbd::wr(unsigned char)
+{
+    unsigned int buf = 0x00;
+    int i;
+    
+    _ps2clk = 0;
+
+    // both input
+    _ps2din.input();
+    _ps2clk.input();
+
+    for(i=0;i<11;i++) {
+        while(_ps2clk);
+        while(!_ps2clk);
+        buf = buf >> 1;
+        buf |= _ps2din ? 512 : 0;
+    }
+
+    // output
+    _ps2clk.output();
+
+    buf &= 0xFF;
+
+}
+
+
diff -r 000000000000 -r ea6fa42df9ec PS2Kbd.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PS2Kbd.h	Sat Jun 02 09:31:29 2018 +0000
@@ -0,0 +1,61 @@
+#ifndef PS2KBD_H
+#define PS2KBD_H
+
+#include "mbed.h"
+
+class PS2Kbd  {
+
+public:
+
+    PS2Kbd(PinName clk, PinName din);
+    unsigned char rd(void);
+    void wr(unsigned char);
+    
+protected:
+    DigitalInOut _ps2clk;
+    DigitalInOut _ps2din;
+
+};
+
+
+static const unsigned char ps2KeyMap[] = {
+//   0     1     2     3     4     5     6     7     8     9     A     B     C     D     E     F
+    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, // 00-0F
+    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, // 10-1F
+    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, // 20-2F
+    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, // 30-3F
+    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, // 40-4F
+    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, // 50-5F
+    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, // 60-6F
+    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, // 70-7F
+    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, // 80-8F
+    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, // 90-9F
+    0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, // A0-AF
+    0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, // B0-BF
+    0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, // C0-CF
+    0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, // D0-DF
+    0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, // E0-EF
+    0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, // F0-FF
+};
+
+static const unsigned char ps2CharMap[] = {
+//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
+    ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '`', ' ', // 00-0F
+    ' ', ' ', ' ', ' ', ' ', 'q', '1', ' ', ' ', ' ', 'z', 's', 'a', 'w', '2', ' ', // 10-1F
+    ' ', 'c', 'x', 'd', 'e', '4', '3', ' ', ' ', ' ', 'v', 'f', 't', 'r', '5', ' ', // 20-2F
+    ' ', 'n', 'b', 'h', 'g', 'y', '6', ' ', ' ', ' ', 'm', 'j', 'u', '7', '8', ' ', // 30-3F
+    ' ', ',', 'k', 'i', 'o', '0', '9', ' ', ' ', '.', '/', 'l', ';', 'p', '-', ' ', // 40-4F
+    ' ', ' ','\'', ' ', '[', '=', ' ', ' ', ' ', ' ', ' ', ']', ' ','\\', ' ', ' ', // 50-5F
+    ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '1', ' ', '4', '7', ' ', ' ', '1', // 60-6F
+    '0', '.', '2', '5', '6', '8', ' ', ' ', ' ', '+', '3', '-', '*', '9', ' ', ' ', // 70-7F
+    ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 80-8F
+    ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 90-9F
+    ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // A0-AF
+    ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // B0-BF
+    ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // C0-CF
+    ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // D0-DF
+    ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // E0-EF
+    ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // F0-FF
+};
+
+#endif
\ No newline at end of file