有趣的問題 鍵盤打字如何顯示到螢幕中?

2021-10-05 16:30:05 字數 1753 閱讀 7011

鍵盤輸入的內容為什麼會顯示到螢幕上?這其中到底發生了什麼?這個問題很有意思。回答這個問題你的知識儲備越豐富那這條線就越長。這明顯是乙個開放性的話題,在此只嘗試做乙個淺薄的回答。

很顯然這是乙個訊號傳輸的過程,這是一種一一對應的關係,輸入乙個數字顯示乙個數字,輸入一種組合按鍵,會自動翻譯為特定字元。這是通過生活常識和邏輯判斷能得出的結果。

如果是用c寫微控制器軟體,鍵盤掃瞄、oled顯示的過程和這個類似,這是乙個編碼採集->處理->顯示的過程。

如果使用qt/python等,這就是鍵盤事件的識別->處理->更新ui顯示的過程。

對於電腦的作業系統而言,輸入的是鍵盤事件,輸出的是螢幕顯示,這些功能都封裝成了基本的api。深究細節的話,系統是怎麼識別到有鍵盤輸入的?是否有特定的程序在統一管理?螢幕顯示在軟體層面呼叫的最後乙個程式是什麼?它控制的是什麼物理部件?很顯然這是分時的,那系統是怎麼把這些邏輯或者時序有序膠合起來的?

軟體和系統發展的方向都是為了更高效(更方便)組織**或者更充分利用硬體。相反的軟體做的越好越傻瓜越易用,越是掩蓋了其內部的原理/細節,所以即便你知道軟體的每一行**表示什麼那還是不知道到底物理世界發生了什麼,所以這個問題還要繼續往下走。

不管多複雜的裝置、工具都是由最簡單的功能部分組成,沒有人能講到每乙個細節,但是對原理上的大致認識還是要有的。

鍵盤本質上和單板上的按鍵陣列沒有區別,只是整合了編碼模組,編碼的作用可能更多是在於標準化此處不表,編碼並不是直接傳輸到螢幕,而是通過usb這樣的電氣協議,只談硬體那就是一根usb。

按照以上描述方式,電訊號的傳輸到達電腦主機板,訊號經過複雜的電路(晶元)變換,最終將編碼訊號轉換為了一串二進位制儲存在了記憶體或者視訊記憶體中,顯示器顯示的過程實際上是根據這些二進位制資料來不斷重新整理螢幕。

記憶體中的字元編碼對應的用於顯示的二進位制是如何傳輸到vga顯示器的,涉及到vga這樣的電氣協議,物理上是特定字元對應的資訊被翻譯成模擬電壓訊號,通過vga線傳輸到顯示器中。

顯示器電路翻譯了這些模擬電壓,根據模擬電壓的不同實時重新整理著特定畫素點的顏色,由於視覺暫存的效果,很多個畫素點最終拼成了我們看到的字元。

以上,提到usb、vga這些外設傳輸協議,沒有提到usb作為外設->cpu識別之間板內傳輸的各種協議,總之,最終這是將差分的電平訊號轉換為cpu的電平訊號,中間可能有入關的序列,並行傳輸等等。

到了cpu這一塊,就到了晶元設計這個領域,cpu接收到了鍵盤輸入導致的電平訊號之後,怎麼就能轉移資料、邏輯運算了呢?這裡又能設計到板上那些硬體模組呢?這個問題或許太複雜了,那就先排除一下硬碟吧,像硬碟讀寫這類很耗時的io操作是不可能在這瞬間發生的,如果你不ctrl+s,cpu是不會主動吧這個字元儲存到硬碟的。

很顯然,這些能影響顯示的電平資訊是暫存在了某些地方,記憶體或者視訊記憶體就是幹這個事情的,至少這是乙個中介處。

至於cpu為什麼能搬運電平資訊(bit資料)?這是通過cpu指令實現的,cpu指令又是什麼東西?這是一些時序邏輯和組合邏輯電路組成的硬體玩意兒。那時序……太多問題了,那還是先去了解一下計算機的發展史,什麼是打孔紙帶、打孔卡片吧……

或許對事物的理解終究會回到「看山還是山」的境界,難道不是嗎?

這還是訊號傳輸

具體是:鍵盤上的高低電平訊號--(物理線路傳輸、軟體和硬體的協同處理)-->顯示器上的控制畫素點的高低電平訊號

無論電平經過了多少次轉換,在什麼時序(時間點)中轉換,轉換為什麼樣的電壓,最終它變成了一些序列的或者並行的能夠使畫素上的led亮和滅的高低電平。

【最後】

這是2023年,蘇州,和一位醫藥行業的舍友討論的話題,如今翻出來,發現世界依然很大,時間依然太少。

顯示屏的方向設定問題

此文基於stm32f429原子的例程,stm32f429自帶ltdc 液晶控制器,底層驅動在 ltdc.c 中配置。1.在不用emwin顯示的情況下,如果想任意設定螢幕的顯示方向,則應該更改檔案 ltdc.c 中的打點函式,想怎麼顯示修改 lcdltdc.pixsize lcdltdc.pwidth...

printk列印不能顯示到終端的問題

printk列印不能顯示到終端的問題 2011 05 19 16 01 43 分類 linux printk 對於做嵌入式或者熟悉linux 核心的人來說,對printk這個函式一定不會感到陌生。printk相當於printf的孿生姐妹,她們乙個執行在使用者態,另乙個則在核心態被人們所熟知。原型 i...

android 介面是如何顯示到螢幕上的

android 系統提供了一系列的繪圖渲染api,這些api支援2d繪圖和3d繪圖 那麼理解這些api是如何工作的,還是十分重要的。應用開發者最常用的就是canvas和opengl,canvas側重於2d,而opengl則是全能。canvas的繪圖操作最終會通過openglrender進行轉換,轉換...