1.鼠标数据的解读
每次发生中断,鼠标会向cpu发送数据,第一次发送的数据是0xfa,也就是激活鼠标的返回信息。
每次从鼠标那里传来的信息是以3个字节为一组,因此,当数据累计到3个字节的时候,我们就把这些信息显示在屏幕上,并且记得将最初读到的0xfa舍弃。
打开harib05a 在HariMain中进行一些修改:
接收的数据存放在mouse_dbuf中,mouse_phase用于记录接收数据的进度,随着接收数据数量的变化,mouse_phase的值也会发生变化,并且根据mouse_phase的值将数据写入mouse_dbuf中的不同位置。
unsigned char mouse_dbuf[3], mouse_phase;
最后将mouse_dbuf的数据写入内存中。
我们试着make run一下:
28 25 FD是接收到的3个鼠标数据,其中第一个和鼠标的点击有关,第二个和鼠标的左右移动有关,第三个和鼠标的上下移动有关。
2.整理HariMain
作者创建了一个结构体MOUSE_DEC 把解读鼠标所需要的变量归结到一起。
在激活鼠标的最后:
将medc->phase 置为0等待0xfa数据传送过来。
在HariMain中在声明一个结构体就可以
这样我们将鼠标数据的处理从HariMain中剥离出来,不至于我们的主函数过长。
make run以后正常运行。
3.鼠标信息的解读
对结构体进行修改,增加了几个变量用于存放解读的结果。
x,y, btn 分别用于存放移动的信息和鼠标的移动状态。
另外作者增加了一个判断,用于判断第一字节对移动有反应的部分是否在0~3的范围内,同时判断第一字节对点击有反应的部分是否在8 ~F范围内,如果这个字节的数据不在以上范围内,它就会被舍弃。
这样做的原因是鼠标连线可能存在接触不良或者即将断线的可能,这样就会产生不该有的数据丢失,这样一来就会产生数据错位,一旦错位,那么就不能顺利解读信息。
最后的if(medc->phase ==3)语句是解读出来的核心:
键盘鼠标键的状态放在buuf[0]的低三位,我们只取出这三位,0x07相当于二进制的00000111。
x和y基本上是使用buf[1]和buf[2] 但是要和buf[0]的对鼠标移动有反应的几位。
因为鼠标与屏幕的y方向正好相反,因此最后对y符号进行了取反操作。
这样就完成了鼠标信息的解读,现在再修改显示部分:
其中三个if语句用于判断三个状态,三个状态分别对应lcr三个字母,当相应状态发生变化时,会变成大写字母。
make run一下:
测验后,l对应的是鼠标左键,c对应的是鼠标的滑轮,r对应的是鼠标的右键。
4.移动鼠标指针
增加鼠标指针能够移动,原理是将原来的鼠标指针和坐标值用背景色覆盖,再通过新的鼠标坐标绘制鼠标指针。
make run一下:
鼠标指针能够正常移动!
今天的内容就是这样啦,在第八天还有讲解32位模式的一些细节,今天就来不及讨论了。
收工