官术网_书友最值得收藏!

7 從鼠標(biāo)接受數(shù)據(jù)(harib04g)

既然中斷已經(jīng)來了,現(xiàn)在就讓我們?nèi)〕鲋袛鄶?shù)據(jù)吧。前面已經(jīng)說過,鼠標(biāo)和鍵盤的原理幾乎相同,所以程序也就非常相似。

int.c節(jié)選

struct FIFO8 mousefifo;
void inthandler2c(int *esp)
/* 來自PS/2鼠標(biāo)的中斷 */
{
    unsigned char data;
    io_out8(PIC1_OCW2, 0x64);   /* 通知PIC1 IRQ-12的受理已經(jīng)完成 */
    io_out8(PIC0_OCW2, 0x62);   /* 通知PIC0 IRQ-02的受理已經(jīng)完成 */
    data = io_in8(PORT_KEYDAT);
    fifo8_put(&mousefifo, data);
    return;
}

不同之處只有送給PIC的中斷受理通知。IRQ-12是從PIC的第4號(hào)(從PIC相當(dāng)于IRQ-08~I(xiàn)RQ-15),首先要通知IRQ-12受理已完成,然后再通知主PIC。這是因?yàn)橹?從PIC的協(xié)調(diào)不能夠自動(dòng)完成,如果程序不教給主PIC該怎么做,它就會(huì)忽視從PIC的下一個(gè)中斷請求。從PIC連接到主PIC的第2號(hào)上,這么做OK。

■■■■■

下面的鼠標(biāo)數(shù)據(jù)取得方法,居然與鍵盤完全相同。這不是筆者的失誤,而是事實(shí)。也許是因?yàn)殒I盤控制電路中含有鼠標(biāo)控制電路,才造成了這種結(jié)果。至于傳到這個(gè)設(shè)備的數(shù)據(jù),究竟是來自鍵盤還是鼠標(biāo),要靠中斷號(hào)碼來區(qū)分。

取得數(shù)據(jù)的程序如下所示:

bootpack.c節(jié)選

fifo8_init(&mousefifo, 128, mousebuf);
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);
            putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s);
        } else if (fifo8_status(&mousefifo) ! = 0) {
            i = fifo8_get(&mousefifo);
            io_sti();
            sprintf(s, "%02X", i);
            boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 47, 31);
            putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s);
        }
    }
}

因?yàn)槭髽?biāo)往往會(huì)比鍵盤更快地送出大量數(shù)據(jù),所以我們將它的FIFO緩沖區(qū)增加到了128字節(jié)。這樣,就算是一下子來了很多數(shù)據(jù),也不會(huì)溢出。

取得數(shù)據(jù)的程序中,如果鍵盤和鼠標(biāo)的FIFO緩沖區(qū)都為空了,就執(zhí)行HLT。如果不是兩者都空,就先檢查keyinfo,如果有數(shù)據(jù),就取出一個(gè)顯示出來。如果keyinfo是空,就再去檢查mouseinfo,如果有數(shù)據(jù),就取出一個(gè)顯示出來。很簡單吧。

到底能不能執(zhí)行呢?好緊張呀。我們來測試一下。運(yùn)行“make run”。

就像上面那樣,最初只顯示鼠標(biāo)發(fā)送過來的數(shù)據(jù),且內(nèi)容的確是FA。

隨便滾動(dòng)鼠標(biāo)一下,就會(huì)像下面這樣顯示出各種各樣的數(shù)據(jù)來。

如果按下鍵盤,當(dāng)然會(huì)像以前一樣,正常響應(yīng)。

看,運(yùn)行得很正常很不錯(cuò)呀。

好了,今天我們做的事已經(jīng)不少了,就先到這吧。明天我們來解讀鼠標(biāo)數(shù)據(jù),讓鼠標(biāo)指針在屏幕上動(dòng)起來。真期待呀。啊,今天就不要再往下讀了哦。先睡覺,明天再繼續(xù),好吧?

主站蜘蛛池模板: 伊春市| 揭阳市| 攀枝花市| 永新县| 辽宁省| 洪泽县| 廊坊市| 襄汾县| 肥乡县| 曲沃县| 开远市| 汝阳县| 临邑县| 吉林省| 盐池县| 雷州市| 建阳市| 六枝特区| 鹤峰县| 丘北县| 莱西市| 育儿| 常德市| 临漳县| 克山县| 垫江县| 泽州县| 阜康市| 深州市| 武城县| 察雅县| 天长市| 连江县| 建阳市| 高淳县| 扶风县| 唐海县| 黑龙江省| 廉江市| 汉川市| 宁明县|