EDN首页   博客首页

日志档案

发表于 2007-11-21 20:52:36

0

标签: 无标签

PS/2键盘与单片机

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;        //打开中断

}

系统分类: 接口电路   |   用户分类: 无分类   |   来源: 无分类   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(592)    回复(1)  

投一票您将和博主都有获奖机会!