this program is based on the PS/2 keyboard library and the LCD library, the lcd display whatever input is coming from the PS/2 keyboard.
PS2ASCII.cpp@0:3774ff2f9a59, 2011-01-30 (annotated)
- Committer:
- edwinb
- Date:
- Sun Jan 30 15:05:39 2011 +0000
- Revision:
- 0:3774ff2f9a59
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
edwinb | 0:3774ff2f9a59 | 1 | #include "PS2ASCII.h" |
edwinb | 0:3774ff2f9a59 | 2 | |
edwinb | 0:3774ff2f9a59 | 3 | //=================================== |
edwinb | 0:3774ff2f9a59 | 4 | //*Constructor* |
edwinb | 0:3774ff2f9a59 | 5 | //=================================== |
edwinb | 0:3774ff2f9a59 | 6 | |
edwinb | 0:3774ff2f9a59 | 7 | PS2ASCII::PS2ASCII(PinName data, PinName clk) : kbd(data,clk) ,_caps(false), _shift(false), _E0flag(false) ,_numlock(false) |
edwinb | 0:3774ff2f9a59 | 8 | { |
edwinb | 0:3774ff2f9a59 | 9 | |
edwinb | 0:3774ff2f9a59 | 10 | } |
edwinb | 0:3774ff2f9a59 | 11 | |
edwinb | 0:3774ff2f9a59 | 12 | //=================================== |
edwinb | 0:3774ff2f9a59 | 13 | //Functions |
edwinb | 0:3774ff2f9a59 | 14 | //=================================== |
edwinb | 0:3774ff2f9a59 | 15 | |
edwinb | 0:3774ff2f9a59 | 16 | unsigned char PS2ASCII::getChar() |
edwinb | 0:3774ff2f9a59 | 17 | { |
edwinb | 0:3774ff2f9a59 | 18 | while(1) |
edwinb | 0:3774ff2f9a59 | 19 | { |
edwinb | 0:3774ff2f9a59 | 20 | _E0flag = false; |
edwinb | 0:3774ff2f9a59 | 21 | unsigned char keypress = kbd.rd(); //code in |
edwinb | 0:3774ff2f9a59 | 22 | |
edwinb | 0:3774ff2f9a59 | 23 | if(keypress == 0xE0) //is it a special E0 key? |
edwinb | 0:3774ff2f9a59 | 24 | { |
edwinb | 0:3774ff2f9a59 | 25 | keypress = kbd.rd(); //next byte in |
edwinb | 0:3774ff2f9a59 | 26 | if(keypress == NULL) //is it a break code? |
edwinb | 0:3774ff2f9a59 | 27 | { |
edwinb | 0:3774ff2f9a59 | 28 | keypress = kbd.rd(); //if so chew it up and back to start |
edwinb | 0:3774ff2f9a59 | 29 | |
edwinb | 0:3774ff2f9a59 | 30 | continue; |
edwinb | 0:3774ff2f9a59 | 31 | } |
edwinb | 0:3774ff2f9a59 | 32 | |
edwinb | 0:3774ff2f9a59 | 33 | _E0flag = true; //tell us that it is an E0 function |
edwinb | 0:3774ff2f9a59 | 34 | return keypress; |
edwinb | 0:3774ff2f9a59 | 35 | } |
edwinb | 0:3774ff2f9a59 | 36 | |
edwinb | 0:3774ff2f9a59 | 37 | if((keypress == 0x12) || (keypress == 0x59)) //SHIFT pressed? |
edwinb | 0:3774ff2f9a59 | 38 | { |
edwinb | 0:3774ff2f9a59 | 39 | _shift = true; |
edwinb | 0:3774ff2f9a59 | 40 | continue; |
edwinb | 0:3774ff2f9a59 | 41 | } |
edwinb | 0:3774ff2f9a59 | 42 | |
edwinb | 0:3774ff2f9a59 | 43 | if(keypress == NULL) //gets rid of byte 1 of break code |
edwinb | 0:3774ff2f9a59 | 44 | { |
edwinb | 0:3774ff2f9a59 | 45 | keypress = kbd.rd(); //byte 2 of break code in |
edwinb | 0:3774ff2f9a59 | 46 | |
edwinb | 0:3774ff2f9a59 | 47 | if((keypress == 0x12) || (keypress == 0x59)) |
edwinb | 0:3774ff2f9a59 | 48 | { |
edwinb | 0:3774ff2f9a59 | 49 | _shift = false; |
edwinb | 0:3774ff2f9a59 | 50 | } |
edwinb | 0:3774ff2f9a59 | 51 | continue; |
edwinb | 0:3774ff2f9a59 | 52 | } |
edwinb | 0:3774ff2f9a59 | 53 | |
edwinb | 0:3774ff2f9a59 | 54 | switch (keypress) { |
edwinb | 0:3774ff2f9a59 | 55 | case 0x58: |
edwinb | 0:3774ff2f9a59 | 56 | _caps = !_caps; //CAPS LOCK key |
edwinb | 0:3774ff2f9a59 | 57 | continue; |
edwinb | 0:3774ff2f9a59 | 58 | case 0x80: |
edwinb | 0:3774ff2f9a59 | 59 | _numlock = !_numlock; |
edwinb | 0:3774ff2f9a59 | 60 | continue; |
edwinb | 0:3774ff2f9a59 | 61 | default: |
edwinb | 0:3774ff2f9a59 | 62 | break; |
edwinb | 0:3774ff2f9a59 | 63 | } |
edwinb | 0:3774ff2f9a59 | 64 | |
edwinb | 0:3774ff2f9a59 | 65 | unsigned char initial_keypress = keypress; |
edwinb | 0:3774ff2f9a59 | 66 | |
edwinb | 0:3774ff2f9a59 | 67 | if(_shift == true) //if SHIFT is pressed take shifted character |
edwinb | 0:3774ff2f9a59 | 68 | { |
edwinb | 0:3774ff2f9a59 | 69 | keypress = shift_on[keypress]; |
edwinb | 0:3774ff2f9a59 | 70 | } |
edwinb | 0:3774ff2f9a59 | 71 | |
edwinb | 0:3774ff2f9a59 | 72 | if((_caps == true)&&(initial_keypress >= 97)&&(initial_keypress <= 127)) |
edwinb | 0:3774ff2f9a59 | 73 | { |
edwinb | 0:3774ff2f9a59 | 74 | keypress = shift_on[keypress]; //if caps is on shift the letter up |
edwinb | 0:3774ff2f9a59 | 75 | } |
edwinb | 0:3774ff2f9a59 | 76 | |
edwinb | 0:3774ff2f9a59 | 77 | return(keypress); |
edwinb | 0:3774ff2f9a59 | 78 | |
edwinb | 0:3774ff2f9a59 | 79 | } |
edwinb | 0:3774ff2f9a59 | 80 | } |
edwinb | 0:3774ff2f9a59 | 81 | |
edwinb | 0:3774ff2f9a59 | 82 | bool PS2ASCII::E0flag() |
edwinb | 0:3774ff2f9a59 | 83 | { |
edwinb | 0:3774ff2f9a59 | 84 | return _E0flag; |
edwinb | 0:3774ff2f9a59 | 85 | } |
edwinb | 0:3774ff2f9a59 | 86 | |
edwinb | 0:3774ff2f9a59 | 87 | bool PS2ASCII::numlock() |
edwinb | 0:3774ff2f9a59 | 88 | { |
edwinb | 0:3774ff2f9a59 | 89 | return _numlock; |
edwinb | 0:3774ff2f9a59 | 90 | } |
edwinb | 0:3774ff2f9a59 | 91 | |
edwinb | 0:3774ff2f9a59 | 92 |