C語言中r的用法

時間 2021-08-30 09:51:53

1樓:匿名使用者

bioskey(1)檢測是否有鍵按下,沒有鍵按下時返回0,有鍵按下時返回按鍵碼(任何按鍵碼都不為0),但此時並不將檢測到的按鍵碼從鍵盤緩衝佇列中清除.

bioskey(0)返回鍵盤緩衝佇列中的按鍵碼,並將此按鍵碼從鍵盤緩衝佇列中清除.

bioskey(2)返回按鍵的狀態(如組合鍵等),返回的整數中的每乙個位含義如下:

┌——┬———————————┬———————————┐

│ 位 |為0時意義 │為1時意義 │

├——┼———————————┼———————————┤

│ 7 │插入狀態 │改寫狀態 │

│ 6 │大寫狀態 │小寫狀態 │

│ 5 │數字狀態,numlock燈亮│游標狀態,numlock燈熄 │

│ 4 │scrolllock燈亮 │scrolllock燈熄 │

│ 3 │alt按下 │alt未按下 │

│ 2 │ctrl按下 │ctrl未按下 │

│ 1 │左shift按下 │左shift未按下 │

│ 0 │右shift按下 │右shift未按下 │

└——┴———————————┴———————————┘

這些都是從 c函式速查 中找的,大家可以從網上搜一下.bioskey()是返回鍵盤狀態的基本函式,它擁有3個引數

函式原型為:

int bioskey(int cmd)

其中cmd有3個引數:0,1,2

各引數的用法為:

當cmd是0,bioskey()返回下乙個在鍵盤鍵入的值(它將等待到按下乙個鍵)。它返回乙個16位的二進位制數,包括兩個不同的值。當按下乙個普通鍵時,它的低8位數存放該字元的ascii碼;對於特殊鍵(如方向鍵、f1~f12等等),低8位為0,高8位位元組存放該鍵的掃瞄碼。

cmd = 1:

當cmd是1,bioskey()查詢是否按下乙個鍵,若按下乙個鍵則返回非零值,否則返回0。

cmd = 2:

當cmd是2,bioskey()返回shift、ctrl、alt、scrolllock、numlock、capslock、insert鍵的狀態。各鍵狀態存放在返回值的低8位位元組中。

位元組位 含義

0 右邊shift鍵狀態

1 左邊shift鍵狀態

3 ctrl鍵狀態

4 alt鍵狀態

5 scrolllock鍵狀態

6 numlock鍵狀態

7 capslock鍵狀態

8 insert鍵狀態bioskey函式

函式原型: int bioskey(int cmd);

函式功能:

利用函式bioskey可以實現三種功能,引數cmd為要實現的功能號,值只能為0、1、2,具

體含義如下:

0:在系統中有乙個按鍵佇列,所有的鍵盤按鍵都在這裡排成隊。該功能就是如果按鍵隊

列中有按鍵,那麼讀取佇列首位的按鍵,並返回按鍵值;否則等待鍵盤按鍵出現。(其

中按鍵值的高位元組為掃瞄碼,低位元組為ascii碼)

1:如果按鍵佇列中沒有按鍵,那麼返回零,否則返回非零。

2:返回特殊按鍵shift、ctrl、alt等鍵的按鍵狀態

bioskey函式用於從記憶體中讀取乙個按鍵的scancode值.

格式是: int bioskey(int cmd)

引數cmd取值:

0: 讀取scancode,並從記憶體中刪除,如果沒有按鍵則等待.

1: 讀取scancode,但不從記憶體中刪除(其它函式可以繼續使用),如果無按鍵則返回0

2: 返加shift alt ctrl鍵的狀態

按下shift返回1,按下ctrl返回4,按下alt返回8,

如果是 shift+ctrl 則返回5(相加),依此類推....下面是乙個例子:

#include

main()

}注意:這是乙個死迴圈,因為引數0表示接收按鍵碼,但將其清除,所以kbhit()函式就接收不到按鍵了.

可按ctrl+break組合鍵來終止這個程式.然後將 bioskey(0)改為 bioskey(1),

如果不按鍵將顯示0,若按鍵則立即結束

函式名: bioskey

功 能: 直接使用bios服務的鍵盤介面

函式原型:int bioskey (int cmd)

說明:bioskey()的函式原型在bios.h中

bioskey()完成直接鍵盤操作,cmd的值決定執行什麼操作。

cmd = 0:

當cmd是0,bioskey()返回下乙個在鍵盤鍵入的值(它將等待到按下乙個鍵)。它返回乙個16位的二進位制數,包括兩個不同的值。當按下乙個普通鍵時,它的低8位數存放該字元的ascii碼;對於特殊鍵(如方向鍵、f1~f12等等),低8位為0,高8位位元組存放該鍵的掃瞄碼。

cmd = 1:

當cmd是1,bioskey()查詢是否按下乙個鍵,若按下乙個鍵則返回非零值,否則返回0。

cmd = 2:

當cmd是2,bioskey()返回shift、ctrl、alt、scrolllock、numlock、capslock、insert鍵的狀態。各鍵狀態存放在返回值的低8位位元組中。

位元組位 含義

0 右邊shift鍵狀態

1 左邊shift鍵狀態

3 ctrl鍵狀態

4 alt鍵狀態

5 scrolllock鍵狀態

6 numlock鍵狀態

7 capslock鍵狀態

8 insert鍵狀態

位元組位為1表示該鍵被按下,為0表示鬆開。

程式例:

#include

#include

#include

#define right 0x01

#define left 0x02

#define ctrl 0x04

#define alt 0x08

int main(void)

/* print out the character read */

if (isalnum(key & 0xff))

printf("'%c'\n", key);

else

printf("%#02x\n", key);

return 0;

}bioskey 返回的值有兩種情況。

就 ascii 而言:按乙個按鍵會有兩種情況發生。

1.按乙個按鍵,產生乙個ascii,這樣 bioskey 返回的值就是:hi:掃瞄碼,lo:ascii

2.按乙個按鍵,產生兩個ascii,乙個是0,另乙個是每個鍵不同的ascii, bioskey 的返回值就是:hi:ascii, lo:0

有很多鍵沒有ascii,例如shift, ctrl, capslock 等,但是他們有掃瞄碼,只要是按鍵就有掃瞄碼。

掃瞄碼和ascii是完全不同的兩個概念,是硬體識別鍵盤的編碼,每個按鍵都有固定的掃瞄碼,用來區別每個按鍵,不同的按鍵的掃瞄碼都不同。

兩個按鍵的ascii有可能相同,但是掃瞄碼一定不同,只要是兩個鍵,掃瞄碼就不同,例如兩個回車,ascii相同,但是掃瞄碼不同。

我以前的程式編過一段掃瞄碼,貼出來給你看看:(7年前編的,本來是我當時想做的乙個遊戲引擎的一段程式,可以判斷和處理鍵盤上任意多個鍵同時按下/抬起的情況,可惜因種種原因中斷了,因dos程式,現在也沒什麼意義了)

掃瞄碼的d7位為0,表示這個按鍵被按下產生的中斷,d7為1表示這個按鍵被抬起產生的中斷。

//特殊按鍵

//pause = 0xe145 / 0xe1c5 (0xe1,0x1d(ctrl),0x45(numlock) - 0xe1,0x9d,0xc5)

//break = 0xe046 / 0xe0c6 (0xe0, scrolllock)

//prtsc = 0xe037 / 0xe0b7 (0xe0, keypad - *)

//sysrq = ctrl - prtsc

char pausekeyname=

", //1b

"enter", //1c

"l-ctrl", //1d

"a", //1e

"s", //1f

"d", //20

"f", //21

"g", //22

"h", //23

"j", //24

"k", //25

"l", //26

"; :", //27

"" \"", //28

"` ~", //29

"l-shift", //2a

"\\ |", //2b

"z", //2c

"x", //2d

"c", //2e

"v", //2f

"b", //30

"n", //31

"m", //32

", <", //33

". >", //34

"/ ?", //35

"r-shift", //36

" *", //37

"l-alt", //38

"space", //39

"capslock", //3a

"f1", //3b

"f2", //3c

"f3", //3d

"f4", //3e

"f5", //3f

"f6", //40

"f7", //41

"f8", //42

"f9", //43

"f10", //44

"numlock", //45

"scrolllock",//46

" 7 home", //47

" 8 up", //48

" 9 pgup", //49

" -", //4a

" 4 left", //4b

" 5", //4c

" 6 right", //4d

" +", //4e

" 1 end", //4f

" 2 down", //50

" 3 pgdn", //51

" 0 ins", //52

" . del", //53

"prtsc(alt)",//54

"??? 55h", //55

"added \\ |",//56

"f11", //57

"f12", //58

"??? 59h", //59

"??? 5ah", //5a

"??? 5bh", //5b

"??? 5ch", //5c

"??? 5dh", //5d

"??? 5eh", //5e

"??? 5fh", //5f

"??? 60h", //60

"??? 61h", //61

"??? 62h", //62

"??? 63h", //63

};char keynamese0=

;得到掃瞄碼的方法:攔截鍵盤硬體中斷,計算的結果儲存在 keyscancode 裡,keyboardproc();就是處理這個值的函式。

unsigned far *_key_flags = (unsigned far *)0x00000417l;

unsigned far *_key_flags1= (unsigned far *)0x00000496l;

unsigned int far keyscancode = 0;

unsigned char far keyscbuffer=;

unsigned char far keytempchar = 0;

void interrupt newkb09(...)

asm sti

outportb(0x20,0x20);

}//這是一段測試程式,可以顯示出當前按下或者抬起那個按鍵:

char fmtksccode="%-10s\r\n";

char fmtunkname="\rscancode: ";

char strkeyname="press any key or esc to quit ...";

char byestr);

}else

}else

textcolor(lightblue);

cprintf(strwait);

kscode=0;

}}textcolor(lightgray);

cprintf(byestr);

resoldkb();

return 0;

}top希望對你有幫助

c語言中函式指標用法,C語言中函式指標用法

函式在記憶體中有一個物理位置,而這個位置是可以賦給一個指標的。一零點函式的地址就是該函式的入口點。因此,函式指標可被用來呼叫一個函式。函式的地址是用不帶任何括號或引數的函式名來得到的。這很類似於陣列地址的得到方法,即,在只有陣列名而無下標是就得到陣列地址。怎樣說明一個函式指標變數呢 為了說明一個變數...

c語言中strtok用法,C語言中strtok用法

星月小木木 strtok函式會破壞被分解字串的完整,呼叫前和呼叫後的s已經不一樣了。如果要保持原字串的完整,可以使用strchr和sscanf的組合等。strtok是乙個執行緒不安全的函式,因為它使用了靜態分配的空間來儲存被分割的字串位置 執行緒安全的函式叫strtok r,ca。運用strtok來...

c語言中char的用法,C語言中char的用法

會飛的小兔子 include intmain inti charc 定義乙個char型別的變數。c a 賦值 for i 0 i 26 i printf c c 輸出乙個字元用 c,c charc增加1,依次可以得到 abcdef。zprintf n if c z printf stillasmal...