




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、用tc在dos下显示高分辨率的方法键盘是电脑最基本的输入设备,对101键盘上所有键直接管理,而且直接判断所有键的状态是按下还是释放。此键盘程序适用于游戏等即时性的键盘应用,如果用来管理打字等还应加上键盘缓冲区方面的管理。 /*保存为keyboard.c*/ /*由define定义的,SCAN_开头的是键盘扫描码,可用kbkflag数组判断某个键的状态 具体的键盘扫描码可参考其它书籍,KEY_开头的是键盘返加的ASCII码,可用getkey()函数得到。 ,为了减少篇幅,只定义游戏中用到的控制键及少数其它键。*/ #ifndef KEYBOARD #define SCAN_CAPSLOCK 58
2、 #define SCAN_LEFTSHIFT 42 #define SCAN_RIGHTSHIFT 54 #define SCAN_SHIFT (keyflagSCAN_RIGHTSHIFT|keyflagSCAN_LEFTSHIFT) #define KEY_CTRLBREAK 248 #define KEY_INSERT 236 #define KEY_CAPSLOCK 230 #define KEY_F11 229 #define KEY_F12 228 #include #include static unsigned char asciinames= 0,27,1,2,3,4,5,
3、6,7,8,9,0,-,=,8,9, q,w,e,r,t,y,u,i,o,p,13,0,a,s, d,f,g,h,j,k,l,;,39,0,92,z,x,c,v, b,n,m,.,/,0,*,0, ,0,0,0,0,0,0, 0,0,0,0,0,0,0,7,8,9,-,4,5,6,+,1, 2,3,0,127,0,0,KEY_F11,KEY_F12,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; /*按下shift键返加数组*/ static unsigned char shif
4、tnames= 0,27,!,#,$,%,&,*,(,),_,+,8,9, Q,W,E,R,T,Y,U,I,O,P,13,1,A,S, D,F,G,H,J,K,L,:,34,0,|,Z,X,C,V, B,N,M,?,0,*,1, ,0,0,0,0,0,0, 0,0,0,0,0,0,0,7,8,9,-,4,5,6,+,1, 2,3,0,127,0,0,|,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; /*特殊键返回数组*/ static char specialnames
5、= 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,/,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,KEY_CTRLBREAK,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; unsigned char lastas
6、cii; unsigned char lastscan; unsigned char keyflag128;/*键状态数组*/ static unsigned char capslock; static unsigned char curkeycode,lastkeycode; static void interrupt (*oldkeyinterrupt)(void); /*清除所有键*/ void clearkeyboard() int i; lastscan=0;lastascii=0;memset(keyflag,0,sizeof(keyflag); /*新的INT9H键盘硬中断*/
7、static void interrupt newkeyboardinterrupt(void) static unsigned char specialflag; unsigned char k,c,temp; int i; k=inportb(0x60); /*从键盘端口读取扫描码*/ outportb(0x61,(temp=inportb(0x61)|0x80); outportb(0x61,temp);if(k=0xe0) specialflag=1; /*扫描码为E0开头为特殊键*/ else if(k=0xe1); /*扫描码为E1开头为Pause键*/ else if(k&0x8
8、0) /*最高位为1为断开码*/ k&=0x7f;keyflagk=0; else /*则为按下状态*/ lastkeycode=curkeycode; curkeycode=lastscan=k; keyflagk=1; if(specialflag) c=specialnamesk; else if(k=SCAN_CAPSLOCK)/*按下Caps-Lock改变大小写*/ capslock=(capslock)&1; if(SCAN_SHIFT) /*SHIFT键按下改变大小写*/ c=shiftnamesk; if(c=A)&(c=a)&(c=z)&capslock) c-=a-A; i
9、f(c)lastascii=c; specialflag=0; outportb(0x20,0x20); /*通知中断管理器硬中断结速*/ /*初始化键盘并开始新的键盘管理*/ static void initkeyboard(void) clearkeyboard(); oldkeyinterrupt=getvect(9); setvect(9,newkeyboardinterrupt); /*并闭键盘管理,程序结束必须先执行此函数*/ static void closekeyboard(void) poke(0x40,0x17,peek(0x40,0x17)&0xfaf0); setvec
10、t(9,oldkeyinterrupt); /*得到键盘扫描码*/ unsigned char getscan(void) unsigned char result; while(result=lastscan)!=0); lastscan=0; return(result); /*获得键盘返回码*/ unsigned char getkey(void) unsigned char result; while(result=lastascii)=0); lastascii=0; return(result); CPU在实方式下并没有提供改变段描述符寄存器的界限值的操作指令。改变段描述符寄存器的
11、内容只能在保护方式下进行。当设置控制寄存器CR0的PE位1时,CPU进入保护方式;当设置控制寄存器CR0的PE位0时,CPU返回实方式。通过设置CR0改变工作方式时,段描述符寄存器的内容不发生变化。因此,在DOS实方式下直接访问4GB内存之前,让CPU进入保护方式下,通过装载具有4GB界限的段描述符到段描述符寄存器DS、ES、FS和GS中去。然后返回到实方式下。就可使诸如“MOVAX,EBX”、 “MOVAX,FS:EBX”指令的32位寄存器间接寻址操作实现4GB内存的访问。由于这种编程方法产生的是基于实方式下的执行程序。因此,它不能在保护方式下和虚拟8086方式下运行,即,不能在Window
12、s中运行,也不能在DOS系统中装载扩充内存EMS驱动程序(如EMM386.EXE)。3.2编程方法(1)编程环境本文采用BorlandC+3.1程序设计环境,在程序中使用内嵌汇编方法实现特定的操作,在Options的 “Compile”-“AdvancedCodegeneration”中选择386指令集。由于集成开发环境下的内部编译器不能识别内嵌的386汇编指令,要实现32位寄存器和32位地址操作汇编指令,可让集成开发环境调用TASM.EXE进行编译,即设置Options中的 “Compile”-“Codegeneration”-“Compileviaassemler”为ON。这样便可完整地运
13、用386汇编指令,在以下编程示例中采用了这种编译方法。(2)基本操作函数打开A20地址线要访问4GB内存,必须打开A20地址线。voidopenA20()while(inp(0x64)&2);outp(0x64,0xd1);while(inp(0x64)&2);outp(0x60,0xdf);while(inp(0x64)&2);outp(0x64,0xff);设置数据段的4GB界限函数首先,建立一个全局描述符表GDT,即GDT_def,它含有二个描述符,第一个为空描述符(保护方式下系统要求的),第二个是具有4GB段界限的数据段描述符。它的选择字为8。再计算出GDT的基地址和长度存入GDT_A
14、ddr中。然后,装载GDT,进入保护方式,把选择字8赋给FS和GS,此时第二个数据段描述符被装载到FS和GS的描述符寄存器中。最后返回实方式。通理,也可设置DS和ES的4GB界限。unsignedlongGDT_def=0,0,0x0000FFFF,0x008F9200;/全局描述符表GDTunsignedcharGDT_Addr6=0;/存放GDT的基地址和长度voidset4gb()asmcli/关中断movwordptrGDT_Addr0,(2*8-1)/GDT的长度存入GDT_Addr中moveax,ds/计算GDT描述符表的线性基地址310shleax,4/段地址eax=ds16xo
15、rebx,ebx/ebx清零movbx,offsetGDT_def/bx=GDT的偏移地址addeax,ebx/GDT的线性基地址=eax+ebxmovdwordptrGDT_Addr2,eax/GDT的线性基地址存入GDT_Addr中lgdtfwordptrGDT_Addr/将GDT_Addr装载到GDTR寄存器中movbx,8/设置数据段描述符的选择字moveax,cr0oral,1movcr0,eax/设置CR0的PE位1jmpflush1/进入保护方式flush1:asmmovfs,bx/FS装载具有4GB界限的数据段描述符movgs,bx/GS装载具有4GB界限的数据段描述符anda
16、l,0fehmovcr0,eax/设置CR0的PE位0jmpflush2/返回实方式flush2:asmmovax,0movfs,ax/设置FS描述符的基地址为0movgs,ax/设置GS描述符的基地址为0sti/开中断直接访问4GB内存的编程示例在FS和GS具有4GB的访问界限后,通过32位寄存器间接寻址的指令就可实现4GB内存的访问。例如图象二值化的运算函数如下:voidtwo_mem(unsignedlongaddrd,unsignedlongaddrs,unsignedlongleng,unsignedcharyuzi)asmmovecx,leng/leng为图象数据块的字节数asmmovesi,addrs/addrs为源图象数据块的32位线性基地址asmmovedi,addrd/addrd为二值化图象数据块的32位
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 福建对外经济贸易职业技术学院《药物生物技术》2023-2024学年第二学期期末试卷
- 《大战中的插曲》教学设计 2023-2024学年统编版高中语文选择性必修上册
- 海南热带海洋学院《男装设计》2023-2024学年第二学期期末试卷
- 山东政法学院《数字集成电路设计》2023-2024学年第二学期期末试卷
- 太原幼儿师范高等专科学校《高级管理统计》2023-2024学年第二学期期末试卷
- 皖江工学院《专业技能训练化学教学技能与训练》2023-2024学年第二学期期末试卷
- 郑州体育职业学院《室内空间设计公共》2023-2024学年第二学期期末试卷
- 吉林体育学院《生物工程专业分析》2023-2024学年第二学期期末试卷
- 河南2025年河南职业技术学院招聘30人笔试历年参考题库附带答案详解
- 免烧砖销售合同范本
- (正式版)JBT 14787-2024 可同步限矩型液力耦合器
- 流行音乐(中国)
- 合规管理体系实务培训测试题附有答案
- 常见症状-黄疸课件
- 节后复工安全培训的事故案例分析与教训
- 五子棋基础入门课件
- 课程思政融入专业课程的
- 涉密人员专题培训课件
- 浙江游戏产业园可行性方案
- 提升办公室工作效能的经验交流发言模板
- 胃癌影像诊断课件
评论
0/150
提交评论