鼠标解读2

概述

通过 鼠标解读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);  
        }  
    }  
}

运行效果

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值