c语言bioskey,求c语言中的bioskey的用法呀

本文详细介绍了C函数bioskey的使用方法,包括检测按键、读取ASCII码和特殊键状态。通过示例展示了如何利用bioskey(0)读取键值,以及bioskey(2)获取键的组合状态。适用于底层硬件编程和系统级键盘操作。
摘要由CSDN通过智能技术生成

满意答案

dcebd7a0de6265b6ccae5ead692f1eab.png

lssxmh

推荐于 2016.06.02

dcebd7a0de6265b6ccae5ead692f1eab.png

采纳率:49%    等级:12

已帮助:5519人

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()

{

while(!kbhit())

{

printf("\n%d,%d",bioskey(0),bioskey(2));

}

}

注意:这是一个死循环,因为参数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)

{

int key, modifiers;

/* function 1 returns 0 until a key is pressed */

while (bioskey(1) == 0);

/* function 0 returns the key that is waiting */

key = bioskey(0);

/* use function 2 to determine if shift keys were used */

modifiers = bioskey(2);

if (modifiers)

{

printf("[");

if (modifiers & RIGHT) printf("RIGHT");

if (modifiers & LEFT) printf("LEFT");

if (modifiers & CTRL) printf("CTRL");

if (modifiers & ALT) printf("ALT");

printf("]");

}

/* 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=

{

"NULL", //00

"Esc", //01

"1 !", //02

"2 @", //03

"3 #", //04

"4 $", //05

"5 %", //06

"6 ^", //07

"7 &", //08

"8 *", //09

"9 (", //0A

"0 )", //0B

"- _", //0C

"+ =", //0D

"BackSpace", //0E

"Tab", //0F

"Q", //10

"W", //11

"E", //12

"R", //13

"T", //14

"Y", //15

"U", //16

"I", //17

"O", //18

"P", //19

" }", //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

",

". >", //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=

{

"NULL", //E000

"??? E001H", //E001

"??? E002H", //E002

"??? E003H", //E003

"??? E004H", //E004

"??? E005H", //E005

"??? E006H", //E006

"??? E007H", //E007

"??? E008H", //E008

"??? E009H", //E009

"??? E00AH", //E00A

"??? E00BH", //E00B

"??? E00CH", //E00C

"??? E00DH", //E00D

"??? E00EH", //E00E

"??? E00FH", //E00F

"??? E010H", //E010

"??? E011H", //E011

"??? E012H", //E012

"??? E013H", //E013

"??? E014H", //E014

"??? E015H", //E015

"??? E016H", //E016

"??? E017H", //E017

"??? E018H", //E018

"??? E019H", //E019

"??? E01AH", //E01A

"??? E01BH", //E01B

" Enter", //E01C

"R-Ctrl", //E01D

"??? E01EH", //E01E

"??? E01FH", //E01F

"??? E020H", //E020

"??? E021H", //E021

"??? E022H", //E022

"??? E023H", //E023

"??? E024H", //E024

"??? E025H", //E025

"??? E026H", //E026

"??? E027H", //E027

"??? E028H", //E028

"??? E029H", //E029

"??? E02AH", //E02A

"??? E02BH", //E02B

"??? E02CH", //E02C

"??? E02DH", //E02D

"??? E02EH", //E02E

"??? E02FH", //E02F

"??? E030H", //E030

"??? E031H", //E031

"??? E032H", //E032

"??? E033H", //E033

"??? E034H", //E034

" /", //E035

"??? E036H", //E036

"PrtSc", //E037

"R-Alt", //E038

"??? E039H", //E039

"??? E03AH", //E03A

"??? E03BH", //E03B

"??? E03CH", //E03C

"??? E03DH", //E03D

"??? E03EH", //E03E

"??? E03FH", //E03F

"??? E040H", //E040

"??? E041H", //E041

"??? E042H", //E042

"??? E043H", //E043

"??? E044H", //E044

"??? E045H", //E045

"Break", //E046

"Home", //E047

"Up", //E048

"PageUp", //E049

"??? E04AH", //E04A

"Left", //E04B

"??? E04CH", //E04C

"Right", //E04D

"??? E04EH", //E04E

"End", //E04F

"Down", //E050

"PageDown", //E051

"Insert", //E052

"Delete", //E053

"??? E054H", //E054

"??? E055H", //E055

"??? E056H", //E056

"??? E057H", //E057

"??? E058H", //E058

"??? E059H", //E059

"??? E05AH", //E05A

"L-Start95", //E05B

"R-Start95", //E05C

"Menu95", //E05D

"Power", //E05E

"Sleep", //E05F

"??? E060", //E060

"??? E061", //E061

"??? E062", //E062

"Wake Up", //E063

};

得到扫描码的方法:拦截键盘硬体中断,计算的结果保存在 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={0,0,0,0};

unsigned char far KeyTempChar = 0;

void interrupt NewKb09(...)

{

asm cli

KeyTempChar=inportb(0x60);

KeyScBuffer=KeyScBuffer;

KeyScBuffer=KeyScBuffer;

KeyScBuffer=KeyScBuffer;

KeyScBuffer=KeyTempChar;

KeyTempChar=inportb(0x61);

outportb(0x61,KeyTempChar|0x80);

outportb(0x61,KeyTempChar&0x7f);

if((KeyScBuffer!=0xe0) && (KeyScBuffer!=0xe1))

{

KeyScanCode=KeyScBuffer;

if(KeyScBuffer==0xe0)

KeyScanCode|=0xe000;

if((KeyScBuffer==0xe1) &&

((KeyScBuffer==0x1d) || (KeyScBuffer==0x9d)))

KeyScanCode|=0xe100;

if((KeyScanCode!=0xe02a) &&

(KeyScanCode!=0xe0aa) &&

(KeyScanCode!=0xe036) &&

(KeyScanCode!=0xe0b6) &&

(KeyScBuffer!=0xe1))

KeyboardProc();

}

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

{

cprintf(FmtKeyName, KeyNames00);

}

}

else

{

cprintf(FmtUnkName, ksCode&0xff7f);

}

textcolor(LIGHTBLUE);

cprintf(StrWait);

ksCode=0;

}

}

textcolor(LIGHTGRAY);

cprintf(ByeStr);

ResOldKb();

return 0;

}

Top

20分享举报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值