因仑“3+1”工程特种兵精英论坛

标题: MSP430学习笔记_____PS2键盘解码 [打印本页]

作者: SDC158477392    时间: 2014-8-7 19:38
标题: MSP430学习笔记_____PS2键盘解码

PS2键盘解码的基本原理是通过外部中断读取键盘输出的串行信号,在根据扫描码进行查表解码。键盘发送往主机的信号总是在时钟的下降沿因此此中断是在下降沿触发,且时钟信号是由键盘给出,因此使用P1口中断(已经在初始化端口时设置)。发送的数据位11位,第一位是起始位,总为0,紧接是8个数据位,然后是奇校验位,最后是停止位总为1.

     本程序只能对基本按键(即键被按下时产生三个字节的扫描码的按键)做出解码,包括所有的可显示字符键和Table,Back Space和Ente三个特殊功能键。基本按键的扫描码由三个字节组成,第1个字节为接通码,第2、3字节为断开码;其中第1字节和第3字节相同,中间字节为断开标志0xf0。例如:通码和断码是以什么样的序列发送到你的计算机使得字符G 出现在你的字处理软件里呢?因为这是一个大写字母需要发生这样的事件次序按下Shift 键按下G 键释放G 键释放Shift 键,与这些时间相关的扫描码如下:Shift 键的通码12h G键的通码34h G 键的断码F0h 34h Shift 键的断码F0h 12h 因此发送到你的计算机的数据应该是12h 34h F0h 34h F0h 12h如果按键按着不放会连续发送通码命令,可以连续显示字符(没有验证,实验验证是可以的)。

      具体的说明都已经在程序中做了注释,主程序,中断服务函数中读取键盘发送的值:


[cpp] view plaincopyprint?




解码程序PS2Keyboard.C:


[cpp] view plaincopyprint?




需要查的表PS2Keyboardcode.h


[cpp] view plaincopyprint?


  • //不按Shift的字符对应的编码  
  • const unsigned char unshifted[][2] =   
  • {  
  •     0x0d,9,     //Table  
  •     0x0e,'`',  
  •     0x15,'q',  
  •     0x16,'1',  
  •     0x1a,'z',  
  •     0x1b,'s',  
  •     0x1c,'a',  
  •     0x1d,'w',  
  •     0x1e,'2',  
  •     0x21,'c',  
  •     0x22,'x',  
  •     0x23,'d',  
  •     0x24,'e',  
  •     0x25,'4',  
  •     0x26,'3',  
  •     0x29,' ',  
  •     0x2a,'v',  
  •     0x2b,'f',  
  •     0x2c,'t',  
  •     0x2d,'r',  
  •     0x2e,'5',  
  •     0x31,'n',  
  •     0x32,'b',  
  •     0x33,'h',  
  •     0x34,'g',  
  •     0x35,'y',  
  •     0x36,'6',  
  •     0x39,',',  
  •     0x3a,'m',  
  •     0x3b,'j',  
  •     0x3c,'u',  
  •     0x3d,'7',  
  •     0x3e,'8',  
  •     0x41,',',  
  •     0x42,'k',  
  •     0x43,'i',  
  •     0x44,'o',  
  •     0x45,'0',  
  •     0x46,'9',  
  •     0x49,'.',  
  •     0x4a,'/',  
  •     0x4b,'l',  
  •     0x4c,';',  
  •     0x4d,'p',  
  •     0x4e,'-',  
  •     0x52,0x27,  
  •     0x54,'[',  
  •     0x55,'=',  
  •     0x5a,13,     //Enter  
  •     0x5b,']',  
  •     0x5d,0x5c,  
  •     0x61,'<',  
  •     0x66,8,  //Back Space  
  •     0x69,'1',  
  •     0x6b,'4',  
  •     0x6c,'7',  
  •     0x70,'0',  
  •     0x71,',',  
  •     0x72,'2',  
  •     0x73,'5',  
  •     0x74,'6',  
  •     0x75,'8',  
  •     0x79,'+',  
  •     0x7a,'3',  
  •     0x7b,'-',  
  •     0x7c,'*',  
  •     0x7d,'9',  
  •     0,0  
  • };  
  •   
  • //按住Shift后字符对应的编码  
  • const unsigned char shifted[][2] =   
  • {  
  •     0x0d,9,     //Table  
  •     0x0e,'~',  
  •     0x15,'Q',  
  •     0x16,'!',  
  •     0x1a,'Z',  
  •     0x1b,'S',  
  •     0x1c,'A',  
  •     0x1d,'W',  
  •     0x1e,'@',  
  •     0x21,'C',  
  •     0x22,'X',  
  •     0x23,'D',  
  •     0x24,'E',  
  •     0x25,'$',  
  •     0x26,'#',  
  •     0x29,' ',  
  •     0x2a,'V',  
  •     0x2b,'F',  
  •     0x2c,'T',  
  •     0x2d,'R',  
  •     0x2e,'%',  
  •     0x31,'N',  
  •     0x32,'B',  
  •     0x33,'H',  
  •     0x34,'G',  
  •     0x35,'Y',  
  •     0x36,'^',  
  •     0x39,'L',  
  •     0x3a,'M',  
  •     0x3b,'J',  
  •     0x3c,'U',  
  •     0x3d,'&',  
  •     0x3e,'*',  
  •     0x41,'<',  
  •     0x42,'K',  
  •     0x43,'I',  
  •     0x44,'O',  
  •     0x45,')',  
  •     0x46,'(',  
  •     0x49,'>',  
  •     0x4a,'?',  
  •     0x4b,'L',  
  •     0x4c,':',  
  •     0x4d,'P',  
  •     0x4e,'_',  
  •     0x52,'"',  
  •     0x54,'{',  
  •     0x55,'+',  
  •     0x5a,13,    //Enter  
  •     0x5b,'}',  
  •     0x5d,'|',  
  •     0x61,'>',  
  •     0x66,8,     //Back Space  
  •     0x69,'1',  
  •     0x6b,'4',  
  •     0x6c,'7',  
  •     0x70,'0',  
  •     0x71,',',  
  •     0x72,'2',  
  •     0x73,'5',  
  •     0x74,'6',  
  •     0x75,'8',  
  •     0x79,'+',  
  •     0x7a,'3',  
  •     0x7b,'-',  
  •     0x7c,'*',  
  •     0x7d,'9',  
  •     0,0  
  • };  




作者: hxh    时间: 2014-8-7 19:54
牛逼啊,我得好好看看
作者: 张衍波    时间: 2014-8-8 13:44
大赞,,楼主辛苦




欢迎光临 因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4