【#文档大全网# 导语】以下是®文档大全网的小编为您整理的《在51单片机上使用PC机ps2键盘》,欢迎阅读!
在51单片机上使用PC机ps/2键盘(附源码)
本人弄了几天,终于在今天晚上,也就是刚才实验成功,心情特佳,特写出来以享大家。单片机上应用非编码键盘,各书上均有介绍。作为实验用,我想到了用PC机的ps/2键盘。 PC机键盘内部有单片机电路来完成编码和去抖动,它按照ps/2协议来发送扫描码。因此在应用中,我们需要做的只是将扫描码与字符对应起来,大部分事情都由键盘自己完成了。
首先介绍一下键盘的接口,典型的几种接口如下图:
其中第一种用于老式键盘(我原来的键盘就是),第二种便是现在的PS/2键盘,第三个不用去管它。我的实验是按照最常用的PS/2(即第二种)来做的。
再略微介绍一下PS/2协议的相关内容。PS/2的一个数据帧为11位,时序如下:
PS/2帧的第一位是起始位,为0,然后是8位数据位,发送键盘扫描码的一个字节(扫描码为1-4个字节),然后是奇偶校验位,最后是停止位,为1。这些是在数据线(即1号引脚线)上发送的。无键按下时,数据线和始终线都保持为1。当有键按下时,时钟线CLOCK送出脉冲,同时数据线送出数据。主机(此处是89c51 MCU)在始终脉冲的下降沿对数据线采样获得数据。键盘扫描码包括通码和断码,当键按下时发送通码,抬起时发送断码。更详细的内容可参考所附的《PS/2技术参考》。 根据上述原理,我这样设计了实验:将键盘的脉冲线接至89c51的外部中断输入口(INT0或INT1),当键按下和抬起时有脉冲产生,此脉冲引发MCU中断。将键盘的DATA线连至89c51的输入口(如P1.0)。在中断处理程序中,从输入口读入数据,然后通过循环移位对读进的数据位进行处理,1(起始位)、10(奇偶校验)、11(停止位)可抛弃,如不嫌麻烦也可将奇偶校验位加以应用。当一个数据帧收完后,将处理后剩下的2-9位(即扫描码)通过串口发至PC机,通过PC机的串口监视软件(如“串口调试助手”)来查看。硬件连线和源码如下:
源码:
ORG 0000H
AJMP MAIN;转入主程序
ORG 0003H ;外部中断P3.2脚INT0入口地址 AJMP INT ;转入外部中断服务子程序 ;以下为主程序进行CPU中断方式设置
MAIN:MOV SCON,#50H;设置成串口1方式
MOV TMOD,#20H;波特率发生器T1工作在模式2上 MOV PCON,#80H;波特率翻倍为2400x2=4800BPS
MOV TH1,#0F3H;预置初值(按照波特率2400BPS预置初值) MOV TL1,#0F3H;预置初值(按照波特率2400BPS预置初值) SETB EA ;打开CPU总中断请求
SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发 SETB EX0 ;打开INT0中断请求 SJMP $
INT: CLR EA ;暂时关闭CPU的所有中断请求
CJNE R0,#0,L1 L3: INC R0 SJMP L5
L1: CJNE R0,#9,L2 SJMP L3
L2: CJNE R0,#10,L4
SETB TR1;启动定时器T1 MOV SBUF,A MOV R0,#0
L5: SETB EA ;允许中断 RETI ;退出子程序 L4: MOV C,P1.0 RRC A SJMP L3
END
搞定后,当按下和释放键时,会在PC机上显示其扫描码。
忘了说明一点,通电时键盘会自检,此时键盘上三个灯全亮,自检完成后熄灭,并向主机发送十六进制字符AA.。
本文来源:https://www.wddqxz.cn/c8df8bf06c1aff00bed5b9f3f90f76c661374ca8.html