您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 第13章 键盘和鼠标操作
2020/1/291第十三章键盘和鼠标操作键盘操作鼠标操作2020/1/292第一节键盘操作键盘工作原理键盘缓冲区键盘处理函数2020/1/293一、键盘工作原理键盘中有一个微处理器,可以监测每个键的按下或抬起的状态当用户按下或抬起一个键时,便产生一个INT9中断,并将该键的扫描码(1字节)送入计算机,由ROM中BIOS的中断处理程序去处理。说明:有些特殊键如PrintScreen等,只引起中断,不产生扫描码。扫描码的最高位(第7位)标识按键的状态:0:代表按下1:代表抬起扫描码的0~6位记录的是引起中断的按键在键盘上的位置说明:扫描码仅能区别键的位置以及状态(按下或抬起),不能直接区分大小写(大小写的扫描码相同),键盘中断处理程序在区分大小写时,会参照其他按键(CapsLock和Shift)的状态。2020/1/2942020/1/295按键种类AH的内容AL的内容字符键扫描码ASCII码功能键/组合键扫描码0扩充的键盘扫描码-扩充码的存放格式由于键盘扫描码只有一个字节,只能标出256种状态,不能包括键盘上的全部按键情况,故键盘处理程序对扫描码进行了扩充:首先在AX中将其扩充为两个字节,然后送入键盘缓冲区。在AX中扩充的这两个字节的内容如下表所示:2020/1/296二、键盘缓冲区由于INT9中断和应用程序接收键盘输入不能同时进行,而键盘输入的信息是即刻消失的,为了避免信息丢失,系统在内存中定义了一个32字节的缓冲区,专门存储键盘输入。键盘缓冲区中,能使用的仅30字节,可存放15个字符的扩充码。此键盘缓冲区是基本输入输出系统分配的,与C编译器分配的键盘缓冲区不是同一概念。两个缓冲区之间的关系:2020/1/297设键盘输入:abEnteraa的扫描码bb的扫描码\r回车的扫描码ab\n基本输入输出系统分配的键盘缓冲区C编译器分配的键盘缓冲区低字节高字节2020/1/298三、键盘处理函数TurboC在bios.h中提供了一个键盘操作函数bioskey(),用来处理键盘输入。(也可以用BIOS调用或DOS调用)bioskey()函数的原型是:intbioskey(intcmd);2020/1/299三、键盘处理函数其中:cmd有三种取值:0:bioskey(0)返回按键的键值(即扩充码),并将缓冲区中的键值删除。该值是2个字节的整数。若无键按下,则该函数一直等待,直到有键按下。1:返回按键的键值,但不删除缓冲区中的键值。若缓冲区为空,返回0。常用来查询是否有键按下(与kbhit()的用法相仿)。2020/1/2910三、键盘处理函数2:返回一些控制键是否被按过的信息,按过的状态由返回值的低8位表示,如下:位含义0若为1,表示右边Shift被按下1若为1,表示左边Shift被按下2若为1,表示Ctrl键被按下3若为1,表示Alt键被按下4若为1,表示ScrollLock已打开5若为1,表示NumLock已打开6若为1,表示CapsLock已打开7若为1,表示Insert已打开2020/1/2911例13-1:编程,显示用户在键盘上所按键的扫描码、ASCII码和字符(若是非字符键,只显示扫描码),同时显示CapsLock、Shift和Alt的按键情况。按Esc键(扫描码为1)结束。代码略2020/1/2912第二节鼠标操作鼠标的INT33H功能调用常用鼠标操作函数鼠标形状的定制鼠标操作举例2020/1/2913一、鼠标的INT33H功能调用DOS下使用鼠标,必须先安装相应的鼠标驱动程序安装好鼠标驱动并进行初始化后,鼠标驱动程序便会管理鼠标的各种操作。每当移动一下鼠标,或者按一下鼠标的按钮,就会产生一次INT33H中断。鼠标INT33H调用的功能号及功能见表13-3,常用的调用及参数情况见表13-42020/1/2914二、常用鼠标操作函数1、检测驱动是否安装并显示按钮个数#includedos.hvoidmouse_test(){_AX=0;//调用0号功能geninterrupt(0x33);if(_AX==-1)//若安装返回-1,否则返回0printf(mouseinstalled%dbuttons\n,_BX);elseprintf(mousenotinstalled\n);}2020/1/2915二、常用鼠标操作函数2、鼠标初始化函数intinit(intxmin,intxmax,intymin,intymax){_AX=0;geninterrupt(0x33);//调用0号功能if(_AX==0)return0;//表示鼠标器或驱动程序未安装_AX=7;_CX=xmin;_DX=xmax;geninterrupt(0x33);_AX=8;_CX=ymin;_DX=ymax;geninterrupt(0x33);return-1;//表示鼠标器和驱动程序已安装}2020/1/2916二、常用鼠标操作函数3、打开和关闭鼠标光标的函数voidcursor_on()//显示鼠标光标{_AX=1;geninterrupt(0x33);}voidcursor_off()//关闭鼠标光标{_AX=2;geninterrupt(0x33);}2020/1/2917二、常用鼠标操作函数4、设定鼠标光标的位置#includedos.hvoidcursor_to_xy(unsignedx,unsignedy){_AX=4;//4号功能调用_CX=x;_DX=y;geninterrupt(0x33);}2020/1/2918二、常用鼠标操作函数5、读鼠标位置和按钮状态函数intread_mouse(int*mx,int*my,int*mbutton)//mx和my指向存储新坐标的变量{intx0=*mx,y0=*my,button0=*mbutton;intxnew,ynew;do{_AX=3;geninterrupt(0x33);xnew=_CX;ynew=_DX;*mbutton=_BX;}while(xnew==x0&&ynew==y0&&*mbutton==button0);*mx=xnew;*my=ynew;switch(*mbutton){case0:return0;//没有键被按下case1:return1;//左键按下case2:return2;//右键按下case3:return3;//左右键同时按下default:return4;//其他情况}}2020/1/2919二、常用鼠标操作函数上面的do-while循环有问题,因为指针操作(*mbutton=…)会使用_BX寄存器,使得_BX中存储的中断出口参数被改变。应改为:do{intbx;_AX=3;geninterrupt(0x33);bx=_BX;xnew=_CX;ynew=_DX;*mbutton=bx;}while(xnew==x0&&ynew==y0&&*mbutton==button0);函数的调用方法:intx=320,y=240,button=0;read_mouse(&x,&y,&button);……2020/1/2920三、鼠标操作举例利用鼠标中断功能作图。要求:不按鼠标按钮时,鼠标形状为一“十”字,并随鼠标移动仅按住左键,鼠标形状为十字和圆,移动时留下圆形轨迹仅按住右键,鼠标形状为十字和矩形,移动时留下矩形轨迹其他情况留下点的轨迹2020/1/2921编程思路:检测鼠标及驱动安装否,若否,结束程序初始化鼠标位置及移动范围在屏幕中心显示鼠标形状检测鼠标的移动和按钮的状态•若仅位置移动,将原来的鼠标形状消除,在新位置重新显示鼠标(十字形状)•若有按钮按下–若在quit处按下,则退出程序–不在quit处:•左键:消除原位置鼠标,新位置显示鼠标,并画一圆•右键:消除原位置鼠标,新位置显示鼠标,并画一矩形•其他:消除原位置鼠标,新位置显示鼠标,并画一点2020/1/2922实训1、写一个程序,监测键盘上A、空格和Enter键被按下的次数,按ESC键停止监测。2、屏幕上画一个半径为100的圆,当鼠标在圆内时,按下左键显示一个点,并可用红色写字画图(用作铅笔),按下右键则显示一个小方块,可擦除圆内图像(用作橡皮)。若鼠标在圆外,只显示一个箭头,无任何作用。3、屏幕上画一个球,用键盘控制其上下左右移动,按ESC时退出。4、屏幕上画两个按钮,当鼠标移动到某按钮上方时,按钮上的字为红色,否则为白色。
本文标题:第13章 键盘和鼠标操作
链接地址:https://www.777doc.com/doc-3377930 .html