接下來我們再來看另一個(gè)硬件,液晶顯示器LCD1602(對,我就是這么迷你):
關(guān)于這款顯示器,我們需要知道的是:
它是有引腳的,這些引腳可以跟到前面介紹的那款單片機(jī)芯片的引腳相連。
該顯示器有自帶的內(nèi)存,用于存儲(chǔ)要顯示的字符,顯示器從該內(nèi)存里面讀取字符來來顯示。
單片機(jī)芯片與該顯示器相連后,可以通過引腳往該顯示器的內(nèi)存里寫數(shù)據(jù)(通過多個(gè)引腳電平的高低不同來代表不同的數(shù)據(jù),比如說:低高高低低低低高 代表01100001,這個(gè)數(shù)據(jù)寫在顯示器的內(nèi)存里面,被顯示器所顯示,當(dāng)然,會(huì)根據(jù)ASCII來顯示數(shù)字對應(yīng)的字符,01100001對應(yīng)的字符是‘a(chǎn)’),除了接收數(shù)據(jù)的引腳外,還有控制顯示器的引腳(這個(gè)我們會(huì)在驅(qū)動(dòng)那里介紹,繼續(xù)往下看)。
結(jié)論:單片機(jī)芯片與顯示器相連,可以通過引腳輸出的電平來控制顯示器的字符顯示。
那么,綜合上面,也就是說,單片機(jī)芯片cpu可以通過執(zhí)行指令來控制顯示器的字符顯示。
而這里,題主所說的硬件,指的就是這個(gè)顯示器了。
接下來講驅(qū)動(dòng):
那么,什么是驅(qū)動(dòng)呢?驅(qū)動(dòng)無非就是硬件跟軟件的中間層,但我們不糾結(jié)這種關(guān)系,直接來看一下,對于我們這個(gè)例子,驅(qū)動(dòng)指的是什么。首先我們要知道:
顯示器支持很多種操作,比如說清除顯示,光標(biāo)移動(dòng),讀取數(shù)據(jù),寫數(shù)據(jù)等等。
這些操作數(shù)據(jù)引腳和控制引腳來實(shí)現(xiàn)。
引腳可以通過單片機(jī)芯片來控制。
結(jié)論:我們可以通過在單片機(jī)芯片里面寫顯示器的“驅(qū)動(dòng)”程序來屏蔽掉硬件(顯示器硬件)層。
于是這里驅(qū)動(dòng)程序,指的是顯示器所支持操作的程序表示。比如說清除顯示,我們可以編寫一個(gè)clear()函數(shù),光標(biāo)移動(dòng),我們編寫一個(gè)move_cursor()函數(shù),讀取數(shù)據(jù)和寫數(shù)據(jù)分別為read()和write(),然后分別實(shí)現(xiàn)就可以了(通過向寄存器里寫數(shù)據(jù)的形式,進(jìn)而控制引腳的電平變化,再而控制顯示器,這個(gè)過程前面已有介紹)。這些函數(shù)就是驅(qū)動(dòng)程序了。為什么上面說驅(qū)動(dòng)程序可以屏蔽掉硬件呢?因?yàn)槌绦騿T可以使用前面的驅(qū)動(dòng)程序來直接操作顯示器(硬件),而不用知道太多關(guān)于硬件的事情,而一般的驅(qū)動(dòng)程序也可以由廠家來提供。
再說明一點(diǎn):一般這些驅(qū)動(dòng)程序可以用匯編寫(出于運(yùn)行效率的考慮),也可以用C語言來編寫的,比如說我上面的例子,就可以直接用C語言來編寫。當(dāng)然C語言內(nèi)聯(lián)匯編的形式也可以。
最后講C語言怎么操作硬件:
相信到這里,C語言是怎么操作硬件的已經(jīng)比較明白了。
這里總結(jié)一下:
C語言由CPU運(yùn)行(實(shí)際上是先編譯成機(jī)器碼存在芯片里面然后執(zhí)行),可以去操作內(nèi)存。
內(nèi)存里有一段是跟寄存器相對應(yīng)的,而寄存器是跟芯片的引腳相對應(yīng)的,于是操作該段內(nèi)存就能控制芯片引腳的電壓變化。
硬件(比如說顯示器)有引腳(或者說排線,這些也是一樣的東西),這些引腳跟芯片的引腳相連可以接受芯片的控制。
可以把對某個(gè)硬件的操作做成一系列操作函數(shù),這些操作函數(shù)就是驅(qū)動(dòng)程序了。
于是我們的C語言只要去調(diào)用這個(gè)驅(qū)動(dòng)程序就可以直接操作硬件了。(當(dāng)然驅(qū)動(dòng)程序也可以由C語言來編寫,所以C語言操作硬件并不一定要經(jīng)過驅(qū)動(dòng)程序)。