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...