51单片机鼠标接口程序 看不懂 请大神解答
时间:10-02
整理:3721RD
点击:
就是下面程序
进入中断后
5 单片机和PS/2鼠标的软件接口
初始化时,首先由单片机向PS/2鼠标发送复位指令FFH,待收到鼠标的响应字节FAIl,AAH,00H
后即可设置鼠标的工作参数,或直接使用默认参数,最后向鼠标发送激活指令F4H,使鼠标开始工作。
待发数据包括8位指令、奇偶位、结束位,向PS/2鼠标发送1帧(11位)的子程序为:
VDid Send—to—PS2 mouse一1 frame(unsigned int v)
{unsigned char i;
bCLK=0; / 将CLK拉低,表示请求发送*/
bDAT=0; / 起始位 /
fOr(i=0;i<100;i++); / 至少100 pts*/
bCLK=1; / 释放CLK*/
for(i=0;i<11;i++) / 连续发送BO—B7、奇偶位、结束位*/
{
while(bCLK!=0); / 等待CLK变低 /
bDAT=(v& 1); / CLK变低后发送1位*/
while(bCLK!=1); / 等待CLK变高*/
v=v>>1; / 待发数据右移1位*/
}
}
从PS/2鼠标接收数据采用中断方式,每个CLK接收1位,由BitCnt作位计数,临时拼装到静态变
量Va1中,收完1帧即保存到全局变量Receive数组中,由FrameCnt作帧计数。鼠标在正常工作时,每
次报告3字节数据,所以当FrameCnt计数到3即可归0。文中给出了中断服务程序,出于简化,这里忽
略了奇偶校验位,以及帧格式错误的处理。
Void Int—Ex0(void)interrupt 0
{static unsigned char Val;
if(BitCnt>1=1& & BitCnt<=8) / 从B0到B7*/
{ V/=2; / 先移位*/
Val+=(unsigned char)(bDAT)<<7; / 读入1位*/
}
BtiCnt++; / 位计数增量 /
if(BtiCn==11) / 1帧结束*/
{ BtiCnt=0; / 位计数归0*/,
Receive[FrameCnt]=Val; / 保存接收字节*/
FrameCnt++; / 帧计数增量*/
if(FranCnt==3) / 收完3帧*/
{ FrameCnt=0; / 帧计数归0*/
if(Receive[0]&0x07 Beep(5O); / 有鼠标按键 /
mouseR+=Receive[1]; / 鼠标X位置累计*/,
mouseY+=Receive[2];
进入中断后
if(BitCnt>1=1& & BitCnt<=8) / 从B0到B7*/
{ V/=2; / 先移位*/
Val+=(unsigned char)(bDAT)<<7; / 读入1位*/
}
是什么意思左移7位?
5 单片机和PS/2鼠标的软件接口
初始化时,首先由单片机向PS/2鼠标发送复位指令FFH,待收到鼠标的响应字节FAIl,AAH,00H
后即可设置鼠标的工作参数,或直接使用默认参数,最后向鼠标发送激活指令F4H,使鼠标开始工作。
待发数据包括8位指令、奇偶位、结束位,向PS/2鼠标发送1帧(11位)的子程序为:
VDid Send—to—PS2 mouse一1 frame(unsigned int v)
{unsigned char i;
bCLK=0; / 将CLK拉低,表示请求发送*/
bDAT=0; / 起始位 /
fOr(i=0;i<100;i++); / 至少100 pts*/
bCLK=1; / 释放CLK*/
for(i=0;i<11;i++) / 连续发送BO—B7、奇偶位、结束位*/
{
while(bCLK!=0); / 等待CLK变低 /
bDAT=(v& 1); / CLK变低后发送1位*/
while(bCLK!=1); / 等待CLK变高*/
v=v>>1; / 待发数据右移1位*/
}
}
从PS/2鼠标接收数据采用中断方式,每个CLK接收1位,由BitCnt作位计数,临时拼装到静态变
量Va1中,收完1帧即保存到全局变量Receive数组中,由FrameCnt作帧计数。鼠标在正常工作时,每
次报告3字节数据,所以当FrameCnt计数到3即可归0。文中给出了中断服务程序,出于简化,这里忽
略了奇偶校验位,以及帧格式错误的处理。
Void Int—Ex0(void)interrupt 0
{static unsigned char Val;
if(BitCnt>1=1& & BitCnt<=8) / 从B0到B7*/
{ V/=2; / 先移位*/
Val+=(unsigned char)(bDAT)<<7; / 读入1位*/
}
BtiCnt++; / 位计数增量 /
if(BtiCn==11) / 1帧结束*/
{ BtiCnt=0; / 位计数归0*/,
Receive[FrameCnt]=Val; / 保存接收字节*/
FrameCnt++; / 帧计数增量*/
if(FranCnt==3) / 收完3帧*/
{ FrameCnt=0; / 帧计数归0*/
if(Receive[0]&0x07 Beep(5O); / 有鼠标按键 /
mouseR+=Receive[1]; / 鼠标X位置累计*/,
mouseY+=Receive[2];
不得不顶
研究了半天,我觉得v应该是val,印刷错误
if(BitCnt>1=1& & BitCnt<=8) / 从B0到B7*/
{ V/=2; / 先移位*/
Val+=(unsigned char)(bDAT)<<7; / 读入1位*/
}
