如何向键盘端口写数据?

briar 2004-03-22 07:14:43
请教各位大虾,我想向键盘端口写数据以控制键盘指示灯的开关,不知该如何来做?!另外不知那里有关于Bland c++ 3.1方面以及基本的基于DOS的控制电脑各种硬件方面编程的书籍?
...全文
215 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnxiaohai 2004-03-25
  • 打赏
  • 举报
回复
还是用汇编吧

看看90年代初的C语言书吧

那些里面有很多这样的程序
dodog 2004-03-23
  • 打赏
  • 举报
回复
up
柯本 2004-03-23
  • 打赏
  • 举报
回复
如果要在windows下直接访问端口,可用dlportio或winio
nickadams 2004-03-23
  • 打赏
  • 举报
回复
键盘port是60h(数据寄存器)和61h(控制寄存器),但不记得是否能够通过该port写键盘。
我以前一般通过bios的键盘缓冲区来向键盘写数据:
0040:001A 键盘缓冲区读出位置
0040:001C 键盘缓冲区写入位置
0040:0080 键盘缓冲区起始位置
0040:0082 键盘缓冲区结束位置

写键盘:
mov es, 40h
mov bx, es:[1Ch]
mov es:[bx], ax ; ax - 键值
add bx, 2
cmp bx, 3Eh ; 3Eh is keyboard buffer end
jb no@wrap
mov bx, 1EH ; 1Eh is keyboard buffer start
no@wrap:
cmp bx, es:[1Ah]
je end
mov es:[1Ch], bx
end:
briar 2004-03-23
  • 打赏
  • 举报
回复
能否直接访问端口不使用BIOS,我不一定仅仅访问Caps Lock, Num Lock其它输出亦有可能要做!如何嵌入汇编向键盘端口发送数据还请各位大虾不吝赐教!!!
SCUM 2004-03-23
  • 打赏
  • 举报
回复

同意楼上
nickadams 2004-03-23
  • 打赏
  • 举报
回复
是要控制Caps Lock, Num Lock等吗?
如果是Windows程序,可以使用keybd_event来模仿按下、释放VK_CAPSLOCK键:
// Simulate a key press
keybd_event( VK_NUMLOCK,
0x45,
KEYEVENTF_EXTENDEDKEY | 0,
0 );

// Simulate a key release
keybd_event( VK_NUMLOCK,
0x45,
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
0);


如果是DOS程序,直接访问bios的键盘状态字(位于0040:0017/0018/0096处):

mov es, 40h
and BYTE PTR es:[17h], 10111111b ; 关Caps Lock
or BYTE PTR es:[17h], 01000000b ; 开Caps Lock
Wolf0403 2004-03-23
  • 打赏
  • 举报
回复
如果是说向标准输入流写入字符,则 cin.putback(char) 可以实现这个功能。
C 和硬件级别的偶不晓得。。。
redbad2 2004-03-22
  • 打赏
  • 举报
回复
在C里面嵌套汇编吧!
junnyfeng 2004-03-22
  • 打赏
  • 举报
回复
up
zzlouiszz 2004-03-22
  • 打赏
  • 举报
回复
sorry I used to VC++ studio 6.0 usually!
Bland c++ 我不是很行。

69,373

社区成员

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

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