关于c语言的bioskey函数,bios是c语言程序吗

C语言中bioskey()与kbhit()的区别,最好详细点,谢谢了

bioskey()函数是TC编译环境下的函数,VC中无法使用

创新互联主要从事网页设计、PC网站建设(电脑版网站建设)、wap网站建设(手机版网站建设)、成都响应式网站建设公司、程序开发、网站优化、微网站、微信平台小程序开发等,凭借多年来在互联网的打拼,我们在互联网网站建设行业积累了丰富的成都做网站、成都网站设计、网站设计、网络营销经验,集策划、开发、设计、营销、管理等多方位专业化运作于一体。

具体可以看看百度百科

kbhit();可以在vc中使用,是判断键盘是否有按键按下,有就返回1,一般这样使用

if(kbhit()){..............}

-物联网校企联盟技术部

关于C语言的bioskey函数

bioskey函数 只能用于 TC.

用法,详见百科文章:

while (bioskey(1) == 0); // 没有按键时bioskey(1) 返回0,条件满足,一直在循环等待,一旦有键按下,bioskey(1) 返回“非0”,循环结束。

key = bioskey(0); 获取键值。

modifiers = bioskey(2); 判断是否按的是键的组合,例如上下档Shift,

modifiers RIGHT // 按位与运算,如果得真,是同 RIGHT 键 组合

是同 LEFT 左键,是同 CTRL 控制键,是同 ALT 键组合。

打印:

如果组合。。。

如果不是组合,就是单个键。。。

C语言 求助

::是类成员访问运算符。

关于bioskey函数,介绍如下:

bioskey() 函数需要引用头文件 bios.h,这个头文件在 VC 中默认是没有的,将其引用 #include bios.h 删掉即可。

功能上,bioskey 可以实现以下三个功能:

1. bioskey(0): 返回用户按键。

如果返回值的低 8 位非 0,该值表示按键的 ASCII 码;

如果返回值的低 8 位为 0,该值表示按键的键码。

作为替代,VC 中可以使用 getch() 返回用户按键。对于功能键(如光标键),getch() 需要调用两次,第一次返回 0 或 0xE0,第二次返回键码。

2. bioskey(1): 返回是否有按键发生。

如果没有按键,返回 0;

如果有按键,返回该按键值。(该按键仍然保留)

作为替代,VC 中可以使用 kbhit() 返回是否有按键发生。

请问C语言中的bioskey(0)是啥意思,括号里的值又有啥用?

bioskey(1) == 0表示没有按下键。

bioskey(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位字节中。

函数名: 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位字节中。

求c语言中的bioskey的用法呀

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

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

#include bios.h

#include ctype.h

#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

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

{

"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,KeyTempChar0x7f);

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, ksCode0xff7f);

}

textcolor(LIGHTBLUE);

cprintf(StrWait);

ksCode=0;

}

}

textcolor(LIGHTGRAY);

cprintf(ByeStr);

ResOldKb();

return 0;

}

Top

c语言中的bioskey()

bioskey()接收的是扫描码。

函 数 名: bioskey 头文件:bios.h

功 能: 直接使用BIOS服务的键盘接口(也可以理解为:读取键盘值)

用 法: int bioskey(int cmd);

输入参数:cmd=0 返回一个键盘值,如无键盘按下,一直等待。

cmd=1 查询键盘是否按下 0-无键按下,非0-有键按下。

cmd=2 返回控制键状态,返回值保存在低8位中。

#define NUM1 0x4f31 /* 小键盘区上数字键1 */

#define NUM2 0x5032 /* 小键盘区上数字键2 */

#define NUM3 0x5133 /* 小键盘区上数字键3 */

#define NUM4 0x4b34 /* 小键盘区上数字键4 */

#define NUM5 0x4c35 /* 小键盘区上数字键5 */

#define NUM6 0x4d36 /* 小键盘区上数字键6 */

#define NUM7 0x4737 /* 小键盘区上数字键7 */

#define NUM8 0x4838 /* 小键盘区上数字键8 */

#define NUM9 0x4939 /* 小键盘区上数字键9 */

#define NUMPNT 0x532e /* 小键盘区上 . 键 */

#define NUMADD 0x4e2b /* 小键盘区上 + 键 */

#define NUMSUB 0x4a2d /* 小键盘区上 - 键 */

#define NUMMUL 0x372a /* 小键盘区上 * 键 */

#define NUMDIV 0x352f /* 小键盘区上 / 键 */

#define NUMEQU 0x1c0d /* 小键盘区上 = 键 */#define KEY0 0xb30 /* 主键盘区上数字键0 */

#define KEY1 0x231 /* 主键盘区上数字键1 */

#define KEY2 0x332 /* 主键盘区上数字键2 */

#define KEY3 0x433 /* 主键盘区上数字键3 */

#define KEY4 0x534 /* 主键盘区上数字键4 */

#define KEY5 0x635 /* 主键盘区上数字键5 */

#define KEY6 0x736 /* 主键盘区上数字键6 */

#define KEY7 0x837 /* 主键盘区上数字键7 */

#define KEY8 0x938 /* 主键盘区上数字键8 */

#define KEY9 0xa39 /* 主键盘区上数字键9 */

#define KEYPNT 0x342e /* 主键盘区上 . 键 */

#define KEYSUB 0xc2d /* 主键盘区上 - 键 */

#define KEYMUL 0x92a /* 主键盘区上 * 键 */

#define KEYEQU 0xd3d /* 主键盘区上 = 键


网站栏目:关于c语言的bioskey函数,bios是c语言程序吗
分享URL:http://bzwzjz.com/article/hojgpo.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 成都营销网站建设 营销型网站建设 网站设计制作 重庆电商网站建设 成都网站建设 成都网站建设 网站建设 成都网站建设 成都企业网站制作 企业网站建设 响应式网站设计 成都网站制作 H5网站制作 成都网站设计 成都网站建设 营销网站建设 成都网站设计 企业手机网站建设 成都网站设计 成都企业网站建设 成都网站建设公司 外贸网站建设