微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机驱动PS/2键盘

单片机驱动PS/2键盘

时间:11-09 来源:互联网 点击:

#include "ps2.h"

const uchar unshifted[][2]=//shift键没按下译码表
{
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,/,
0x54,[,
0x55,=,
0x5b,],
0x5d,//,
0x61,<,
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
};
const uchar shifted[][2]= //shift键按下译码表
{
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,+,
0x5b,},
0x5d,|,
0x61,>,
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
};

void init_ps2()
{
ADCON1=0X07;//A口为普通IO
TRISA1=1 ;
INTCON=0 ;
INTEDG=1 ;
INTE=1 ;
PEIE=1 ;
GIE=1 ;
}

uchar ps_decoding(uchar data,uchar shift)
{
uchar temp ,i=0;
if(shift)
{
while(i!=255)
{
if(shifted[i][0]==data)
{
temp=shifted[i][1] ;
break ;
}
i++ ;
}
}
else
{
while(i!=255)
{
if(unshifted[i][0]==data)
{
temp=unshifted[i][1] ;
break ;
}
i++ ;
}
}
return temp ;
}

主程序:

#include "main.h"
#include "t232.h"
#include "ps2.h"

ps2_frame ps_frame ;
void interrupt main_int()
{
if(INTF)//下降沿触发
{
GIE=0 ;
INTF=0 ;
switch(ps_frame.state)
{
case PS_IDLE :
if(!PS_DATA)
{
ps_frame.ready=0 ;
ps_frame.state=PS_START ;
ps_frame.temp = 1 ;
ps_frame.count = 0 ;
ps_frame.data=0 ;
}
else
ps_frame.state=PS_IDLE ;
break ;
case PS_START :
if(PS_DATA)
{
ps_frame.data=ps_frame.data|ps_frame.temp ;
ps_frame.count++ ;
}
ps_frame.temp=ps_frame.temp<1 ;
if(!ps_frame.temp)
ps_frame.state=PS_PARITY ;
break ;
case PS_PARITY :
ps_frame.parity=PS_DATA ;
ps_frame.state=PS_STOP ;
break ;
case PS_STOP :
if(PS_DATA)
{
if(ps_frame.parity)
{
if(ps_frame.count%2==0)
ps_frame.ready=1 ;

}
else
{
if(ps_frame.count%2==1)
ps_frame.ready=1 ;
}
switch(ps_frame.data)//处理通码和断码
{
case 0xF0 :
ps_frame.down=0 ;
ps_frame.ready=0 ;
break ;
case 0x12 :
if(!ps_frame.down)
ps_frame.shift=0 ;
else
ps_frame.shift=1 ;
ps_frame.ready=0 ;
break ;
case 0x59 :
if(!ps_frame.down)
ps_frame.shift=0 ;
else
ps_frame.shift=1 ;
ps_frame.ready=0 ;
break ;
default :
if(!ps_frame.down)
{
ps_frame.ready=0 ;
ps_frame.down=1 ;
}
break ;
}
}

ps_frame.state = PS_IDLE ;
break ;
default :
break ;
}
}
GIE=1 ;
}

void init_all()
{
init_232() ;
init_ps2() ;
ps_frame.state = PS_IDLE ;
ps_frame.shift=0 ;
ps_frame.down = 0 ;
}
void main()
{
const char str[]= "hello world !" ;
uchar temp ;
init_all() ;

send_str(str) ;//测试串口
while(1)
{
if(ps_frame.ready)
{
temp=ps_decoding(ps_frame.data,ps_frame.shift) ;

put_char(temp) ;
ps_frame.ready=0 ;
}
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top