概述
通过 鼠标解读1 我们已经知道移动一次鼠标或者点击鼠标,会产生3个鼠标中断,每个中断携带1个字节数据。并且我们也知道了这3个数据的值。接下来我们来看看这3个数据分别表示什么含义。他们跟鼠标移动的距离,点击的按键又有哪些关系。
结构体定义
//鼠标解析
struct MOUSE_DEC{
unsigned char buf[3], phase;
int x, y, btn;
};
数据解析
/*
*获取鼠标3字节数据,读到3字节数据时解读它们
*mdec存储鼠标3字节数据和解读结果
*dat表示从缓冲区读来的3字节数据
*/
int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat)
{
if (mdec->phase == 0) {
//激活鼠标时鼠标回复的内容
if (dat == 0xfa) {
mdec->phase = 1;
}
return 0;
}
if (mdec->phase == 1) {
//鼠标第1字节内容
if ((dat & 0xc8) == 0x08) {
//11001000,
//判断第1个字节高4位是否在0~3范围内,
//判断第1个字节低4位是否在8~F范围内
mdec->buf[0] = dat;
mdec->phase = 2;
}
return 0;
}
if (mdec->phase == 2) {
//鼠标第2字节内容
mdec->buf[1] = dat;
mdec->phase = 3;
return 0;
}
if (mdec->phase == 3) {
//鼠标第3字节内容
mdec->buf[2] = dat;
mdec->phase = 1;
mdec->btn = mdec->buf[0] & 0x07; //得到鼠标按键状态
mdec->x = mdec->buf[1]; //鼠标x方向移动数据
mdec->y = mdec->buf[2]; //鼠标y方向移动移动
if ((mdec->buf[0] & 0x10) != 0) {
mdec->x |= 0xffffff00; //第一字节bit[4]为1时,x方向坐标高24位为1
}
if ((mdec->buf[0] & 0x20) != 0) {
mdec->y |= 0xffffff00; //第一字节bit[5]为1时,y方向坐标高24位为1
}
mdec->y = - mdec->y; //鼠标的y方向与画面符号相反
return 1;
}
return -1;//错误时mdec->phase != 0时返回
}
显示
for (;;) {
io_cli(); //查看缓冲区时,屏蔽中断
if (fifo8_status(&mousefifo) == 0) {
io_stihlt(); //如果缓冲区内无数据则开启中断并让CPU休眠,直到中断唤醒
} else {
data = fifo8_get(&mousefifo);
io_sti(); //开启中断
if (mouse_decode(&mdec, data) != 0) {
//显示解读到的鼠标数据
sprintf(str, "[lcr %4d %4d]", mdec.x, mdec.y);
if ((mdec.btn & 0x01) != 0) {
str[1] = 'L';
}
if ((mdec.btn & 0x02) != 0) {
str[3] = 'R';
}
if ((mdec.btn & 0x04) != 0) {
str[2] = 'C';
}
boxfill8(binfo->vram, binfo->scrnx, COL8_000000, 32, 16, 32 + 15 * 8 - 1, 31);
putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, str);
}
}
}