鼠标解读1

在通过鼠标中断获取到鼠标数据后,想到的第一件事情应该是怎么去解析它。最终通过解析的数据实现鼠标指针的移动

经过调查,我们知道一下两点:

  • 鼠标正确的数据从 0xfa 开始

  • 鼠标数据是每3个一组循环

代码实现

unsigned char mouse_dbuf[3];
unsigned char mouse_phase = 0;

fifo8_init(&mousefifo, 128, mousebuf);

init_keyboard();
enable_mouse();

static int count = 0;

for (;;) {
    io_cli();
    if(fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == 0){
        io_stihlt();
    } else {
        if(fifo8_status(&keyfifo) != 0){
            i = fifo8_get(&keyfifo);
            io_sti();
            sprintf(s, "%02x", i);
            boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31);
            putfont8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s);
        } else if(fifo8_status(&mousefifo) != 0){
            count++;
            i = fifo8_get(&mousefifo);
            io_sti();
            if(mouse_phase == 0){
                if(i == 0xfa){          //开始解析鼠标的数据
                    mouse_phase = 1;
                }
            } else if(mouse_phase == 1) {
                //等待鼠标的第一个字节
                mouse_dbuf[0] = i;
                mouse_phase = 2;
            } else if(mouse_phase == 2) {
                //等待鼠标的第二个字节
                mouse_dbuf[1] = i;
                mouse_phase = 3;
            } else if(mouse_phase == 3) {
                //等待鼠标的第三个字节
                mouse_dbuf[2] = i;
                mouse_phase = 1;
            }

            sprintf(s, "%02x %02x %02x %d", mouse_dbuf[0], mouse_dbuf[1], mouse_dbuf[2], count);
            boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 12 * 8 - 1, 31);
            putfont8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s);
        }
    }
}

运行效果

这里写图片描述

遇到的问题

    fifo8_init(&mousefifo, 128, mousebuf);

    //键盘fifo的初始化,一定要在启用鼠标之前。否则解析数据出错

    init_keyboard();
    enable_mouse();

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值