求高人指点:为什么这个中断运行以后,键盘就不能正常输入了呢?

wonderful79 2005-12-01 09:14:49
#include<stdio.h>
#include<dos.h>
#include<io.h>

unsigned char ScanCode;
int KeyFlag=0;

static void interrupt (*oldkeyinterrupt)(void);

static void interrupt newkeyboardinterrupt(void)
{
unsigned char temp;
ScanCode=inportb(0x60);
temp=inportb(0x61);
outportb(0x61,temp | 0x80);
outportb(0x61,temp & 0x7f);
if(ScanCode==0x1c) /*a的扫描码*/
{
KeyFlag=1;
}

outportb(0x20,0x20);
}

static void initkeyboard(void)
{
oldkeyinterrupt=getvect(9);
setvect(9,newkeyboardinterrupt);
}

static void closekeyboard()
{
setvect(9,oldkeyinterrupt);
}

int main()
{

initkeyboard();
outportb(0x64,0x60);
outportb(0x60,0x01);
while(1)
{
if(KeyFlag==1)
{
closekeyboard();
gets(KeyData);
KeyFlag=0;
}

}

}

在程序运行中,KeyData输入的时候键盘就发生了错乱,求高人指点这是为什么?谢谢!
...全文
289 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
RainWindy 2005-12-09
  • 打赏
  • 举报
回复
第二套扫描码是什么意思,还是第一次听说,有文档吗给大家看看吗?
fire214 2005-12-08
  • 打赏
  • 举报
回复
在c语言中实际上是转化为汇编程序,键盘和superio的通讯是第二套码,在程序中无法提取,而所开放的60h端口是扫描键盘的唯一端口。请看一下ps2标准。
foxdeng 2005-12-03
  • 打赏
  • 举报
回复
看来楼主遇上新问题了,这个问题的答案只能在计算机原理中寻找,到现在为止矛盾的焦点已经转移到新的领域
fxyj2008 2005-12-03
  • 打赏
  • 举报
回复
你新的中断程序后必须再调用老的中断,中断发生后,还必须清除8259相关的状态器,否则同类的中断不响应
wonderful79 2005-12-02
  • 打赏
  • 举报
回复
各位大侠,谁能帮忙解决一下啊?
wonderful79 2005-12-01
  • 打赏
  • 举报
回复
temp=inportb(0x61);
outportb(0x61,temp | 0x80);
outportb(0x61,temp & 0x7f);
表示已读取键盘扫描码。
outportb(0x64,0x60);
outportb(0x60,0x01);
这两句表示使用的是键盘第二套扫描码。

现在程序好用了,但是我必须用第二套扫描码,郁闷!这样只能识别第一套扫描码呀,大侠,能帮忙吗?
RainWindy 2005-12-01
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<dos.h>
#include<io.h>

short ScanCode = 0;
int KeyFlag=0;

static void interrupt (*oldkeyinterrupt)(void);

static void interrupt newkeyboardinterrupt(void)
{
// unsigned char temp;
ScanCode=inportb(0x60);
// temp=inportb(0x61);
// outportb(0x61,temp | 0x80); // 请问改这个端口是什么意思
// outportb(0x61,temp & 0x7f);
outportb(0x20,0x20);
if(ScanCode == 30) /*a的扫描码*/
{
KeyFlag=1;
}
(*oldkeyinterrupt)();
}

static void initkeyboard(void)
{
oldkeyinterrupt=getvect(9);
setvect(9,newkeyboardinterrupt);
}

static void closekeyboard()
{
setvect(9,oldkeyinterrupt);
}

int main()
{
char KeyData[100];
initkeyboard();
// outportb(0x64,0x60); // 这两句是什么意思,去掉这两句就好了。
// outportb(0x60,0x01);
while(1)
{
if(KeyFlag==1)
{
printf("\nInput:");
closekeyboard();
gets(KeyData);
printf("\n!%s!\n", KeyData);
gets(KeyData);
printf("\n!%s!\n", KeyData);
gets(KeyData);
printf("\n!%s!\n", KeyData);
gets(KeyData);
printf("\n!%s!\n", KeyData);
KeyFlag=0;
break;
}

}

}
fiftymetre 2005-12-01
  • 打赏
  • 举报
回复
但是按照你的逻辑,一旦flag等于1就恢复向量,再gets就没有意义了
wonderful79 2005-12-01
  • 打赏
  • 举报
回复
我是想在满足KeyFlag=1这个条件的情况下,才有输入,如果把顺序调换了,就不能实现这个功能了,还望指教,谢谢!
rockefeller8 2005-12-01
  • 打赏
  • 举报
回复
能否介绍一下端口的情况
fiftymetre 2005-12-01
  • 打赏
  • 举报
回复
你的顺序错了,gets不应该和恢复向量的函数放在一起
你试一下这样:
#include<stdio.h>
#include<dos.h>
#include<io.h>

unsigned char ScanCode;
int KeyFlag=0;

static void interrupt (*oldkeyinterrupt)(void);

static void interrupt newkeyboardinterrupt(void)
{
unsigned char temp;
ScanCode=inportb(0x60);
temp=inportb(0x61);
outportb(0x61,temp | 0x80);
outportb(0x61,temp & 0x7f);
if(ScanCode==0x1c) /*a的扫描码*/
{
KeyFlag=1;
}

outportb(0x20,0x20);
}

static void initkeyboard(void)
{
oldkeyinterrupt=getvect(9);
setvect(9,newkeyboardinterrupt);
}

static void closekeyboard()
{
setvect(9,oldkeyinterrupt);
}

int main()
{

initkeyboard();
outportb(0x64,0x60);
outportb(0x60,0x01);
while(1)
{ gets(KeyData);
if(KeyFlag==1)
{
closekeyboard();

KeyFlag=0;
break;
}

}

}

70,005

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧