原创 PS/2键盘与单片机

2007-11-21 20:52 2313 6 6 分类: 通信

pdfpdf


 


rar


上面是部分PS2资料,电脑上还有点,下次再传...


 


下面是我写的 程序,有点乱,没有整理,之前有事,做了一半就没继续,不过程序可以用.


#include
#include
#include
#include


sbit ACC7=ACC^7;                     
sbit DATA="P3"^0;  //数据线     可以用串口直接接收 ????????????
sbit SCK="P3"^2;   //时钟线
unsigned char flag,getdata,F0_flag,E1_flag,E0_flag,NUM,CAP,shift_flag,lcd,a=0,b=0;
unsigned int j[6];
unsigned char  s[8],f[8];//显示键盘码用


                                    //用中断方式接收数据
void sentdata(unsigned char input); //模拟串口 向键盘发送数据,主机发送函数
void sdelay(unsigned char i);     //短延时程序*
void get_key(unsigned char key);  //键码处理函数
void first_flag(void);   //键码初始处理


 


void main(void)           //////主函数
{
unsigned char k,h;
DelayMs(100);   //启动等待,等LCM进入工作状态
Lcd_Ini();
EX0=1;          //开中断
IT0=1;          //下降沿开始读取数据
EA=1;



sentdata(0xf4);     //复位键盘


delay(1);  // 延时一段时间,不然数据会乱!!!!?????????
//sentdata(0xed);   //准备打开LED状态
//delay(1);
//sentdata(0x02);    //LED状态



while(1)
{



if(j[0]==0x77)
{
sentdata(0xed);   //准备打开LED状态
delay(1);
sentdata(0x02);    //LED状态 打开
}
if(j[2]==0x77)
{
sentdata(0xed);   //准备打开LED状态
delay(1);
sentdata(0x00);    //LED状态  关闭 NUM


}


sprintf(s,"%02x%02x%02x",j[0],j[1],j[2]);



for(k=0;k<6;k++)
{
LcdWriteData(s[k],k);


}


sprintf(f,"%02x%02x%02x",j[3],j[4],j[5]);
for(h=0;h<6;h++)
{
LcdWriteData(f[h],h+6);


}


//LcdWriteCommand(0x01,1);//清屏
}
}
void receivedata()interrupt 0//中断函数     接收数据函数
{
unsigned char end,n;


EX0=0;
switch(a) //11数据位
{
case 0: a++;break;//起始位
case 9: a++;break;//校验位
case 10:
        a="0";
        end="1";    //置接收到数据标志位
        break;//停止位
case 1:          //数据位8
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8: getdata>>=1;
        ACC="getdata";
        ACC7=DATA;
        getdata="ACC";  //数据到getchar中
  a++;
     break;
default: break;
}


EX0=1;//开中断0
if(end==1)
  {
  end=0;
  j[n]=getdata;
  flag=1;
  n++;
  if(n==6)
  n=0;
    
     }


}



void sdelay(unsigned char i)     //短延时程序*
     {
       while(--i);                      //刚好两个指令周期。
      }



void sentdata(unsigned char input) //模拟串口 向键盘发送数据,主机发送函数
{
unsigned char i="8",chek;
EX0=0;    //关闭外部中断0
SCK=0;
sdelay(150);//将时钟线拉低100US
DATA=0;//起始位
SCK=1;         //释放时钟
while(i--)//准备发送8位数据
{
while(SCK);//等待时钟变低
DATA=(bit)(input&0x01);
if(DATA)chek++;
while(!SCK);//等待时钟变高
input=input>>1;
}
while(SCK);//准备发送校验位
switch(chek)
{
case 0:
case 2:
case 4:
case 6: DATA="1";break;//奇校验
case 1:
case 3:
case 5:
case 7: DATA="0";break;//奇校验
default :break;
}
while(!SCK);//等待时钟变高
while(SCK);
DATA=1;//发送停止位,停止位为1
while(!SCK);//等待时钟变高
while(SCK);           //PS/2发送ACK位,为低
while(!SCK);//等待时钟变高
while(SCK);              //让过一个下降沿
            
              //数据发送完毕
EX0=1;        //打开中断


}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /3 下一条