㈠ 51单片机模拟PS2键盘,实现“A”键的连打功能!
得发送一连串的通码PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
delay_50ms();
PS2key_sendto_host(0x1c);
.
.
.
PS2key_sendto_host(0xf0);
delay_50ms();
PS2key_sendto_host(0x1c);
这样就能实现连打的功能了。
㈡ 单片机模拟ps2鼠标发送上下移动编码,发送的是什么编码,求大神指点
标准的PS/2鼠标支持下面的输入X左右位移,Y上下位移,左键、中键和右键。鼠标以一个固定的频率读取这些输入并更新不同的计数器然后标记出反映的移动和按键状态,而Microsoft的Intellimouse它既支持标准输入也支持滚轮和两个附加的按键。
标准的PS/2鼠标发送位移和按键信息给主机采用如下的3字节数据包格式:
鼠标有4个模式:Reset、Stream、Remote、Wrap,各个模式具体的介绍详见《PS2技术参考》一文,通常我们使用Stream模式,即一旦鼠标检测到位移或发现一个或多个鼠标键的状态改变了,就发送位移数据包数据报告的最大速率被认为是采样速率。参数的范围从10采样点/秒到200采样点/秒。这个参数的缺省值是100采样点/秒,主机可以用设置采样速率0xF3命令来改变它Stream模式是操作的缺省模式。
微软的Intellimouse工作起来象标准的PS/2鼠标(也就是使用3字节位移数据包,和标准PS/2鼠标一样回应所有命令,报告设备ID0x00)。要进入滚轮模式,主机应该发送如下的命令序列: 0xf3 0xc8 0xf3 0x64 0xf3 0x50
Set sample rate 200 Set sample rate 100 Set sample rate 80
主机然后应该发布“获得设备ID”命令(0xF2)并等待回应,再将ps2鼠标使能(0xf4)。如果安装的是是标准PS/2鼠标(非Intellimouse),它回应设备ID0x00。在这种情况下,主机回辨认出实际这个设备没有滚轮并继续把它当作是标准PS/2鼠标。但是,如果安装的是微软的Intellimouse,它返回的ID是0x03。这就告诉主机挂接的定点设备有滚轮并且主机认为鼠标使用4字节的位移数据包:
Z位移是2的补码表示滚轮的自上次数据报告以来的位移,有效值的范围在-8到+7这意味着数值实际只有低四位;高四位仅用作符号扩展位。
更多命令及详解,可下载:
命令集具体介绍详见《PS2技术参考》资料。
㈢ 单片机模拟ps2键盘需要驱动
不需要写上位机驱动,PS2是串行通信,只需要按照通信格式发送相应的数据就可以了。具体的呢可以查一下PS2方面的资料。
㈣ 单片机如何通过ps2向pc传输数据
第一,首先要知道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键盘解码
sbit Key_Data = P3^3 ; //定义Keyboard引脚
sbit Key_CLK = P3^2; //使用中断
bit BF=0;
bit Shift; //定义上档键标志
bit Key_UP; //定义通码断码标志
unsigned char KeyV;
unsigned char IntNum;
unsigned char DisNum;/*-----------------------------------------------
外部中断读入信息
-----------------------------------------------*/
void Keyboard_out(void) interrupt 0
{
if ((IntNum > 0) && (IntNum < 9))
{
KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
if (Key_Data)
KeyV = KeyV | 0x80; //当键盘数据线为1时到最高位
}
IntNum++;
while (!Key_CLK); //等待PS/2CLK拉高 if (IntNum > 10)
{
IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
BF = 1; //标识有字符输入完了
EA = 0; //关中断等显示完后再开中断
}
}/*-----------------------------------------------
解码信息
注意:如SHIFT+G为12H 34H F0H 34H F0H 12H
也就是说shift的通码+G的通码+shift的断码+G的断码
-----------------------------------------------*/
void Decode(unsigned char ScanCode) //
{
unsigned char TempCyc,Val;
if (!Key_UP) //当键盘按下时
{
switch (ScanCode)
{
case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
Key_UP = 1;
break; case 0x12 : // 左 SHIFT
Shift = 1;
break; case 0x59 : // 右 SHIFT
Shift = 1;
break; default:
if(!Shift) //如果SHIFT没按下
{
for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
if (UnShifted[TempCyc][0] == ScanCode)
{
Val= UnShifted[TempCyc][1];
LCD_Write_Char(DisNum%16,DisNum/16,Val);
DisNum++;
if(DisNum==33)
{
LCD_Clear(); //清屏
DisNum=0; //重头写数据
}
}
}
else //按下SHIFT
{
for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
if (Shifted[TempCyc][0] == ScanCode)
{
Val= Shifted[TempCyc][1];
LCD_Write_Char(DisNum%16,DisNum/16,Val);
DisNum++;
if(DisNum==33)
{
LCD_Clear(); //清屏
DisNum=0; //重头写数据
}
}
}
break;
}
}
else
{
Key_UP = 0;
switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
{
case 0x12 : // 左 SHIFT
Shift = 0;
break; case 0x59 : // 右 SHIFT
Shift = 0;
break;
}
}
BF = 0; //标识字符处理完了} /*-----------------------------------------------
ps2初始化(实际初始化外部中断)
-----------------------------------------------*/
void PS2_Init(void)
{
IT1 = 0; //设外部中断1为低电平触发
EA = 1; //外部中断开
EX0 = 1; //开中断
}
/*-----------------------------------------------
读取键盘值
-----------------------------------------------*/
void Read_KeyBoard(void)
{ if (BF)
Decode(KeyV);
else
EA = 1; //开中断
}
㈥ 与单片机有关的ps2键盘是什么呀
ps2键盘就是我们平常电脑用的键盘,ps2键盘实际上就是一个按键编码器,然后单片机要做的就是将ps2键盘发过来的键盘编码进行解码,最后在数码管上或是液晶上显示出来
㈦ 用51单片机实现PS2键盘输入,用LCD液晶显示
PS2数据线接在普通口还真不好办
数据线接在中断脚就很容易写啦
PS2接串口就更加方便啦
PS2键盘按键输出原理至少要弄懂
明白原理就很容易写啦
㈧ 单片机制作PS/2键盘如何初始化
/*********************************************************************/
/************************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;
}
}
㈨ 为什么ps2手柄遥控51单片机的小车,按键松开后电机还会持续驱动一段时间
单片机在使用电机的应用中,普通电机在运转时如果仃止(断电)会有一个惯性过程(所以会继续转一小段时间),使用步进电机就不会有这种现象(不过驱动程序需要有步进编码控制),普通电机要去除这个惯性过程可以在仃止(断电)时加一个短暂的反响驱动就可以(不过硬件电路需要有正反向驱动)。