/*********************************************************************/
/************************PS2 Command Process**************************/
/*********************************************************************/
void receive_process ( )
{
uchar command;
if ( !Check_command( ) ) return;
command = PS2_Recbyte ( );
if ( !command ) return;
switch( command )
{
case 0xff: // reset command
ps2_send ( 0xfa );
reset ( );
break;
case 0xfe: // re-send command
ps2_send ( 0xfa );
re_send ( );
break;
case 0xf6: // Set default
ps2_send ( 0xfa );
scan_on=1;
break;
case 0xf5: // Set default and Disable Keyboard
LED_ALARM = 0;
ps2_send ( 0xfa );
scan_on=0;
break;
case 0xf4: // Enable Keyboard
ps2_send ( 0xfa );
scan_on=1;
break;
case 0xf3: // Set Typematic Rate/Delay
ps2_send ( 0xfa );
break;
case 0xf2: // Read ID
ps2_send ( 0xfa );
ps2_send ( 0xAB );
ps2_send ( 0x83 );
break;
case 0xee: // respond command
ps2_send ( 0xee );
case 0xed: // set/reset led status command
ps2_send ( 0xfa );
receive_led ( );
break;
case 0x00:
ps2_send ( 0xfe );
break;
default:
ps2_send ( 0xfa ); // other command, just send a response of 0xFA
break;
}
}
部分编码如下:
0x1C, 'a',
0x32, 'b',
0x21, 'c',
0x23, 'd',
0x24, 'e',
0x2B, 'f',
0x34, 'g',
0x33, 'h',
0x43, 'i',
0x3B, 'j',
0x42, 'k',
0x4B, 'l',
0x3A, 'm',
0x31, 'n',
0x44, 'o',
0x4D, 'p',
0x15, 'q',
0x2D, 'r',
0x1B, 's',
0x2C, 't',
0x3C, 'u',
0x2A, 'v',
0x1D, 'w',
0x22, 'x',
0x35, 'y',
0x1A, 'z',
0x45, '0',
0x16, '1',
0x1E, '2',
0x26, '3',
0x25, '4',
0x2E, '5',
0x36, '6',
0x3D, '7',
0x3E, '8',
0x46, '9',
0x0E, '`',
0x4E, '-',
0x55, '=',
0x5D, '\\',
0x29, ' ',
0x54, '[',
0x5B, ']',
0x4C, ';',
0x52, '\'',
0x41, ',',
0x49, '.',
0x4A, '/',
0x71, '.',
0x70, '0',
0x69, '1',
0x72, '2',
0x7A, '3',
0x6B, '4',
0x73, '5',
0x74, '6',
0x6C, '7',
0x75, '8',
0x7D, '9',
0x1C, 'A',
0x32, 'B',
0x21, 'C',
0x23, 'D',
0x24, 'E',
0x2B, 'F',
0x34, 'G',
0x33, 'H',
0x43, 'I',
0x3B, 'J',
0x42, 'K',
0x4B, 'L',
0x3A, 'M',
0x31, 'N',
0x44, 'O',
0x4D, 'P',
0x15, 'Q',
0x2D, 'R',
0x1B, 'S',
0x2C, 'T',
0x3C, 'U',
0x2A, 'V',
0x1D, 'W',
0x22, 'X',
0x35, 'Y',
0x1A, 'Z',
0x45, '0',
0x16, '1',
0x1E, '2',
0x26, '3',
0x25, '4',
0x2E, '5',
0x36, '6',
0x3D, '7',
0x3E, '8',
0x46, '9',
0x0E, '~',
0x4E, '_',
0x55, '+',
0x5D, '|',
0x29, ' ',
0x54, '{',
0x5B, '}',
0x4C, ':',
0x52, '"',
0x41, '',
0x49, '',
0x4A, '?',
0x71, '.',
0x70, '0',
0x69, '1',
0x72, '2',
0x7A, '3',
0x6B, '4',
0x73, '5',
0x74, '6',
0x6C, '7',
0x75, '8',
0x7D, '9',
ps2键盘就是我们平常电脑用的键盘,ps2键盘实际上就是一个按键编码器,然后单片机要做的就是将ps2键盘发过来的键盘编码进行解码,最后在数码管上或是液晶上显示出来
第一,首先要知道PS/2接口跟PC是怎样连的。PC里的ps/2一般接键盘或鼠标。
PS/2的针脚
:
6*
u
*5
4*
*3
2*
*1
1
n/c
不连
2
DATA
KeyData-
3
VCC
Power,+5VDC
电源5伏
4
GND
GND
地线
5
n/c
不连
6
CLK
Clock-
时钟线
接线黄、红、白、绿对应的针脚如下
键盘
鼠标
黄
蓝
3
红
橙
4
白
白
6
绿
绿
2
接下来,你要知道数据是怎样经过ps/2接口传输到pc的?
数据是变成了2进制数后经过ps/2接口传递到PC的,常用串行方式传递数据。
所以单片机要用串行方式和ps/2通讯。即单片机的TXD做移位脉冲,接PS/2的6脚;RXD是数据线,接PS/2的2脚.
还不明白给hychyc_2008发消息。
ps2是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.。
以上取自某网页。
ps2单片机的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:ps2单片机