使用控制台与键盘进行输入输出

news2024/11/26 13:34:17

1、控制台简介与初始化

计算机在上电启动后,显示器被默认配置成80x25列的文本显示模式 。其使用从0xb8000开始,一共32KB的显存用于显示。如要在屏幕上指定位置显示特定的字符,则只需找到该位置对应的显存地址,写入2字节的数据:ascii码和颜色属性字节。

由于一屏共8025个字符,每个字符占用2个字节,所以一屏字符显示需要约4000字节数据。而显存一共32KB,因此这些存储区域可以存储8块屏幕的显示数据。

后续可以通过切换对应的显存屏幕数据。

2、在控制台上显示字符串

采用老式屏幕显示方式,没有采用现在的显卡写。

显示字符,只需要往计算机的显存中写入数据即可。计算机上的显卡会自动从这块区域读取数据,完后控制屏幕显示。

具体显示时,如果需要往屏幕上写字符显示,需要使用两个字节来控制。一个字节用于显示字符,一个字节用于配置显示属性

3、处理换行和清屏

清屏:填入空白字符即可实现清屏功能。即只需要将当前屏幕对应的显存内容全部用空格符号清空,或者用前景色和后景色相同的字符清空

换行:当已经显示满屏时,整个屏幕需要上移滚屏。具体实现采用了非常简单的方式:将整个屏幕区域的数据往上复制一行。

3、设置光标

光标的主要作用是帮助用户感知下一字符显示的位置

在文本模式下,计算机显示硬件自动会提供一个光标,并且经BIOS设置后会显示在屏幕上。但是,当我们在显存上写入字符后,光标并不会自动调整位置。 因此,我们要做的只是随着显示的位置,调整光标的显示位置,无需再初始化。

光标的位置为在整个屏幕中显示的字符符号。在当前的显示模式下,显示范围为80列*25行,因此总共有2000个字符,如果以0开始进行编址,则光标的地址范围为0~1999。即屏幕左上角的位置为0,右下角的位置为1999.

4、保存并恢复光标位置

本小节实现光标位置的保存和恢复,其两个序列如下:

CSI sSCP – 保存光标位置(Save Cursor Position)保存光标的当前位置。
CSI uRCP – 恢复光标位置(Restore Cursor Position)恢复保存的光标位置。

示例:

int main (void) {
 printf("\0337Hello,word!\0338123\n");  // ESC 7,8 输出123lo,word!
 printf("\033[31;42mHello,word!\033[39;49m123\n");  // ESC [pn m, Hello,world红色,>其余绿色
 printf("123\033[2DHello,word!\n");  // 光标左移2,1Hello,word!
 printf("123\033[2CHello,word!\n");  // 光标右移2,123  Hello,word!

 printf("\033[31m");  // ESC [pn m, Hello,world红色,其余绿色
 printf("\033[10;10H test!\n");  // 定位到10, 10,test!
 printf("\033[20;20H test!\n");  // 定位到20, 20,test!
 printf("\033[32;25;39m123\n");  // ESC [pn m, Hello,world红色,其余绿色
}

5、更新显示字体的颜色

| CSI n m | SGR – 选择图形再现(Select Graphic Rendition) | 设置SGR参数 ,包括文字颜色

CSI后可以是0或者更多参数,用分号分隔。如果没有参数,则视为CSI 0 m(重置/常规)。

6、移动光标位置并清屏

CSI n ACUU – 光标上移(Cursor Up)光标向指定的方向移动(默认1)格。如果光标已在屏幕边缘,则无效。
CSI n BCUD – 光标下移(Cursor Down)
CSI n CCUF – 光标前移(Cursor Forward)
CSI n DCUB – 光标后移(Cursor Back)
CSI n ECNL – 光标移到下一行(Cursor Next Line)光标移动到下面第(默认1)行的开头。(非ANSI.SYS
CSI n FCPL – 光标移到上一行(Cursor Previous Line)光标移动到上面第(默认1)行的开头。(非ANSI.SYS)
CSI n GCHA – 光标水平绝对(Cursor Horizontal Absolute)光标移动到第(默认1)列。(非ANSI.SYS)
CSI n ; m HCUP – 光标位置(Cursor Position)光标移动到第n行、第m列。值从1开始,且默认为1(左上角)。例如CSI ;5H和CSI 1;5H含义相同;CSI 17;H、CSI 17H和CSI 17;1H三者含义相同。
CSI n JED – 擦除显示(Erase in Display)清除屏幕的部分区域。如果n是0(或缺失),则清除从光标位置到屏幕末尾的部分。如果n是1,则清除从光标位置到屏幕开头的部分。如果n是2,则清除整个屏幕(在DOS ANSI.SYS中,光标还会向左上方移动)。如果n是3,则清除整个屏幕,并删除回滚缓存区中的所有行(这个特性是xterm
添加的,其他终端应用程序也支持)。

7、键盘初始化

PC机中使用键盘控制器(KBC)处理键盘与鼠标的链接。键盘与鼠标通过KBC与CPU进行通信,并链接到中断控制器IRQ1和IRQ2

通过端口0x60和0x64对KBC进行配置以及读取相应的数据

IO Port读写功能
0x60读/写数据寄存器
0x64只读状态寄存器
0x64只写命令寄存器

其中状态寄存器的值如下

BitMeaning
0输出缓存寄存器(0 = 空,无数据, 1 = 满,有数据)
1输入缓存寄存器(0 = 空,无数据, 1 = 满,有数据)
2系统标志位
3命令或数据(0 = data written to input buffer is data for PS/2 device, 1 = data written to input buffer is data for PS/2 controller command)
4-
5-
6是否发生超时错误 (0 = no error, 1 = time-out error)
7是否发生奇偶校验错误 (0 = no error, 1 = parity error)

在计算机上电后,BIOS会自动完成对键盘相关的初始化,因此我们只需要使用缺省值即可,无需再次初始化

8、借助按键映射表进行键值转换

主要对读取的键值进行转码,并且处理shift健按下时大小写转换的问题

键盘扫描码

当按键按下时,将触发中断,可从中断中读取按键的键值,但是这个值并非按键上的字符丝印对应的字符,而是某种特定编码的数值,这套编码为键盘扫描码集1(Scan Code Set 1),如下表:

Scan codeKeyScan codeKeyScan codeKeyScan codeKey
0x01escape pressed0x021 pressed0x032 pressed
0x043 pressed0x054 pressed0x065 pressed0x076 pressed
0x087 pressed0x098 pressed0x0A9 pressed0x0B0 (zero) pressed
0x0C- pressed0x0D= pressed0x0Ebackspace pressed0x0Ftab pressed
0x10Q pressed0x11W pressed0x12E pressed0x13R pressed
0x14T pressed0x15Y pressed0x16U pressed0x17I pressed
0x18O pressed0x19P pressed0x1A[ pressed0x1B] pressed
0x1Center pressed0x1Dleft control pressed0x1EA pressed0x1FS pressed
0x20D pressed0x21F pressed0x22G pressed0x23H pressed
0x24J pressed0x25K pressed0x26L pressed0x27; pressed
0x28' (single quote) pressed0x29` (back tick) pressed0x2Aleft shift pressed0x2B\ pressed
0x2CZ pressed0x2DX pressed0x2EC pressed0x2FV pressed
0x30B pressed0x31N pressed0x32M pressed0x33, pressed
0x34. pressed0x35/ pressed0x36right shift pressed0x37(keypad) * pressed
0x38left alt pressed0x39space pressed0x3ACapsLock pressed0x3BF1 pressed
0x3CF2 pressed0x3DF3 pressed0x3EF4 pressed0x3FF5 pressed
0x40F6 pressed0x41F7 pressed0x42F8 pressed0x43F9 pressed
0x44F10 pressed0x45NumberLock pressed0x46ScrollLock pressed0x47(keypad) 7 pressed
0x48(keypad) 8 pressed0x49(keypad) 9 pressed0x4A(keypad) - pressed0x4B(keypad) 4 pressed
0x4C(keypad) 5 pressed0x4D(keypad) 6 pressed0x4E(keypad) + pressed0x4F(keypad) 1 pressed
0x50(keypad) 2 pressed0x51(keypad) 3 pressed0x52(keypad) 0 pressed0x53(keypad) . pressed
0x57F11 pressed
0x58F12 pressed
0x81escape released0x821 released0x832 released
0x843 released0x854 released0x865 released0x876 released
0x887 released0x898 released0x8A9 released0x8B0 (zero) released
0x8C- released0x8D= released0x8Ebackspace released0x8Ftab released
0x90Q released0x91W released0x92E released0x93R released
0x94T released0x95Y released0x96U released0x97I released
0x98O released0x99P released0x9A[ released0x9B] released
0x9Center released0x9Dleft control released0x9EA released0x9FS released
0xA0D released0xA1F released0xA2G released0xA3H released
0xA4J released0xA5K released0xA6L released0xA7; released
0xA8' (single quote) released0xA9` (back tick) released0xAAleft shift released0xAB\ released
0xACZ released0xADX released0xAEC released0xAFV released
0xB0B released0xB1N released0xB2M released0xB3, released
0xB4. released0xB5/ released0xB6right shift released0xB7(keypad) * released
0xB8left alt released0xB9space released0xBACapsLock released0xBBF1 released
0xBCF2 released0xBDF3 released0xBEF4 released0xBFF5 released
0xC0F6 released0xC1F7 released0xC2F8 released0xC3F9 released
0xC4F10 released0xC5NumberLock released0xC6ScrollLock released0xC7(keypad) 7 released
0xC8(keypad) 8 released0xC9(keypad) 9 released0xCA(keypad) - released0xCB(keypad) 4 released
0xCC(keypad) 5 released0xCD(keypad) 6 released0xCE(keypad) + released0xCF(keypad) 1 released
0xD0(keypad) 2 released0xD1(keypad) 3 released0xD2(keypad) 0 released0xD3(keypad) . released
0xD7F11 released
0xD8F12 released
0xE0, 0x10(multimedia) previous track pressed
0xE0, 0x19(multimedia) next track pressed
0xE0, 0x1C(keypad) enter pressed0xE0, 0x1Dright control pressed
0xE0, 0x20(multimedia) mute pressed0xE0, 0x21(multimedia) calculator pressed0xE0, 0x22(multimedia) play pressed
0xE0, 0x24(multimedia) stop pressed
0xE0, 0x2E(multimedia) volume down pressed
0xE0, 0x30(multimedia) volume up pressed0xE0, 0x32(multimedia) WWW home pressed
0xE0, 0x35(keypad) / pressed
0xE0, 0x38right alt (or altGr) pressed
0xE0, 0x47home pressed
0xE0, 0x48cursor up pressed0xE0, 0x49page up pressed0xE0, 0x4Bcursor left pressed
0xE0, 0x4Dcursor right pressed0xE0, 0x4Fend pressed
0xE0, 0x50cursor down pressed0xE0, 0x51page down pressed0xE0, 0x52insert pressed0xE0, 0x53delete pressed
0xE0, 0x5Bleft GUI pressed
0xE0, 0x5Cright GUI pressed0xE0, 0x5D"apps" pressed0xE0, 0x5E(ACPI) power pressed0xE0, 0x5F(ACPI) sleep pressed
0xE0, 0x63(ACPI) wake pressed
0xE0, 0x65(multimedia) WWW search pressed0xE0, 0x66(multimedia) WWW favorites pressed0xE0, 0x67(multimedia) WWW refresh pressed
0xE0, 0x68(multimedia) WWW stop pressed0xE0, 0x69(multimedia) WWW forward pressed0xE0, 0x6A(multimedia) WWW back pressed0xE0, 0x6B(multimedia) my computer pressed
0xE0, 0x6C(multimedia) email pressed0xE0, 0x6D(multimedia) media select pressed
0xE0, 0x90(multimedia) previous track released
0xE0, 0x99(multimedia) next track released
0xE0, 0x9C(keypad) enter released0xE0, 0x9Dright control released
0xE0, 0xA0(multimedia) mute released0xE0, 0xA1(multimedia) calculator released0xE0, 0xA2(multimedia) play released
0xE0, 0xA4(multimedia) stop released
0xE0, 0xAE(multimedia) volume down released
0xE0, 0xB0(multimedia) volume up released0xE0, 0xB2(multimedia) WWW home released
0xE0, 0xB5(keypad) / released
0xE0, 0xB8right alt (or altGr) released
0xE0, 0xC7home released
0xE0, 0xC8cursor up released0xE0, 0xC9page up released0xE0, 0xCBcursor left released
0xE0, 0xCDcursor right released0xE0, 0xCFend released
0xE0, 0xD0cursor down released0xE0, 0xD1page down released0xE0, 0xD2insert released0xE0, 0xD3delete released
0xE0, 0xDBleft GUI released
0xE0, 0xDCright GUI released0xE0, 0xDD"apps" released0xE0, 0xDE(ACPI) power released0xE0, 0xDF(ACPI) sleep released
0xE0, 0xE3(ACPI) wake released
0xE0, 0xE5(multimedia) WWW search released0xE0, 0xE6(multimedia) WWW favorites released0xE0, 0xE7(multimedia) WWW refresh released
0xE0, 0xE8(multimedia) WWW stop released0xE0, 0xE9(multimedia) WWW forward released0xE0, 0xEA(multimedia) WWW back released0xE0, 0xEB(multimedia) my computer released
0xE0, 0xEC(multimedia) email released0xE0, 0xED(multimedia) media select released
0xE0, 0x2A, 0xE0, 0x37print screen pressed
0xE0, 0xB7, 0xE0, 0xAAprint screen released
0xE1, 0x1D, 0x45, 0xE1, 0x9D, 0xC5pause pressed

9、

1)每个键按下和弹起时,都会产生扫描码(scan code)

2)扫描码根据字节量可分为三种:

  • 单个字节
  • 以E0开头的2字节或4字节
  • 以E1开头的6字节(只有一两个键)、

3)扫描码根据按下和弹起,又分为:make code,break code,区别是扫描码的最高位第7位是否为1

例如:

  • 当A键按下时,产生扫描码0x1E(第7位为0);断开时,产生扫描码0x9E(第7位为1)

  • 当光标向左键按下时,产生扫描码0xE0, 0x4B(第7位为0);断开时,产生扫描码0xE0, 0xCB(第7位为1)

9、处理caplock键

这个键本身并不任何有效的字符输入,而是用于控制其它键输入的效果。

  • capslock:每按1次转换一下,键上方有对应的大小写指示灯(绿灯亮为大写字母输入模式,反之为小写字母输入模式)。如果shift键和Capslock键一起按时,是小写字母模式

10、其他特殊功能健

在不同的操作系统和应用程序下可能有不同的用户,例如在浏览器中,F1键可能是用于打开帮助页面。我们现在是在键盘驱动程序中编写代码,F1等功能键不对应于任何具体的字符,也不对应具体的功能;因此,目前只是在代码中将其识别出来,具体有什么用可以留等以后扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2092519.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ctfshow之web58~web71

目录 web58 思路一: 思路二: 思路三: web59~web65 web66~web67 web68~web70 web71 web58 if(isset($_POST[c])){$c $_POST[c];eval($c); }else{highlight_file(__FILE__); } PHP eval() 函数介绍 定义和用法 eval() 函数把字符串按…

【Sceneform-EQR】通过filament(gltfio)加载gltf模型动画(Filament使用Animator)

Sceneform-EQR 简介 Sceneform-EQR是EQ基于sceneform(filament)扩展的一个用于安卓端的三维渲染器。 相关链接 Git仓库 Sceneform-EQR 码云 EQ-Renderer的示例工程 EQ-R相关文档 文档目录CSDN专栏 实现通过filament加载gltf模型动画 运行示例 …

U盘无法访问?揭秘原因与高效恢复策略

一、U盘困境深度剖析 在日常的数字生活中,U盘作为我们存储和传输数据的重要工具,其重要性不言而喻。然而,当U盘突然显示“无法访问”时,这种突如其来的困境往往让人措手不及。U盘无法访问的现象可能由多种原因造成,包…

Question mutiple pdf‘s using openai, pinecone, langchain

题意:使用 OpenAI、Pinecone 和 LangChain 对多个 PDF 文件进行提问。 问题背景: I am trying to ask questions against a multiple pdf using pinecone and openAI but I dont know how to. 我正在尝试使用 Pinecone 和 OpenAI 对多个 PDF 文件进行提…

ssh远程连接服务

1、概述 一种安全访问远程服务器的协议,远程管理工具,通过加密方式管理连接,使服务器更安全。 2、加密算法 对称加密 发送密码前将密码数据加密成密文,然后发送出去 接收方收到密文后,使用同一个密钥将密文解密。…

基于爬山法MPPT和PI的直驱式永磁同步风力发电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 PMSM 4.2 MPPT 4.3 PI 控制器原理 5.完整工程文件 1.课题概述 基于爬山法最大功率点跟踪 (Maximum Power Point Tracking, MPPT) 和比例积分控制器 (Proportional Integral, PI) 的直驱式永磁同步…

《软件工程导论》(第6版)第5章 总体设计 复习笔记

第5章 总体设计 一、总体设计概念 1.定义 总体设计的基本目的就是回答“系统应该如何实现”这个问题,总体设计又称为概要设计或初步设计。 2.主要任务 (1)划分出组成系统的物理元素程序、文件、数据库、人工过程…

大模型种草书籍——BERT基础教程:Transformer大模型实战,看完头皮发麻!

《BERT基础教程:Transformer大模型实战》 是一本专注于介绍自然语言处理(NLP)领域的先进技术——BERT(Bidirectional Encoder Representations from Transformers)及其应用的教程书籍。 以下是这本书的简要介绍&#…

C++:string类(1)

1.标准库中的string类 1.1 string类(了解) string类的文档介绍在使用string类时,必须包含#include头文件以及using namespace std; 1.2 auto和范围for auto关键字 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型…

gdb 教程

文章目录 GDB启动 GDB 的方法GDB 命令工具参考 GDB GDB是Linux下的调试工具,可以调试C、C、Go、java等语言 GDB提供了以下四个功能: 程序启动时,可以按照自定义的要求运行程序,如设置参数和环境变量可以让被调试的程序在所指定…

Netflix Feign:微服务HTTP调用如何简化?

Netflix Feign:微服务HTTP调用如何简化? 1、什么是Netflix Feign?2、Feign的优点3、示例4、总结 💖The Begin💖点点关注,收藏不迷路💖 1、什么是Netflix Feign? Feign是一个声明式的…

MFC工控项目实例之十添加系统测试对话框

承接专栏《MFC工控项目实例之九选择下拉菜单主界面文本框显示菜单名》 参考前期我的博客文章《MFC3d立体按钮制作》 这里只给出相关代码 1、在SysTest.h文件中添加代码 #include "ShadeButtonST.h" #include "BtnST.h" class CSysTest : public CDialog {…

OpenAI“草莓”模型及全能型与专业型AI的思考

一、OpenAI“草莓”模型的全能性及其未来趋势 近日,OpenAI预计在秋季推出的代号为“草莓”的新AI模型,展现了其在自然语言处理(NLP)和深度学习领域的又一重大突破。该模型不仅增强了推理能力,还提供了更为人性化的互动…

穿越Java世界的继承奇旅:从基类到子类的华丽蜕变

1.为什么要继承 2.什么是继承以及继承的方式 3.继承的一些语法 4.父类成员的访问 5.关键字super 6.关键字protected 7.关键字final 8.继承与组合 一:为什么要继承 ①代码重用:继承允许我们重用、扩展或修改父类的属性和方法,而无需重…

<Rust>egui学习之小部件(四):如何在窗口中添加滚动条Scroll部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统:windows 平台:visual studio code 语言:rust 库:egui、eframe 概述 本文是本专栏的第四篇博…

【C++ Primer Plus习题】7.10

问题: 解答: #include <iostream> using namespace std;double add(double a, double b) {return a b; }double mul(double a, double b) {return a * b; }double sub(double a, double b) {return a - b; }double div(double a, double b) {return a / b; }double cal…

[LLM]:大模型(Transformer)参数量分析

1. 前言2. 模型参数量 文章内容主要摘自&#xff1a;https://zhuanlan.zhihu.com/p/624740065 1. 前言 最近&#xff0c;OpenAI推出的ChatGPT展现出了卓越的性能&#xff0c;引发了大语言模型(Large Language Model, LLM)的研究热潮。大规模语言模型的“大”体现在两个方面&am…

Python编码系列—Python代码重构:提升代码质量

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

Leetcode面试经典150题-151.反转字符串中的单词

class Solution {public String reverseWords(String s) {/**先trim一下去掉前后的空格*/String str s.trim();/**转成字符数组 */char[] sArr str.toCharArray();/**先整体倒置*/int l 0;int r sArr.length - 1;reverse(sArr, l, r);/**然后每个单词中逆序 */int left 0;…

SAM 提示框和 Unet的语义分割的融合:自动驾驶车道线分割

1、前言 最近SAM 模型复现的多了&#xff0c;看了不少官方的源码&#xff0c;尝试下SAM和Unet的结合 SAM的提示分割&#xff0c;其实就是在分割的时候&#xff0c;为数据增加一个提示信息&#xff0c;可以是框&#xff0c;点&#xff0c;或者文本等等。这样大模型网络就可以根…