搜索
bottom↓
回复: 20

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

[复制链接]

出0入0汤圆

发表于 2010-3-19 16:13:52 | 显示全部楼层 |阅读模式
最近制作工控机键盘和鼠标,编程中想要查看一下通用的键盘和鼠标是如何与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的串口监控窗口查看。

出0入0汤圆

发表于 2010-3-19 18:02:50 | 显示全部楼层
标记。看看。

出0入0汤圆

发表于 2010-3-19 20:09:01 | 显示全部楼层
最近也在做这个

出0入4汤圆

发表于 2010-3-20 12:53:50 | 显示全部楼层
小蜜蜂是大连哪里的?还有个同乡!

出0入0汤圆

 楼主| 发表于 2010-3-21 13:02:41 | 显示全部楼层
回复【3楼】dadian
-----------------------------------------------------------------------

哈,辛寨子,大城市中的小乡村。

出0入4汤圆

发表于 2010-3-29 18:32:39 | 显示全部楼层
大连的不多,QQ 530883031 认识一下

出0入0汤圆

发表于 2010-5-3 20:10:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-19 08:08:14 | 显示全部楼层
MARK!!!

出0入0汤圆

发表于 2010-8-19 08:25:25 | 显示全部楼层
有用!

出0入0汤圆

发表于 2010-8-25 12:38:40 | 显示全部楼层
回复【楼主位】HONY0411 小蜜蜂
-----------------------------------------------------------------------

你好 小蜜蜂 我用51单片机做的PS2键盘 开机检测 和 发送字符 、数字 都成功了,但是发送的 带扩展码的按键扫描码  电脑接收不到(没有反应),能告知带扩展码按键(如DELETE键)的发送时序吗?

出0入0汤圆

发表于 2010-9-21 20:34:36 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-9-24 11:15:00 | 显示全部楼层
怎么用示波器检测鼠标的波形??

出0入0汤圆

发表于 2010-10-6 20:39:16 | 显示全部楼层
关注中……

出0入0汤圆

发表于 2010-10-17 21:10:09 | 显示全部楼层
找半天这东西了 真不容易

出0入0汤圆

发表于 2010-10-18 16:44:11 | 显示全部楼层
马克

出0入0汤圆

发表于 2010-10-22 14:24:19 | 显示全部楼层
做个标记 呵呵

出0入0汤圆

发表于 2010-11-22 20:22:05 | 显示全部楼层
做个标记

出0入0汤圆

发表于 2012-12-10 17:00:32 | 显示全部楼层
支持楼主

出0入0汤圆

发表于 2012-12-10 17:39:16 | 显示全部楼层
严重支持,谢谢

出0入0汤圆

发表于 2012-12-24 08:49:02 | 显示全部楼层
标记。看看。

出0入0汤圆

发表于 2016-10-31 09:42:20 | 显示全部楼层
Mark学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 22:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表