#include #define uchar unsigned char #define uint unsigned int LiquidCrystal lcd(12, 11, 5, 4, 3, 2); uchar KB_CLK=8; uchar KB_DATA=9; uint n=0; uchar Key_Code1; void setup() { lcd.begin(16, 2); pinMode(KB_CLK,INPUT); pinMode(KB_DATA,INPUT); Key_Code1=0; lcd.setCursor(3,0); lcd.print("ICStation"); lcd.setCursor(3,1); lcd.print("PS2:"); } void loop() { Key_Code1=Get_Key(); if(Key_Code1!=0x00) { lcd.setCursor(7,1); lcd.write(Key_Code1); } } /********************************************************************* funcname£º Key_Scan(void) functional description£º Read the PS2 keyboard to send data suction parameter£º not have outlet parameters£º Function returns the value of key_temp **********************************************************************/ uchar Key_Scan(void) { uchar i,key_temp; digitalWrite(KB_CLK,HIGH); //import digitalWrite(KB_DATA,HIGH); key_temp=0; while(digitalRead(KB_CLK)); //The first is 0 (low level start reading) for (i = 0; i < 8; ++i) { while(!digitalRead(KB_CLK)); while(digitalRead(KB_CLK)); key_temp |= digitalRead(KB_DATA) << i; } while(!digitalRead(KB_CLK)); //parity bit while(digitalRead(KB_CLK)); //Remove efficacy bit and stop bit while(!digitalRead(KB_CLK)); //stop bit while(digitalRead(KB_CLK)); while(!digitalRead(KB_CLK)); return key_temp; } /********************************************************************* funcname£º uchar Get_Key(void) functional description£º PS2 keyboard characters will be sent to show the data you sent suction parameter£º Key_Code outlet parameters£º ÎÞ ********************************************************************/ uchar Get_Key(void) { uchar Key_Code,Key_Code2; Key_Code2=Key_Scan(); Key_Code=Key_Scan(); if(Key_Code2==0x12) { Key_Code=Key_Scan(); switch(Key_Code) { case 0x1c: return 'A';break; case 0x32: return 'B';break; case 0x21: return 'C';break; case 0x23: return 'D';break; case 0x24: return 'E';break; case 0x2b: return 'F';break; case 0x34: return 'G';break; case 0x33: return 'H';break; case 0x43: return 'I';break; case 0x3b: return 'J';break; case 0x42: return 'K';break; case 0x4b: return 'L';break; case 0x3a: return 'M';break; case 0x31: return 'N';break; case 0x44: return 'O';break; case 0x4d: return 'P';break; case 0x15: return 'Q';break; case 0x2d: return 'R';break; case 0x1b: return 'S';break; case 0x2c: return 'T';break; case 0x3c: return 'U';break; case 0x2a: return 'V';break; case 0x1d: return 'W';break; case 0x22: return 'X';break; case 0x35: return 'Y';break; case 0x1a: return 'Z';break; case 0x45: return ')';break;//The number keys case 0x16: return '!';break; case 0x1e: return '@';break; case 0x26: return '#';break; case 0x25: return '$';break; case 0x2e: return '%';break; case 0x36: return '^';break; case 0x3d: return '&';break; case 0x3e: return '*';break; case 0x46: return '(';break; default: return 0x00; break; } } else switch(Key_Code) { case 0x1c: return 'a';break; case 0x32: return 'b';break; case 0x21: return 'c';break; case 0x23: return 'd';break; case 0x24: return 'e';break; case 0x2b: return 'f';break; case 0x34: return 'g';break; case 0x33: return 'h';break; case 0x43: return 'i';break; case 0x3b: return 'j';break; case 0x42: return 'k';break; case 0x4b: return 'l';break; case 0x3a: return 'm';break; case 0x31: return 'n';break; case 0x44: return 'o';break; case 0x4d: return 'p';break; case 0x15: return 'q';break; case 0x2d: return 'r';break; case 0x1b: return 's';break; case 0x2c: return 't';break; case 0x3c: return 'u';break; case 0x2a: return 'v';break; case 0x1d: return 'w';break; case 0x22: return 'x';break; case 0x35: return 'y';break; case 0x1a: return 'z';break; case 0x45: return '0';break;//The number keys case 0x16: return '1';break; case 0x1e: return '2';break; case 0x26: return '3';break; case 0x25: return '4';break; case 0x2e: return '5';break; case 0x36: return '6';break; case 0x3d: return '7';break; case 0x3e: return '8';break; case 0x46: return '9';break; default: return 0x00; break; } } void Delay_NS(int x) { for(;x>0;x--); }