//======头文件=====// #ifndef _PS2_H #define _PS2_H #define PS2_CLK PTJ_PTJ1 #define PS2_RW PORTA_PA1 typedef struct PS2_ValueType { char PS2_ValueData; /* 码表 Num :77 /:E04A *:7C -:7B 7: 6C 8:75 9:7D +:79 4: 6B 5:73 6:74 +:79 1: 69 2:72 3:7A Enter:E05A 0: 70 .:71 */ /* 对应返回值 Num :-5 /:-4 *:7C -:-2 7: 7 8:8 9:9 +:-1 4: 4 5:5 6:6 +:-1 1: 1 2:2 3:3 Enter:10 0: 0 .:-3 空格 -6 */ unsigned char PS2_ValueKind; //0 按下,1松手 }PS2_ValueType; #endif _PS2_H //==============================C文件===================// #include "S2.h" #include "MC9S12XS128.h" //extern unsigned char PS2_Buffer[3]; //extern unsigned char PS2_StopCodeFlag=0; //从PS/2中获取一个按键 unsigned char PS2_GetData(void) { unsigned char temp,i,res; for(i=0;i<11;i++) { while(PS2_CLK); if(i>0 && i<9) { res=res>>1; if(PS2_RW) { res=res|0x80; } } while (!PS2_CLK); } return res; } void Key_Interrupt(void) { //DDRJ=0X00; PIEJ_PIEJ1=1; PPSJ_PPSJ1=0; } void PS2_InsertBuffer(unsigned char *buffer,unsigned char bufferdata) { unsigned char *tempdata=buffer+1; (*buffer++)=(*tempdata++); (*buffer++)=(*buffer++); (*buffer)=bufferdata; } void PS2_GetChar(PS2_ValueType *PS2_Value) { unsigned char temp; temp=PS2_GetData(); (*PS2_Value).PS2_ValueKind=0; if(temp!=0xe0 && temp!=0xf0) { switch (temp) { /* 对应返回值 Num :-6 /:-4 *:-5 -:-2 7: 7 8:8 9:9 +:-1 4: 4 5:5 6:6 +:-1 1: 1 2:2 3:3 Enter:10 0: 0 .:-3 */ case 0x70 : (*PS2_Value).PS2_ValueData=0; return; case 0x69 : (*PS2_Value).PS2_ValueData=1; return; case 0x72 : (*PS2_Value).PS2_ValueData=2; return; case 0x7A : (*PS2_Value).PS2_ValueData=3; return; case 0x6B : (*PS2_Value).PS2_ValueData=4; return; case 0x73 : (*PS2_Value).PS2_ValueData=5; return; case 0x74 : (*PS2_Value).PS2_ValueData=6; return; case 0x6C : (*PS2_Value).PS2_ValueData=7; return; case 0x75 : (*PS2_Value).PS2_ValueData=8; return; case 0x7D : (*PS2_Value).PS2_ValueData=9; return; case 0x71 : (*PS2_Value).PS2_ValueData=-3; return; case 0x79 : (*PS2_Value).PS2_ValueData=-1; return; case 0x7B : (*PS2_Value).PS2_ValueData=-2; return; case 0x7C : (*PS2_Value).PS2_ValueData=-5; return; case 0x77 : (*PS2_Value).PS2_ValueData=-6; return; case 0x66 : (*PS2_Value).PS2_ValueData=-7; return; } } else if(temp==0xe0) { temp=PS2_GetData(); if(temp==0xf0) { temp=PS2_GetData(); (*PS2_Value).PS2_ValueKind=1; if(temp==0x5A) { (*PS2_Value).PS2_ValueData=10; return; } else if(temp==0x4A) { (*PS2_Value).PS2_ValueData=-4; return; } } else { (*PS2_Value).PS2_ValueKind=0; if(temp==0x5A) { (*PS2_Value).PS2_ValueData=10; return; } else if(temp==0x4A) { (*PS2_Value).PS2_ValueData=-4; return; } } } else if (temp==0xf0) { (*PS2_Value).PS2_ValueKind=1; temp=PS2_GetData(); switch (temp) { /* 对应返回值 Num :-6 /:-4 *:-5 -:-2 7: 7 8:8 9:9 +:-1 4: 4 5:5 6:6 +:-1 1: 1 2:2 3:3 Enter:10 0: 0 .:-3 空格 -7 */ case 0x70 : (*PS2_Value).PS2_ValueData=0; return; case 0x69 : (*PS2_Value).PS2_ValueData=1; return; case 0x72 : (*PS2_Value).PS2_ValueData=2; return; case 0x7A : (*PS2_Value).PS2_ValueData=3; return; case 0x6B : (*PS2_Value).PS2_ValueData=4; return; case 0x73 : (*PS2_Value).PS2_ValueData=5; return; case 0x74 : (*PS2_Value).PS2_ValueData=6; return; case 0x6C : (*PS2_Value).PS2_ValueData=7; return; case 0x75 : (*PS2_Value).PS2_ValueData=8; return; case 0x7D : (*PS2_Value).PS2_ValueData=9; return; case 0x71 : (*PS2_Value).PS2_ValueData=-3; return; case 0x79 : (*PS2_Value).PS2_ValueData=-1; return; case 0x7B : (*PS2_Value).PS2_ValueData=-2; return; case 0x7C : (*PS2_Value).PS2_ValueData=-5; return; case 0x77 : (*PS2_Value).PS2_ValueData=-6; return; case 0x66 : (*PS2_Value).PS2_ValueData=-7; return; } } } 点击此处下载 ourdev_716935F63Z4Y.rar(文件大小:1K) (原文件名S2.rar) |
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) | Powered by Discuz! X3.4 |