第13章 鍵盤和鼠標(biāo)操作_第1頁
第13章 鍵盤和鼠標(biāo)操作_第2頁
第13章 鍵盤和鼠標(biāo)操作_第3頁
第13章 鍵盤和鼠標(biāo)操作_第4頁
第13章 鍵盤和鼠標(biāo)操作_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、2022-5-51鍵盤操作鍵盤操作鼠標(biāo)操作鼠標(biāo)操作2022-5-52第一節(jié)第一節(jié) 鍵盤操作鍵盤操作鍵盤工作原理鍵盤工作原理鍵盤緩沖區(qū)鍵盤緩沖區(qū)鍵盤處理函數(shù)鍵盤處理函數(shù)2022-5-53一、鍵盤工作原理一、鍵盤工作原理鍵盤中有一個微處理器,可以監(jiān)測每個鍵的鍵盤中有一個微處理器,可以監(jiān)測每個鍵的按下或抬起的狀態(tài)按下或抬起的狀態(tài)當(dāng)用戶當(dāng)用戶按下按下或或抬起抬起一個鍵時,便產(chǎn)生一個中一個鍵時,便產(chǎn)生一個中斷斷(INT 9),并將該鍵的掃描碼(,并將該鍵的掃描碼(1字節(jié))送字節(jié))送入計算機(jī),由入計算機(jī),由ROM中中BIOS的中斷處理程序的中斷處理程序去處理。去處理。說明:說明:大部分鍵都會產(chǎn)生掃描碼,但

2、有些特殊鍵如大部分鍵都會產(chǎn)生掃描碼,但有些特殊鍵如PrintScreen等,只引起中斷,不產(chǎn)生掃描碼。等,只引起中斷,不產(chǎn)生掃描碼。掃描碼的掃描碼的最高位最高位(第第7位位)標(biāo)識按鍵的狀態(tài):標(biāo)識按鍵的狀態(tài):0:代表按下:代表按下1:代表抬起:代表抬起掃描碼的掃描碼的06位位記錄的是引起中斷的按鍵在記錄的是引起中斷的按鍵在鍵盤上的位置鍵盤上的位置說明:說明:掃描碼僅能區(qū)別鍵的位置以及狀態(tài)(按下或抬掃描碼僅能區(qū)別鍵的位置以及狀態(tài)(按下或抬起),不能直接區(qū)分大小寫(大小寫的掃描碼相起),不能直接區(qū)分大小寫(大小寫的掃描碼相同)和其他一些按鍵(具有雙字符功能的按鍵),同)和其他一些按鍵(具有雙字符功能

3、的按鍵),如如“8”和和“*”、“:”和和“;”。2022-5-542022-5-55按鍵種類AH的內(nèi)容AL的內(nèi)容字符鍵掃描碼ASCII碼功能鍵/組合鍵掃描碼0擴(kuò)充的鍵盤掃描碼-擴(kuò)充碼的存放格式 對于雙字符的按鍵,由于鍵盤掃描碼僅能區(qū)別鍵的位對于雙字符的按鍵,由于鍵盤掃描碼僅能區(qū)別鍵的位置以及狀態(tài)(按下或抬起),不能直接識別按的是雙置以及狀態(tài)(按下或抬起),不能直接識別按的是雙字符中的哪個字符,故鍵盤處理程序在結(jié)合了字符中的哪個字符,故鍵盤處理程序在結(jié)合了Shift、CapsLock等按鍵情況后,對掃描碼進(jìn)行了擴(kuò)充:首先等按鍵情況后,對掃描碼進(jìn)行了擴(kuò)充:首先在在AX中將其擴(kuò)充為兩個字節(jié),然后送

4、入鍵盤緩沖區(qū)。中將其擴(kuò)充為兩個字節(jié),然后送入鍵盤緩沖區(qū)。 在在AX中擴(kuò)充的這兩個字節(jié)的內(nèi)容如下表所示:中擴(kuò)充的這兩個字節(jié)的內(nèi)容如下表所示:2022-5-56二、鍵盤緩沖區(qū)二、鍵盤緩沖區(qū) 由于由于INT 9中斷和應(yīng)用程序接收鍵盤輸入不能同時進(jìn)中斷和應(yīng)用程序接收鍵盤輸入不能同時進(jìn)行,而鍵盤輸入的信息是即刻消失的,為了避免信息行,而鍵盤輸入的信息是即刻消失的,為了避免信息丟失,系統(tǒng)在內(nèi)存中定義了一個丟失,系統(tǒng)在內(nèi)存中定義了一個32字節(jié)的緩沖區(qū),專字節(jié)的緩沖區(qū),專門存儲鍵盤輸入。門存儲鍵盤輸入。 鍵盤緩沖區(qū)中,能使用的僅鍵盤緩沖區(qū)中,能使用的僅30字節(jié),可存放字節(jié),可存放15個字符個字符的擴(kuò)充碼的擴(kuò)充

5、碼(另外兩個字節(jié)用作循環(huán)隊(duì)列的頭結(jié)點(diǎn)另外兩個字節(jié)用作循環(huán)隊(duì)列的頭結(jié)點(diǎn))。 此鍵盤緩沖區(qū)是基本輸入輸出系統(tǒng)分配的,與此鍵盤緩沖區(qū)是基本輸入輸出系統(tǒng)分配的,與C編譯編譯器分配的鍵盤文件緩沖區(qū)不是同一概念。器分配的鍵盤文件緩沖區(qū)不是同一概念。兩個緩沖區(qū)之間的關(guān)系:兩個緩沖區(qū)之間的關(guān)系:2022-5-57設(shè)鍵盤輸入設(shè)鍵盤輸入: abaa的掃的掃描碼描碼bb的掃的掃描碼描碼r回車回車的掃的掃描碼描碼abn基本輸入輸出系統(tǒng)分配的鍵盤緩沖區(qū)緩沖文件系統(tǒng)分配的鍵盤緩沖區(qū)低字節(jié)高字節(jié)2022-5-58三、鍵盤處理函數(shù)三、鍵盤處理函數(shù)Turbo C在在bios.h中中提供提供了一個了一個鍵盤操作鍵盤操作函數(shù)函數(shù)b

6、ioskey(),用來,用來處理處理鍵盤輸入鍵盤輸入。(也可以用(也可以用BIOS調(diào)用或調(diào)用或DOS調(diào)用)調(diào)用)bioskey()函數(shù)函數(shù)的的原型是:原型是: int bioskey(int cmd);2022-5-59三、鍵盤處理函數(shù)三、鍵盤處理函數(shù)其中:其中:cmd有三種取值:有三種取值:0:bioskey(0)返回按鍵的鍵值(即擴(kuò)充碼),并返回按鍵的鍵值(即擴(kuò)充碼),并將緩沖區(qū)中的鍵值刪除。該值是將緩沖區(qū)中的鍵值刪除。該值是2 個字節(jié)的整數(shù)。個字節(jié)的整數(shù)。若若無無鍵按下,則該函數(shù)一直等待,直到有鍵按下。鍵按下,則該函數(shù)一直等待,直到有鍵按下。1:bioskey(1)返回按鍵的鍵值,但不刪

7、除緩沖區(qū)返回按鍵的鍵值,但不刪除緩沖區(qū)中的鍵值中的鍵值。若緩沖區(qū)為空,返回若緩沖區(qū)為空,返回0。常用來查詢是。常用來查詢是否有鍵按下(與否有鍵按下(與kbhit()的的用法相仿)。用法相仿)。2022-5-510三、鍵盤處理函數(shù)三、鍵盤處理函數(shù)2:返回一些控制鍵是否被按過的信息返回一些控制鍵是否被按過的信息(針對最(針對最近一次的按鍵)近一次的按鍵),按過的狀態(tài)由返回值的低,按過的狀態(tài)由返回值的低8 位位表示,表示,如下:如下:位含義0若為1,表示右邊Shift被按下1若為1,表示左邊Shift被按下2若為1,表示Ctrl鍵被按下3若為1,表示Alt鍵被按下4若為1,表示Scroll Lock

8、已打開5若為1,表示Num Lock已打開6若為1,表示Caps Lock已打開7若為1,表示Insert已打開2022-5-511練習(xí),編程序,接收鍵盤輸入的一個字符,并練習(xí),編程序,接收鍵盤輸入的一個字符,并檢查輔助鍵的按鍵情況檢查輔助鍵的按鍵情況例例13-1:編程,顯示用戶在鍵盤上所按鍵的掃編程,顯示用戶在鍵盤上所按鍵的掃描碼、描碼、ASCII碼和字符(若是非字符鍵,只顯碼和字符(若是非字符鍵,只顯示掃描碼),同時顯示示掃描碼),同時顯示Caps Lock、Shift和和Alt的按鍵情況。按的按鍵情況。按Esc鍵(掃描碼為鍵(掃描碼為1)結(jié)束。)結(jié)束。代碼:現(xiàn)場編程操作代碼:現(xiàn)場編程操作

9、2022-5-512練習(xí)(練習(xí)(sx13.c):定義一個數(shù)組存儲):定義一個數(shù)組存儲10個學(xué)生個學(xué)生的分?jǐn)?shù),用柱狀圖顯示每個學(xué)生的分?jǐn)?shù)(每屏的分?jǐn)?shù),用柱狀圖顯示每個學(xué)生的分?jǐn)?shù)(每屏3人),并在屏幕上設(shè)兩個按鈕用來前后翻頁人),并在屏幕上設(shè)兩個按鈕用來前后翻頁,設(shè)一個按鈕用來退出。,設(shè)一個按鈕用來退出。PNX2022-5-513課外作業(yè):將文件中讀出的學(xué)生成績用柱狀圖課外作業(yè):將文件中讀出的學(xué)生成績用柱狀圖顯示(每屏顯示(每屏3人),并在屏幕上設(shè)兩個按鈕用人),并在屏幕上設(shè)兩個按鈕用來前后翻頁;最后一瓶顯示各分?jǐn)?shù)段的比例,來前后翻頁;最后一瓶顯示各分?jǐn)?shù)段的比例,設(shè)一個按鈕用來退出程序(漢字用英文

10、代替)設(shè)一個按鈕用來退出程序(漢字用英文代替)2022-5-514第二節(jié)第二節(jié) 鼠標(biāo)操作鼠標(biāo)操作鼠標(biāo)的鼠標(biāo)的INT 33H功能調(diào)用功能調(diào)用常用鼠標(biāo)操作函數(shù)常用鼠標(biāo)操作函數(shù)鼠標(biāo)形狀的定制鼠標(biāo)形狀的定制鼠標(biāo)操作舉例鼠標(biāo)操作舉例2022-5-515一一、鼠標(biāo)的、鼠標(biāo)的INT 33H功能調(diào)用功能調(diào)用鼠標(biāo)的工作原理鼠標(biāo)的工作原理鼠標(biāo)驅(qū)動程序管理鼠標(biāo)的各種操作,時鼠標(biāo)驅(qū)動程序管理鼠標(biāo)的各種操作,時刻監(jiān)測鼠標(biāo)的動作,包括:移動刻監(jiān)測鼠標(biāo)的動作,包括:移動 和各種和各種按鍵按鍵 DOS本身不支持鼠標(biāo),要本身不支持鼠標(biāo),要使用鼠標(biāo),必須先使用鼠標(biāo),必須先安裝鼠標(biāo)驅(qū)動程序安裝鼠標(biāo)驅(qū)動程序 Windows系統(tǒng)自動安

11、裝驅(qū)動系統(tǒng)自動安裝驅(qū)動2022-5-516一一、鼠標(biāo)的、鼠標(biāo)的INT 33H功能調(diào)用功能調(diào)用鼠標(biāo)任何動作都將引發(fā)鼠標(biāo)任何動作都將引發(fā)33H中斷:中斷:每當(dāng)移動一下鼠標(biāo),或者按下每當(dāng)移動一下鼠標(biāo),或者按下(抬起)(抬起)鼠標(biāo)的按鈕,就會產(chǎn)生一次鼠標(biāo)的按鈕,就會產(chǎn)生一次33H中斷。中斷。INT 33H還可以用軟件調(diào)用還可以用軟件調(diào)用鼠標(biāo)鼠標(biāo)INT 33H調(diào)用的功能號及功能見調(diào)用的功能號及功能見表表13-3常用的調(diào)用及參數(shù)情況見常用的調(diào)用及參數(shù)情況見表表13-42022-5-517二、常用鼠標(biāo)操作函數(shù)二、常用鼠標(biāo)操作函數(shù)1、檢測驅(qū)動是否安裝并顯示按鈕個數(shù)、檢測驅(qū)動是否安裝并顯示按鈕個數(shù)#includ

12、e void mouse_test() _AX = 0; /調(diào)用調(diào)用0號功能號功能 geninterrupt(0 x33); if(_AX = -1) /若若安裝返回安裝返回-1,否則返回,否則返回0 printf(mouse installed %d buttonsn, _BX); else printf(mouse not installedn); 2022-5-518二、常用鼠標(biāo)操作函數(shù)二、常用鼠標(biāo)操作函數(shù)2、鼠標(biāo)初始化函數(shù)鼠標(biāo)初始化函數(shù)int init(int xmin, int xmax, int ymin, int ymax) _AX = 0; geninterrupt(0 x33

13、); /調(diào)用調(diào)用0號功能號功能 if(_AX = 0) return 0; / 表示鼠標(biāo)器表示鼠標(biāo)器或或驅(qū)動程序驅(qū)動程序未未安裝安裝 _AX = 7; _CX = xmin; _DX = xmax; geninterrupt(0 x33); _AX = 8; _CX = ymin; _DX = ymax; geninterrupt(0 x33); return -1; / 表示鼠標(biāo)器和驅(qū)動程序已安裝表示鼠標(biāo)器和驅(qū)動程序已安裝2022-5-519二、常用鼠標(biāo)操作函數(shù)二、常用鼠標(biāo)操作函數(shù)3、打開和關(guān)閉鼠標(biāo)光標(biāo)的函數(shù)打開和關(guān)閉鼠標(biāo)光標(biāo)的函數(shù)void cursor_on( ) / 顯示鼠標(biāo)光標(biāo)顯示鼠標(biāo)

14、光標(biāo) _AX=1; geninterrupt(0 x33);void cursor_off( ) /關(guān)閉鼠標(biāo)光標(biāo)關(guān)閉鼠標(biāo)光標(biāo) _AX=2; geninterrupt(0 x33);2022-5-520二、常用鼠標(biāo)操作函數(shù)二、常用鼠標(biāo)操作函數(shù)4、設(shè)定鼠標(biāo)光標(biāo)的位置設(shè)定鼠標(biāo)光標(biāo)的位置#include void cursor_to_xy(unsigned x, unsigned y) _AX=4; /4號功能調(diào)用號功能調(diào)用 _CX=x; _DX=y; geninterrupt(0 x33);2022-5-521二、常用鼠標(biāo)操作函數(shù)二、常用鼠標(biāo)操作函數(shù)5、 讀鼠標(biāo)位置和按鈕狀態(tài)函數(shù)讀鼠標(biāo)位置和按鈕狀態(tài)

15、函數(shù) 函數(shù)的調(diào)用方法:函數(shù)的調(diào)用方法: int main() int x=320, y=240, button=0; read_mouse(&x,&y,&button); return 0; 22二、常用鼠標(biāo)操作函數(shù)二、常用鼠標(biāo)操作函數(shù)5、 讀鼠標(biāo)位置和按鈕狀態(tài)函數(shù)讀鼠標(biāo)位置和按鈕狀態(tài)函數(shù)int read_mouse(int *px, int *py, int *pbutton) / px和和py指向存儲坐標(biāo)的變量指向存儲坐標(biāo)的變量 int x0 = *px, y0 = *py, button0 = *pbutton; do _AX = 3; geninterrupt(

16、0 x33); *px = _CX; *py = _DX; *pbutton = _BX; while(*px = x0 & *py = y0 & *pbutton = button0); switch(*pbutton) case 0: return 0; /沒有鍵被按下沒有鍵被按下 case 1: return 1; /左鍵按下左鍵按下 case 2: return 2; /右鍵按下右鍵按下 case 3: return 3; /左右鍵同時按下左右鍵同時按下 default: return 4; /其他情況其他情況 2022-5-523二、常用鼠標(biāo)操作函數(shù)二、常用鼠標(biāo)操作函

17、數(shù)上面的上面的do-while循環(huán)有問題,因?yàn)橹羔槻僮餮h(huán)有問題,因?yàn)橹羔槻僮?*px = _CX; *py = _DX; *pbutton = _BX;會使用會使用_BX寄存器,使得寄存器,使得_BX中存儲的中斷中存儲的中斷出口參數(shù)被改變。出口參數(shù)被改變。修改后的代碼應(yīng)該是:修改后的代碼應(yīng)該是:245、 讀鼠標(biāo)位置和按鈕狀態(tài)函數(shù)讀鼠標(biāo)位置和按鈕狀態(tài)函數(shù)int read_mouse(int *px, int *py, int *pbutton) / px和和py指向存儲坐標(biāo)的變量指向存儲坐標(biāo)的變量 int x0 = *px, y0 = *py, button0 = *pbutton; int

18、newx, newy,newbutton; do _AX = 3; geninterrupt(0 x33); newx = _CX; newy = _DX; newbutton=_BX; while(newx = x0 & newy = y0 & newbutton = button0); *px = newx; *py = newy; *pbutton=newbutton; switch(*pbutton) case 0: return 0; /沒有鍵被按下沒有鍵被按下 case 1: return 1; /左鍵按下左鍵按下 case 2: return 2; /右鍵按下右鍵

19、按下 case 3: return 3; /左右鍵同時按下左右鍵同時按下 default: return 4; /其他情況其他情況 2022-5-525三、鼠標(biāo)操作舉例三、鼠標(biāo)操作舉例例例13-2:利用鼠標(biāo)中斷功能作圖。要求:利用鼠標(biāo)中斷功能作圖。要求:不按鼠標(biāo)按鈕時,鼠標(biāo)形狀為一不按鼠標(biāo)按鈕時,鼠標(biāo)形狀為一“十十”字,并隨鼠字,并隨鼠標(biāo)移動標(biāo)移動僅按住左鍵,鼠標(biāo)形狀為十字和圓,移動時留下圓僅按住左鍵,鼠標(biāo)形狀為十字和圓,移動時留下圓形軌跡形軌跡僅按住右鍵,鼠標(biāo)形狀為十字和矩形,移動時留下僅按住右鍵,鼠標(biāo)形狀為十字和矩形,移動時留下矩形軌跡矩形軌跡其他情況留下點(diǎn)的軌跡其他情況留下點(diǎn)的軌跡202

20、2-5-526編程思路:編程思路:檢測鼠標(biāo)及驅(qū)動安裝否,若否,結(jié)束程序檢測鼠標(biāo)及驅(qū)動安裝否,若否,結(jié)束程序初始化鼠標(biāo)位置及移動范圍初始化鼠標(biāo)位置及移動范圍在屏幕中心顯示鼠標(biāo)形狀在屏幕中心顯示鼠標(biāo)形狀檢測鼠標(biāo)的移動和按鈕的狀態(tài)檢測鼠標(biāo)的移動和按鈕的狀態(tài) 若僅位置移動,將原來的鼠標(biāo)形狀消除,在新位若僅位置移動,將原來的鼠標(biāo)形狀消除,在新位置重新顯示鼠標(biāo)(十字形狀)置重新顯示鼠標(biāo)(十字形狀) 若有按鈕按下若有按鈕按下 若在若在quit處按下,則退出程序處按下,則退出程序 不在不在quit處:處: 左鍵:消除原位置鼠標(biāo),新位置顯示鼠標(biāo),并畫一圓左鍵:消除原位置鼠標(biāo),新位置顯示鼠標(biāo),并畫一圓 右鍵:消除原位置鼠標(biāo),新位置顯示鼠標(biāo),并畫一矩形右鍵:消除原位置鼠標(biāo),新位置顯示鼠標(biāo),并畫一矩形 其他:消除原位置鼠標(biāo),新位置顯示鼠標(biāo)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論