PS/2键盘口通讯的监测程序源代码 Keil C51,原创。

2020-01-16 18:34发布

最近制作工控机键盘和鼠标,编程中想要查看一下通用的键盘和鼠标是如何与PC机通讯的。
于是仿照串口监控程序编写了一个PS/2监测程序。类似PS2逻辑分析仪的作用。
通过这个软件既可以读取PC机发给鼠标键盘的数据,也可以同时读取到鼠标键盘上传的数据,作对比分析PS2协议。
源码贴在这里,供开发PS2参考:

//用单片机跟踪 PS2通讯协议
//Keil C51
//MCU:89C52 @22.1184Mhz
//
//2009-3-15



//sbit H_DATA                =        P3^0;                //连接PS/2键盘插头(公头)的管脚Pin1
//sbit H_CLK                =        P3^2;                 //连接PS/2键盘插头(公头)的管脚Pin5
                                                //连接PS/2键盘插头(公头)的管脚Pin3 GND

//PS/2键盘鼠标插头(公头)朝向你自己,从左上角开始,依次是管脚5-3-1-2-4-6
//其中,Pin3是GND,Pin4是Vcc(+5V)

//CLK最大的时钟频率是33kHz ,大多数设备工作在10-20kHz,通常设计为12.5KHz (相当于串口的1200波特率)。
//
//
//


#include <reg52.h>

#define BYTE unsigned char

sbit H_DATA                =        P3^0;
sbit H_CLK                =        P3^2;
unsigned char tab_dat1[20],tab_dat2[20];
unsigned char tab_dat_i1=0,tab_dat_i2=0;




//延时
void Delay10us(void)                   //22.1184Mhz,6T
{
    unsigned char a,b;
    for(b=3;b>0;b--)
        for(a=4;a>0;a--);
}
//---------------------------------------------------------------------------
void ExternInterrupt0(void) interrupt 0
{
        bit ParityBit=0,CLKFlag=1;
        BYTE i=0,j=8,dat1=0x00, dat2=0x00;

        EX0=0;                //禁止中断

         
//读取起始位
        while(H_CLK==0);                        //等待,直到CLK为高
        //这时读DATA,应该总是=0       
        while(H_CLK==1);                        //等待,直到CLK为低        

//接收8位数据
        for(i=0;i<8;i++)//read 8bit
        {
                dat2=dat2>>1;
                if(H_DATA)dat2|=0x80;

                while(H_CLK==0);                        //等待,直到CLK为高
               
                dat1=dat1>>1;   
                if(H_DATA)dat1|=0x80;                //数据线为高电平时,最高位置1(按位或运算“1000 0000”),否则为0

                while(H_CLK==1);                        //等待,直到CLK为低
        }


        if (tab_dat_i1<20) tab_dat1[tab_dat_i1++]=dat1;
        if (tab_dat_i2<20) tab_dat2[tab_dat_i1++]=dat2;

//读取奇偶校验位                                                                                 
        while(H_CLK==0);            
        Delay10us();
        if(H_DATA)ParityBit=1;
        else ParityBit=0;
        while(H_CLK==1);
         
//读取停止位
        while(H_CLK==0);                        //等待,直到CLK为高
        //这时读DATA,应该总是=1       

               
//延时等待,因为停止位之后可能存在ASK位或者PC拉低时钟抑制通讯现象       
//最多会有2~3个周期,每个周期不超过100us
       
        for(i=0;i<5;i++)                          //循环延时,50us
        {
                if(H_CLK==0) i=0;                 //从时钟位复位之后计时
                Delay10us();
        }


        IE0=0;
        EX0=1;
        return ;
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void PS2Init(void)
{
        IT0=0;                //低电平触发中断
        PX0=1;       
        EX0=1;
        EA=1;       
}



char code dx516[3] _at_ 0x003B;                //仿真器要求的语句,指定起始地址
void main(void)
{
       
        H_CLK=1;
        H_DATA=1;

        PS2Init();                                                //开中断
        while(1);
}

使用方法:
硬件接线:将标准键盘的连接线剖开,PS2_Pin3连接MCU的GND,PS2_Pin1连接P3.0,PS2_Pin5连接P3.2;
软件,在仿真机上运行,查看数组变量的内容tab_dat1[]和tab_dat[];
没有仿真机,可以将数组内容通过RS232上传到PC的串口监控窗口查看。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。