完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
做了一个ps/2键盘的接收程序
以下是说明: 当从设备向主设备发送数据时,首先检查时钟线,以确认时钟线是否为高电平。如果是高电平,从设备就可以开始传输数据;反之,从设备要等待获得总线的控制权,才能开始传输数据。传输的每一帧数据由11位组成,发送时序及每一位的含义如下图。 每一帧数据中开始位总是为0,数据校验采用奇校验方式,停止位始终为1。从设备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟下降沿读入数据线状态。 时序图如下 以下是没有校验程序的代码 外部中断函数 ***it psdata=P3^4; //数据线 ***it psclk =P3^2; //时钟线 void int0() interrupt 0 { if((numbit>0)&&(numbit<9)) { keyvalue=keyvalue>>1; //"第一次移位就是补0" X000->0X00 if(psdata) { keyvalue=keyvalue|0x80; //"头部置1,如果先置1再移位,则最后一次收了数据再移位就错了" } } numbit++; if(numbit>10) //"一帧数据11bit 0~10 numbit=11即是下一帧数据的开始位(低电平)" { numbit=0; KEY[keynum]=keyvalue; keynum++; //"KEY[0] KEY[1] KEY[2]都赋完值后 keynum=3" } } 以上程序可以运行正常,我加了奇校验的函数,如下 ***it psdata=P3^4; //数据线 ***it psclk =P3^2; //时钟线 int parity=0; void int0() interrupt 0 { if((numbit>0)&&(numbit<=9)) { if(numbit!=9) { keyvalue=keyvalue>>1; //"第一次移位就是补0" X000->0X00 if(psdata) { keyvalue=keyvalue|0x80; //"头部置1,如果先置1再移位,则最后一次收了数据再移位就错了" parity++; } } else if(psdata) //第十位校验位 { parity++; } } numbit++; if(numbit>10) //"一帧数据11bit 0~10 numbit=11即是下一帧数据的开始位(低电平)" { numbit=0; parity++; if(parity&1) //为奇数 { KEY[keynum]=keyvalue; keynum++; //"KEY[0] KEY[1] KEY[2]都赋完值后 keynum=3" } } } 但是程序就不正常了 ,请大神帮我分析一下吧
|
|
相关推荐
1 个讨论
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 11:09 , Processed in 0.409269 second(s), Total 44, Slave 32 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号