第13章鍵盤和鼠標操作_第1頁
第13章鍵盤和鼠標操作_第2頁
第13章鍵盤和鼠標操作_第3頁
第13章鍵盤和鼠標操作_第4頁
第13章鍵盤和鼠標操作_第5頁
已閱讀5頁,還剩23頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、2022-4-91鍵盤操作鍵盤操作鼠標操作鼠標操作2022-4-92第一節第一節 鍵盤操作鍵盤操作鍵盤工作原理鍵盤工作原理鍵盤緩沖區鍵盤緩沖區鍵盤處理函數鍵盤處理函數2022-4-93一、鍵盤工作原理一、鍵盤工作原理鍵盤中有一個微處理器,可以監測每個鍵的鍵盤中有一個微處理器,可以監測每個鍵的按下或抬起的狀態按下或抬起的狀態當用戶當用戶按下按下或或抬起抬起一個鍵時,便產生一個中一個鍵時,便產生一個中斷斷(INT 9),并將該鍵的掃描碼(,并將該鍵的掃描碼(1字節)送字節)送入計算機,由入計算機,由ROM中中BIOS的中斷處理程序的中斷處理程序去處理。去處理。說明:說明:大部分鍵都會產生掃描碼,但

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

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

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

5、碼(另外兩個字節用作循環隊列的頭結點另外兩個字節用作循環隊列的頭結點)。 此鍵盤緩沖區是基本輸入輸出系統分配的,與此鍵盤緩沖區是基本輸入輸出系統分配的,與C編譯編譯器分配的鍵盤文件緩沖區不是同一概念。器分配的鍵盤文件緩沖區不是同一概念。兩個緩沖區之間的關系:兩個緩沖區之間的關系:2022-4-97設鍵盤輸入設鍵盤輸入: abaa的掃的掃描碼描碼bb的掃的掃描碼描碼r回車回車的掃的掃描碼描碼abn基本輸入輸出系統分配的鍵盤緩沖區緩沖文件系統分配的鍵盤緩沖區低字節高字節2022-4-98三、鍵盤處理函數三、鍵盤處理函數Turbo C在在bios.h中中提供提供了一個了一個鍵盤操作鍵盤操作函數函數b

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

7、除緩沖區返回按鍵的鍵值,但不刪除緩沖區中的鍵值中的鍵值。若緩沖區為空,返回若緩沖區為空,返回0。常用來查詢是。常用來查詢是否有鍵按下(與否有鍵按下(與kbhit()的的用法相仿)。用法相仿)。2022-4-910三、鍵盤處理函數三、鍵盤處理函數2:返回一些控制鍵是否被按過的信息返回一些控制鍵是否被按過的信息(針對最(針對最近一次的按鍵)近一次的按鍵),按過的狀態由返回值的低,按過的狀態由返回值的低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-4-911練習,編程序,接收鍵盤輸入的一個字符,并練習,編程序,接收鍵盤輸入的一個字符,并檢查輔助鍵的按鍵情況檢查輔助鍵的按鍵情況例例13-1:編程,顯示用戶在鍵盤上所按鍵的掃編程,顯示用戶在鍵盤上所按鍵的掃描碼、描碼、ASCII碼和字符(若是非字符鍵,只顯碼和字符(若是非字符鍵,只顯示掃描碼),同時顯示示掃描碼),同時顯示Caps Lock、Shift和和Alt的按鍵情況。按的按鍵情況。按Esc鍵(掃描碼為鍵(掃描碼為1)結束。)結束。代碼:現場編程操作代碼:現場編程操作

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

10、代替)設一個按鈕用來退出程序(漢字用英文代替)2022-4-914第二節第二節 鼠標操作鼠標操作鼠標的鼠標的INT 33H功能調用功能調用常用鼠標操作函數常用鼠標操作函數鼠標形狀的定制鼠標形狀的定制鼠標操作舉例鼠標操作舉例2022-4-915一一、鼠標的、鼠標的INT 33H功能調用功能調用鼠標的工作原理鼠標的工作原理鼠標驅動程序管理鼠標的各種操作,時鼠標驅動程序管理鼠標的各種操作,時刻監測鼠標的動作,包括:移動刻監測鼠標的動作,包括:移動 和各種和各種按鍵按鍵 DOS本身不支持鼠標,要本身不支持鼠標,要使用鼠標,必須先使用鼠標,必須先安裝鼠標驅動程序安裝鼠標驅動程序 Windows系統自動安

11、裝驅動系統自動安裝驅動2022-4-916一一、鼠標的、鼠標的INT 33H功能調用功能調用鼠標任何動作都將引發鼠標任何動作都將引發33H中斷:中斷:每當移動一下鼠標,或者按下每當移動一下鼠標,或者按下(抬起)(抬起)鼠標的按鈕,就會產生一次鼠標的按鈕,就會產生一次33H中斷。中斷。INT 33H還可以用軟件調用還可以用軟件調用鼠標鼠標INT 33H調用的功能號及功能見調用的功能號及功能見表表13-3常用的調用及參數情況見常用的調用及參數情況見表表13-42022-4-917二、常用鼠標操作函數二、常用鼠標操作函數1、檢測驅動是否安裝并顯示按鈕個數、檢測驅動是否安裝并顯示按鈕個數#includ

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

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

14、光標 _AX=1; geninterrupt(0 x33);void cursor_off( ) /關閉鼠標光標關閉鼠標光標 _AX=2; geninterrupt(0 x33);2022-4-920二、常用鼠標操作函數二、常用鼠標操作函數4、設定鼠標光標的位置設定鼠標光標的位置#include void cursor_to_xy(unsigned x, unsigned y) _AX=4; /4號功能調用號功能調用 _CX=x; _DX=y; geninterrupt(0 x33);2022-4-921二、常用鼠標操作函數二、常用鼠標操作函數5、 讀鼠標位置和按鈕狀態函數讀鼠標位置和按鈕狀態

15、函數 函數的調用方法:函數的調用方法: int main() int x=320, y=240, button=0; read_mouse(&x,&y,&button); return 0; 22二、常用鼠標操作函數二、常用鼠標操作函數5、 讀鼠標位置和按鈕狀態函數讀鼠標位置和按鈕狀態函數int read_mouse(int *px, int *py, int *pbutton) / px和和py指向存儲坐標的變量指向存儲坐標的變量 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-4-923二、常用鼠標操作函數二、常用鼠標操作函

17、數上面的上面的do-while循環有問題,因為指針操作循環有問題,因為指針操作 *px = _CX; *py = _DX; *pbutton = _BX;會使用會使用_BX寄存器,使得寄存器,使得_BX中存儲的中斷中存儲的中斷出口參數被改變。出口參數被改變。修改后的代碼應該是:修改后的代碼應該是:245、 讀鼠標位置和按鈕狀態函數讀鼠標位置和按鈕狀態函數int read_mouse(int *px, int *py, int *pbutton) / px和和py指向存儲坐標的變量指向存儲坐標的變量 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-4-925三、鼠標操作舉例三、鼠標操作舉例例例13-2:利用鼠標中斷功能作圖。要求:利用鼠標中斷功能作圖。要求:不按鼠標按鈕時,鼠標形狀為一不按鼠標按鈕時,鼠標形狀為一“十十”字,并隨鼠字,并隨鼠標移動標移動僅按住左鍵,鼠標形狀為十字和圓,移動時留下圓僅按住左鍵,鼠標形狀為十字和圓,移動時留下圓形軌跡形軌跡僅按住右鍵,鼠標形狀為十字和矩形,移動時留下僅按住右鍵,鼠標形狀為十字和矩形,移動時留下矩形軌跡矩形軌跡其他情況留下點的軌跡其他情況留下點的軌跡202

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

溫馨提示

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

評論

0/150

提交評論