版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 測控網(wǎng)絡(luò)通信系統(tǒng)與人機(jī)交互設(shè)計(jì)接口</p><p><b> 設(shè)計(jì)任務(wù)書</b></p><p><b> 設(shè)計(jì)題目</b></p><p> 測控網(wǎng)絡(luò)通信系統(tǒng)及人機(jī)交互接口設(shè)計(jì)設(shè)計(jì)目標(biāo)</p><p> 實(shí)現(xiàn)測控系統(tǒng)的人機(jī)交互接口的硬件電路與軟件設(shè)計(jì)、實(shí)現(xiàn)測控節(jié)
2、點(diǎn)的互通信以及節(jié)點(diǎn)與上位機(jī)PC通信的硬件電路以及軟件設(shè)計(jì)。設(shè)計(jì)內(nèi)容</p><p> 1、實(shí)現(xiàn)兩個(gè)按鍵輸入;2、實(shí)現(xiàn)4位LED顯示輸出;3、采用RS485協(xié)議實(shí)現(xiàn)單片機(jī)與單片機(jī)遠(yuǎn)距離互通信;4、實(shí)現(xiàn)單片機(jī)與PC的串口通信協(xié)議轉(zhuǎn)換與通信;5、利用按鍵控制通信進(jìn)程、利用LED顯示通信數(shù)據(jù)。設(shè)計(jì)要求1、按鍵的檢測與去抖動(dòng)電路及C語言軟件編程;2、LED數(shù)碼管的接口電路設(shè)計(jì)及C語言軟件編
3、程;3、通信協(xié)議轉(zhuǎn)換元件的選擇與電路設(shè)計(jì);4、通信過程的C語言編程;5、51單片機(jī)系統(tǒng)的時(shí)鐘與復(fù)位部分元器件選擇與設(shè)計(jì);6、按鍵調(diào)度通信過程的程序設(shè)計(jì);7、通信數(shù)據(jù)的LED顯示;8、說明書中完整給出方案原理、元器件選擇與計(jì)算、電路原理圖和程序描述。</p><p> 摘要:針對我國小企業(yè)的特點(diǎn),提出了以RS-485 總線方式的測控網(wǎng)絡(luò),給出了測控網(wǎng)絡(luò)的網(wǎng)絡(luò)結(jié)構(gòu)。PC 主機(jī)使用Visual
4、 Basic軟件開發(fā),重點(diǎn)討論了利用VB的MSComm 通信控件實(shí)現(xiàn)PC 機(jī)與多測控節(jié)點(diǎn)之間的通信。 </p><p> 關(guān)鍵詞:節(jié)點(diǎn);MSComm 控件;VB;RS-485 :</p><p><b> 系統(tǒng)設(shè)計(jì)的意義:</b></p><p> 根據(jù)我國的具體情況,各廠商在選擇網(wǎng)絡(luò)結(jié)構(gòu)時(shí)通常是按隸屬關(guān)系確定網(wǎng)絡(luò)形式。例如 隸屬郵電行業(yè)
5、的企業(yè)優(yōu)選電話網(wǎng),隸屬廣播電視行業(yè)的企業(yè)優(yōu)選有線電視網(wǎng)絡(luò),而電力行業(yè) 的企業(yè)優(yōu)選電力配電網(wǎng)。不屬于上述行業(yè)的企業(yè)未經(jīng)許可不大可能進(jìn)入這幾種專業(yè)網(wǎng)絡(luò)。在這種情況下一般有兩種解決方案:一是借助與網(wǎng)絡(luò)公司聯(lián)盟進(jìn)入公共網(wǎng)絡(luò),二是做自己的現(xiàn)場總線。目前,現(xiàn)場總線技術(shù)雖然取得了很大成績,但還是存在一些問題,主要體現(xiàn)在工程應(yīng)用方面。在我國,大多數(shù)企業(yè)生產(chǎn)規(guī)模還比較小,各種現(xiàn)場總線都把降低成本作為主要追求目標(biāo),但據(jù)許多已經(jīng)投入應(yīng)用的企業(yè)反映,實(shí)際現(xiàn)場總
6、線的系統(tǒng)開銷比傳統(tǒng)RS-485總線要大。這里可能有兩個(gè)問題,一是使用的系統(tǒng)規(guī)模太小,從制造商處得到的折扣少;二是使用的系統(tǒng)多沿用原有布線的習(xí)慣,因此無法充分發(fā)揮現(xiàn)場總線節(jié)省線纜的優(yōu)勢。又由于現(xiàn)場總線包含許多新的技術(shù)內(nèi)容,中小企業(yè)往往因人才方面的劣勢等原因,在調(diào)試、運(yùn)行和維護(hù) 方面經(jīng)常會(huì)遇到困難。 基于以上情況,有必要開發(fā)一種結(jié)構(gòu)簡單、價(jià)格低廉、便于維護(hù)的RS-485 總線網(wǎng)絡(luò)測 控系統(tǒng),網(wǎng)絡(luò)節(jié)點(diǎn)采用AT89C52 單片機(jī),PC 主機(jī)采用
7、VB 編程,因VB 功能強(qiáng)大,</p><p><b> 1系統(tǒng)組成:</b></p><p> 在測控系統(tǒng)的實(shí)際設(shè)計(jì)中,首先是系統(tǒng)網(wǎng)絡(luò)的設(shè)計(jì),RS-485總線方式有結(jié)構(gòu)簡單、工 作可靠、通信速率高(最大10Mbps)、距離遠(yuǎn)(不加中繼最遠(yuǎn)可達(dá)1200m)等諸多優(yōu)點(diǎn),在目前的測控網(wǎng)絡(luò)中得到了廣泛的應(yīng)用。綜合考慮施工環(huán)境的具體情況和系統(tǒng)可靠性,我們選擇 RS-485
8、總線方式作為測控系統(tǒng)的網(wǎng)絡(luò)結(jié)構(gòu),降低了系統(tǒng)復(fù)雜性,減少了成本。測控節(jié)點(diǎn)與主控PC 機(jī)采用RS-485 總線式網(wǎng)絡(luò)結(jié)構(gòu),主控PC機(jī)的COM 串行通信端口通過RS232/RS-485轉(zhuǎn)換器與RS-485 網(wǎng)絡(luò)相連,以半雙工方式工作,最大傳輸距離可達(dá) 1200m,波特率在1200 和38400b/s 間可設(shè)置,RS-485 網(wǎng)絡(luò)采用一對有補(bǔ)償?shù)碾p絞線。測控節(jié)點(diǎn)采用AT89C52單片機(jī),片中串行口加MAX487 轉(zhuǎn)換器,連接到RS-4
9、85網(wǎng)絡(luò),以半雙工方式與主控PC機(jī)通信。PC 機(jī)本身并不具備專用的RS-485通信口,其對外的兩個(gè)串口COM1、COM2 都是專門為RS-232 通信而設(shè)置的。由于RS-485與RS-232 的工作電平不相同,工作方式與控制機(jī)理也有差別,故而想利用現(xiàn)成的COM1、COM2串口來實(shí)現(xiàn)RS-48</p><p> 2 PC 主機(jī)與節(jié)點(diǎn)群之間串行通信的實(shí)現(xiàn) </p><p> 2.1 利用
10、VB6.0 提供MSComm 通信控件訪問串口 </p><p> 通過VB6.0 中通信控件的屬性設(shè)置數(shù)據(jù)傳輸率,奇偶校驗(yàn),緩沖區(qū)容量等,通過方法 和事件發(fā)送、接收數(shù)據(jù)和控制命令。 </p><p><b> ?。?)主要屬性設(shè)置</b></p><p> Commport:設(shè)置通信連接端口代號 </p><p>
11、 Settings:以字符串的形式設(shè)置或回傳“BBBB ,P ,D ,S” </p><p> PortOpen:通信連接端口狀態(tài) </p><p> Input:從輸入寄存器傳回并移除字符 </p><p> Output:將一個(gè)字符串寫入輸出寄存器 </p><p> Inputlen:指定由串行端口讀入的字符串長度 </
12、p><p> InBufferCount:已接收并在接收寄存器等待讀取的字符數(shù) </p><p> InputMode: ComInputModeText 0 以文字字符串形式取回 ComInputModeBinary 1 二進(jìn)制形式取回 </p><p> ?。?)利用VB 中的MSComm 的Settings 屬性的動(dòng)態(tài)設(shè)置,實(shí)現(xiàn)多機(jī)通信 在屬性
13、中尤其值得注意的是MSComm 控件中的Settings 屬性,其值的格式為“BBBB, P,D,S”。 </p><p> ?、貰BBB 為傳輸波特率如,9600bps,2400bps 等。 </p><p> ?、赑 為奇偶方式設(shè)定位,其值為E(偶校驗(yàn)位Even )、M 記號Mark )、N(默認(rèn)值Default )、 None(無奇偶校驗(yàn))、O(奇校驗(yàn)Odd)和S(空白Space)五
14、種。 </p><p> ?、跠 位數(shù)據(jù)位數(shù),其值有4,5,6,7,8 五種。 </p><p> ④S 為停止位數(shù),其值有1,1.5,2 三種。 </p><p> 一般認(rèn)為,VB6.0 的通信控件MSComm 只能實(shí)現(xiàn)雙機(jī)通信,而無法實(shí)現(xiàn)對分布式網(wǎng)絡(luò)節(jié)點(diǎn)群的控制,因而只能另覓他徑,如通過動(dòng)態(tài)鏈接庫(DLL )技術(shù)等。另一方面,由于 PC 機(jī)系統(tǒng)配置的串行接口
15、芯片,不論是早期的8250 還是后來的16C450 或16C55無多機(jī)工作的模式(即串行通信幀格式中無地址/數(shù)據(jù)使能位定義)。因此,在PC 機(jī)允許的串行通信幀格式中,利用奇偶校驗(yàn)來模擬產(chǎn)生多機(jī)系統(tǒng)中必須的地址/數(shù)據(jù)使能位,可以實(shí)現(xiàn)對分布式節(jié)點(diǎn)群的控制。通過對VB6.0 環(huán)境下的串行通信控件MSComm 屬性以及串行信息幀 格式的深入研究,提出了直接利用串行通信控件MSComm 的有關(guān)屬性,保證串行通信幀的 奇偶位隨傳送地址或數(shù)據(jù)的變化而
16、動(dòng)態(tài)變化。 </p><p> 實(shí)現(xiàn)方式:可通過動(dòng)態(tài)設(shè)定MSComm 控件的Settings 屬性中的奇偶方式,以串行通信 幀中奇偶位的變化來模擬多機(jī)通信時(shí)地址/數(shù)據(jù)使能位的變化,當(dāng)發(fā)送地址幀時(shí)設(shè)定奇偶校 驗(yàn)位為“1”,發(fā)送數(shù)據(jù)幀時(shí)設(shè)定奇偶校驗(yàn)位“0”。 </p><p> 具體有兩種實(shí)現(xiàn)方法: </p><p> 方法一:對于每次要發(fā)送的8bit 數(shù)據(jù),根據(jù)
17、發(fā)送地址幀和數(shù)據(jù)幀的要求,確定待發(fā)送數(shù)據(jù)類型,動(dòng)態(tài)設(shè)定串行通信奇偶校驗(yàn)為奇校驗(yàn)或偶校驗(yàn)。 </p><p> 方法二:利用MSComm 控件的Settings 屬性中奇偶設(shè)置方式位P的“M(Mark )”或“S(Space)”值來實(shí)現(xiàn),發(fā)送地址幀時(shí)設(shè)置奇偶方式位P 值為M,而發(fā)送數(shù)據(jù)幀時(shí)設(shè)定奇偶方式位P 值為S。 </p><p> 以上兩種方法均以犧牲串行信息幀的奇偶校驗(yàn)功能為代價(jià),
18、本系統(tǒng)中用簡單且行之有效 的“累加和校驗(yàn)”方法。 </p><p> ?。?)PC 機(jī)串行通信初始化(以上述方法二為例) </p><p> 在VB6.0 的環(huán)境下,直接利用MSComm 串行通信控制Settings 屬性中的奇偶方式位P, 通過動(dòng)態(tài)改變P 的值,選M(Mark)或S(Space)來模擬串行信息幀的地址/數(shù)據(jù)使能位,從而 實(shí)現(xiàn)對網(wǎng)絡(luò)多節(jié)點(diǎn)的控制。 </p>
19、<p><b> 其屬性設(shè)置為: </b></p><p> ①M(fèi)SComm1.Settings=“9600,m,8,1” ‘波特率9600bps,MARK 狀態(tài)(地址使能位),8位數(shù)據(jù)位,1位停止位 </p><p> ?、贛SComm1.Settings=“9600,s,8,1”‘波特率9600bps,SPACE 狀態(tài)(數(shù)據(jù)使能位),8位數(shù)據(jù)位,1位
20、停止位 </p><p> ?、跧nBufferCount:傳回在接收寄存器中的字符,InBufferCount 屬性設(shè)為0,用來清除寄存器。 </p><p> ?、躀nputMode:設(shè)置或傳回Input 屬性取回的數(shù)據(jù)的形式。 </p><p> ComInputModeText: 0 以文字形式取回 </p><p> Com
21、InputModeBinary: 1 以二進(jìn)制形式取回 </p><p><b> 2.2 程序設(shè)計(jì) </b></p><p><b> 發(fā)送數(shù)據(jù)過程: </b></p><p> 發(fā)送端口號 發(fā)送從機(jī)地址 發(fā)送命令及數(shù)據(jù) 等待 接收從機(jī)回應(yīng) 判斷地址
22、 完成 </p><p><b> 接收數(shù)據(jù)過程: </b></p><p> 發(fā)送端口號 發(fā)送從機(jī)地址 發(fā)送命令 等待 接收從機(jī)地址及數(shù)據(jù) 判斷地址 判斷校驗(yàn)和 完成 </p><p><b> 發(fā)送程序?yàn)槔?</b></p><
23、;p> Dim OutB( ) As Byte, InB( ) As Byte ’定義動(dòng)態(tài)數(shù)組 </p><p> MSComm1.CommPort = RS(1)’從數(shù)據(jù)庫中取出端口號 </p><p> If MSComm1.PortOpen = False Then ’開端口 </p><p> MSComm1.PortOpen = True &
24、lt;/p><p><b> End If </b></p><p> MSComm1.Settings = "9600,M,8,1" </p><p> MSComm1.SThreshold = 1 </p><p><b> Flag = 0 </b></p>
25、<p> MSComm1.Output = Chr(RS(2))’從數(shù)據(jù)庫取從機(jī)地址并發(fā)送地址 </p><p> Timer1.Interval = 50 </p><p> Timer1.Enabled = True </p><p><b> Do </b></p><p> Loop Un
26、til Flag <> 0 </p><p> If Flag = 9 Then </p><p> MsgBox "發(fā)送數(shù)據(jù)錯(cuò)誤!" </p><p> MSComm1.PortOpen = False </p><p><b> Exit Sub </b></p>
27、<p><b> End If </b></p><p> MSComm1.Settings = "9600,S,8,1" </p><p> MSComm1.InBufferCount = 0 </p><p> ReDim OutB(0 To 8) </p><p> {Ou
28、tB 數(shù)組賦值} </p><p> MSComm1.Output = OutB ’發(fā)送命令及數(shù)據(jù) </p><p> Timer1.Interval = 50 ’延時(shí) </p><p> Timer1.Enabled = True </p><p><b> D
29、o </b></p><p><b> DoEvents </b></p><p> Loop Until MSComm1.InBufferCount >= 1 Or Flag = 9 ’接收字符>=1 或定時(shí)時(shí)間到 </p><p><b> {接收校驗(yàn)} </b></p>&
30、lt;p> ?、儆捎赑C 主機(jī)與節(jié)點(diǎn)之間傳送的數(shù)據(jù)量比較大,通常用二進(jìn)制的方式來傳輸數(shù)據(jù),并 且將數(shù)據(jù)首先存入一個(gè)形式為Byte 的動(dòng)態(tài)數(shù)組中,然后在將此動(dòng)態(tài)數(shù)組傳送出去。 </p><p> ?、谠诿看蝹鬏斆詈螅却欢螘r(shí)間,才可能得到節(jié)點(diǎn)機(jī)的應(yīng)答,通過計(jì)算節(jié)點(diǎn)機(jī)響應(yīng) 時(shí)間以及反復(fù)試驗(yàn)確定最佳等待時(shí)間,測試中最佳等待時(shí)間為50ms,發(fā)送節(jié)點(diǎn)機(jī)地址的等 待時(shí)間為50ms,在接收節(jié)點(diǎn)機(jī)地址及數(shù)據(jù)時(shí)等待時(shí)間為
31、200ms。 </p><p> ③在PC 主機(jī)接收節(jié)點(diǎn)機(jī)回應(yīng)時(shí),利用一條等待循環(huán)語句來判斷InBufferCount 的字符數(shù) 和等待時(shí)間。 </p><p> ?、芙邮諗?shù)據(jù)時(shí),用一條循環(huán)語句將動(dòng)態(tài)數(shù)組中的數(shù)據(jù)取出,并將數(shù)據(jù)轉(zhuǎn)換排序按照十進(jìn) 制順序放入數(shù)據(jù)庫相應(yīng)表中。 </p><p> 3.人機(jī)交互接口設(shè)計(jì)</p><p> 人機(jī)接
32、口是計(jì)算機(jī)同人機(jī)交互設(shè)備之間實(shí)現(xiàn)信息傳輸?shù)目刂齐娐贰=涌谥幸謩e傳送數(shù)據(jù)信息、命令信息和狀態(tài)信息。數(shù)據(jù)信息、命令信息和狀態(tài)信息都通過數(shù)據(jù)總線來傳送。大多數(shù)計(jì)算機(jī)都把外設(shè)的狀態(tài)信息視為輸入數(shù)據(jù),而把命令信息看成輸出數(shù)據(jù),并在接口中分設(shè)各自相應(yīng)的寄存器,賦以不同的端口地址,各種信息分時(shí)地使用數(shù)據(jù)總線傳送到各自的寄存器中去。在嵌入式系統(tǒng)中,目前常見的人機(jī)接口設(shè)備有鍵盤、LCD、觸摸屏、鍵盤輸入接口</p><p>
33、在ARM嵌入式系統(tǒng)應(yīng)用中,鍵盤是人機(jī)交互對話最通用的方法之一。操作者通過鍵盤向系統(tǒng)發(fā)送各種指令或置入必要的數(shù)據(jù)信息。鍵盤模塊設(shè)計(jì)的好壞,直接關(guān)系到系統(tǒng)的可靠性和穩(wěn)定性。</p><p> 在ARM應(yīng)用系統(tǒng)中,鍵盤掃描只是ARM的工作內(nèi)容之一,ARM在忙于各項(xiàng)工作任務(wù)的同時(shí),如何兼顧鍵盤的輸入,則取決于鍵盤的工作方式。鍵盤工作方式的選取原則是既要保證能及時(shí)響應(yīng)按鍵操作,又要不過多占用ARM的工作時(shí)間。</p
34、><p><b> 3.1按鍵接口:</b></p><p> 通常的標(biāo)準(zhǔn)鍵盤是由許多按鍵開關(guān)組成的。按鍵開關(guān)電路是指通過外力使電路瞬時(shí)接通的開關(guān),在許多場合都有應(yīng)用。比如大多數(shù)處理器的RESET電路都用到了按鍵開關(guān),它通過按鍵產(chǎn)生一個(gè)瞬時(shí)的低電壓,CPU感知這個(gè)低電壓后重啟。在有些系統(tǒng)中也用按鍵開關(guān)切換工作模式,它通過按鍵開關(guān)生成一個(gè)低壓脈沖,產(chǎn)生一次中斷,在中斷處
35、理程序中改變工作模式,并且通過置外部標(biāo)志的方式告知用戶當(dāng)前的工作模式,通過切換開關(guān),就可以實(shí)現(xiàn)在不同工作模式之間進(jìn)行切換。</p><p> 3.1.1 按鍵原理:</p><p> 按鍵開關(guān)的電路如圖6.1所示。</p><p> 圖3.1 按鍵開關(guān)電路示意圖</p><p> 當(dāng)按鍵斷開時(shí),輸出高電壓,為邏輯1;當(dāng)按鍵按下時(shí),電平
36、輸出點(diǎn)與地相連,輸出低電平,為邏輯0。</p><p> 如圖3.1所示的按鍵開關(guān)電路是最簡單的,遺憾的是,它并不完善,因?yàn)樗聪禄蛘弑会尫艜r(shí),并不能明確地產(chǎn)生一個(gè)邏輯0或者邏輯1。由于按鍵是機(jī)械觸點(diǎn),當(dāng)機(jī)械觸點(diǎn)斷開、閉合時(shí),會(huì)產(chǎn)生抖動(dòng)。</p><p> 這種抖動(dòng)對于用戶來說是感覺不到的,但對計(jì)算機(jī)來說,則是完全可以感應(yīng)的。計(jì)算機(jī)處理的速度是在微秒級,而機(jī)械抖動(dòng)的時(shí)間至少是毫秒級,這
37、對計(jì)算機(jī)而言,已是一個(gè)“漫長”的時(shí)間了。假如利用按鍵開關(guān)產(chǎn)生中斷可能就會(huì)產(chǎn)生一個(gè)問題,就是說按鍵有時(shí)靈,有時(shí)不靈,其實(shí)就是這個(gè)原因。有可能只按了一次按鍵,可是計(jì)算機(jī)卻已執(zhí)行了多次中斷的操作。</p><p> 為使CPU能正確地讀出按鍵的狀態(tài),對每一次按鍵只作一次響應(yīng),就必須考慮如何去除抖動(dòng)。常用的去除抖動(dòng)方法有軟件方式和硬件方式兩種。</p><p> 對于簡單的按鍵電路,可以采用軟
38、件方法去除抖動(dòng)。軟件方法其實(shí)很簡單,就是在程序獲得外接端口為低的信息后,不是立即認(rèn)定按鍵已被按下,而是延時(shí)10毫秒或者更長一段時(shí)間后再次檢測外部端口,如果仍為低,說明按鍵的確按下了,這實(shí)際上是避開了按鍵按下時(shí)的抖動(dòng)時(shí)間。同理,在檢測到按鍵釋放后再延時(shí)5~10毫秒,消除后沿的抖動(dòng),然后再對鍵值處理。實(shí)踐證明,不對按鍵釋放的后沿進(jìn)行處理,通常也能滿足一定的要求。</p><p> 但有時(shí)用軟件方式并不能很好地解決按
39、鍵抖動(dòng)問題,例如按鍵開關(guān)連接的是中斷請求線,程序是不能讀取中斷請求線的狀態(tài)的,這時(shí)就需要使用硬件方法。硬件方法其實(shí)就是一個(gè)去除抖動(dòng)電路,用于去除按下和釋放按鍵時(shí)的波形抖動(dòng),這個(gè)電路也是比較簡單的,讀者可以查找相關(guān)去抖電路。對于比較復(fù)雜的矩陣鍵盤而言,通常使用專用芯片去除抖動(dòng),例如鍵盤接口芯片8279、MAX6816、MAX6817、MAX6818等。</p><p> 3.1.2 常用鍵盤接口</p>
40、;<p> 常用按鍵接口可分為獨(dú)立式按鍵接口、行列式按鍵接口和專用芯片式按鍵接口等。具體采用哪種方式,可根據(jù)所設(shè)計(jì)系統(tǒng)的實(shí)際情況而定。下面分別介紹這幾種接口方式的優(yōu)缺點(diǎn)及適用場合。</p><p><b> 1.獨(dú)立式按鍵接口</b></p><p> 獨(dú)立式按鍵接口設(shè)計(jì)優(yōu)點(diǎn)是電路配置靈活,軟件實(shí)現(xiàn)簡單。但缺點(diǎn)也很明顯,每個(gè)按鍵需要占用一根口線,若
41、按鍵數(shù)量較多,資源浪費(fèi)將比較嚴(yán)重,電路結(jié)構(gòu)也變得復(fù)雜。因此本方法主要用于按鍵較少或?qū)Σ僮魉俣纫筝^高的場合。軟件實(shí)現(xiàn)時(shí),可以采用中斷方式,也可以采用查詢方式,如圖3.2所示。</p><p> 圖3.2 獨(dú)立式鍵盤接口</p><p><b> 2.行列式按鍵接口</b></p><p> 行列式按鍵接口如圖3.3所示,其使用原理將在下
42、節(jié)詳細(xì)講述。行列式按鍵接口適用于按鍵數(shù)量較多,又不方便使用專用鍵盤芯片的場合。這種方式的按鍵接口由行線和列線組成,按鍵位于行、列的交叉點(diǎn)上。這種方式的優(yōu)點(diǎn)就是相對于獨(dú)立接口方式可以節(jié)省很多I/O資源,相對于專用芯片鍵盤可以節(jié)省成本,且更為靈活。缺點(diǎn)就是需要用軟件處理消抖、重鍵等。</p><p> 行列式按鍵接口是一種老式的鍵盤接口,其按鍵掃描方法是幾乎所有PC鍵盤所采用的方法。</p><
43、p> 如何確定行列式鍵盤上哪個(gè)鍵被按下,這里介紹一種“行掃描法”。行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識(shí)別方法。掃描過程分為以下兩步。</p><p> ?。?)判斷鍵盤中有無鍵按下。將全部行線置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平與4根行線相交叉的4個(gè)按鍵中。若所有列線</p><p> 均為高電平
44、,則鍵盤中無鍵按下。</p><p> (2)判斷閉合鍵所在的位置。在確認(rèn)有鍵被按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在某根行線為低電平時(shí),把其他行線置為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵即為閉合按鍵。</p><p> 例如在圖3.3中,CPU的低8位用作鍵盤I/O口,
45、其中,鍵盤的列線連接到I/O口的低4位,鍵盤的行線連接到I/O口的高4位。列線B0~B3分別連接有4個(gè)上拉電阻到正電源+5V,并把列線設(shè)置為輸入線,行線B4~B7設(shè)置為輸出線,4根行線和4根列線形成16個(gè)相交點(diǎn)。如果進(jìn)行鍵盤掃描,再加上去除抖動(dòng)的功能,要執(zhí)行如下操作:</p><p> ?。?)檢測當(dāng)前是否有按鍵被按下。檢測的方法是B4~B7輸出全“0”,讀取B0~B3的狀態(tài),若B0~B3全為“1”,則無鍵閉合,
46、否則為0的那一列有鍵閉合。</p><p> ?。?)去除鍵抖動(dòng)。當(dāng)檢測到有鍵按下后,延時(shí)一段時(shí)間再作下一步的檢測判斷。</p><p> ?。?)若有鍵被按下,應(yīng)識(shí)別出是哪一個(gè)鍵閉合。方法是對鍵盤的行線進(jìn)行掃描。B4~B7按下述4種組合依次輸出:</p><p> P7 1 1 1 0</p><p> P6 1 1 0
47、 1</p><p> P5 1 0 1 1</p><p> P4 0 1 1 1</p><p> ?。?)在每組行輸出時(shí)讀取P0~P3,若全為“1”,則表示設(shè)為“0”的這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,通常是一個(gè)掃描碼,然后可采用計(jì)算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值。為了保證鍵每閉合一次CPU僅作一
48、次處理,必須去除按鍵釋放時(shí)的抖動(dòng)。</p><p> 通過以上步驟就可以得到被按下鍵的掃描碼了,通常把掃描碼放到一個(gè)緩沖區(qū)內(nèi),直到應(yīng)用程序處理按鍵為止。緩沖是一個(gè)很有用的措施,因?yàn)楫?dāng)應(yīng)用程序出現(xiàn)按鍵狀態(tài)改變卻不能及時(shí)處理的情況時(shí),通過緩沖區(qū)就可以防止按鍵的丟失。緩沖區(qū)的大小取決于應(yīng)用程序的需要,一般應(yīng)該大于10。一般來說,都是把緩沖區(qū)作為一個(gè)環(huán)行隊(duì)列來管理。使用兩個(gè)指針,一個(gè)指向第一個(gè)空位,一個(gè)指向第一個(gè)掃描碼
49、。當(dāng)一個(gè)按鍵被按下時(shí),掃描碼將被放置在環(huán)形隊(duì)列的空指針指向的位置。而應(yīng)用程序則是通過指向第一個(gè)掃描碼的指針去讀取掃描碼。若緩沖區(qū)已滿,則任何下一個(gè)按鍵都將被丟棄</p><p> 3.專用芯片式按鍵接口</p><p> 專用鍵盤處理芯片一般功能比較完善,芯片本身能完成對按鍵的編碼、掃描、消抖和重鍵等問題的處理,甚至還集成了顯示接口功能。專用鍵盤處理芯片的優(yōu)點(diǎn)很明顯,可靠性高,接口簡單
50、,使用方便,適合處理按鍵較多的情況。但在很多應(yīng)用場合,考慮成本因素,可能并不是最佳選擇。</p><p> 3.1.3鍵盤驅(qū)動(dòng)程序?qū)嵗?lt;/p><p> 在前面部分已經(jīng)對如何在一個(gè)嵌入式系統(tǒng)中擴(kuò)展小鍵盤及相關(guān)電路連接進(jìn)行了說明。在嵌入式系統(tǒng)的軟件部分,要做的就是把前面的硬件電路驅(qū)動(dòng)起來,為它們寫一個(gè)驅(qū)動(dòng)程序,下面就以一個(gè)實(shí)例進(jìn)行說明如何編寫鍵盤驅(qū)動(dòng)程序。</p><
51、p> 鍵盤作為Linux默認(rèn)輸入設(shè)備,一般嵌入式Linux操作系統(tǒng)都帶有標(biāo)準(zhǔn)鍵盤的驅(qū)動(dòng)程序。鍵盤是一個(gè)字符設(shè)備,它的驅(qū)動(dòng)程序?yàn)閐rivers/char/keyboard.c,其對應(yīng)的頭文件為keyboard.h。在Intel構(gòu)架中,鍵盤把自己固定在IRQ1上,鍵盤狀態(tài)的寄存器地址為0x64h,鍵盤掃描碼的寄存器地址為0x60h。當(dāng)用戶按下按鍵后,將產(chǎn)生中斷,在中斷處理程序中,將讀出鍵盤狀態(tài)和鍵盤掃描碼,然后把鍵盤掃描碼通過對應(yīng)表
52、轉(zhuǎn)換為ASCII碼,送往用戶應(yīng)用程序。</p><p> 本節(jié)的實(shí)例也是針對Intel x86體系結(jié)構(gòu)。參照標(biāo)準(zhǔn)鍵盤的驅(qū)動(dòng)程序,這個(gè)實(shí)例也使用IRQ1中斷,從0x64h讀入鍵盤狀態(tài),從0x60h讀入鍵盤掃描碼,這樣就跟系統(tǒng)自帶的鍵盤驅(qū)動(dòng)程序發(fā)生沖突了,這時(shí)的新添程序是無法捕捉按鍵中斷的。由于系統(tǒng)自帶的驅(qū)動(dòng)程序和要寫的驅(qū)動(dòng)代碼不能共存,所以首先必須使系統(tǒng)自帶的鍵盤驅(qū)動(dòng)釋放中斷。但因?yàn)樵趦?nèi)核源文件里它是作為一個(gè)靜態(tài)
53、符號被定義的,所以沒有辦法恢復(fù)它,只能重新啟動(dòng),才能恢復(fù)原來的中斷。</p><p> 本節(jié)這段代碼是把它自動(dòng)綁定到IRQ1上,在Intel結(jié)構(gòu)下這是鍵盤控制的IRQ。這時(shí),當(dāng)它連接到一個(gè)鍵盤中斷時(shí),將讀出鍵盤的狀態(tài)(這是inb(0x64)的目的)和由鍵盤返回的掃描碼。隨后只要內(nèi)核認(rèn)為可以時(shí),它將運(yùn)行g(shù)ot_char給出鍵的編碼(掃描碼的前7位)和是否被按下的信息(如果第8位是0則表示按下,是1表示釋放)。&l
54、t;/p><p> 3.2 LCD顯示接口</p><p> 在ARM嵌入式系統(tǒng)中,人機(jī)接口不但包括可以輸入的鍵盤,還有用于傳送信息給用戶的輸出設(shè)備。液晶顯示器LCD具有顯示信息多、質(zhì)量高、無電磁輻射、可視面積大、應(yīng)用范圍廣、畫面效果好、數(shù)字式接口、體積小、功耗低等特點(diǎn),在基于微處理器的嵌入式系統(tǒng)終端顯示、人機(jī)接口中受到普遍歡迎,極大地提高了嵌入式系統(tǒng)的易用性和操作的直觀性。本節(jié)將主要介
55、紹LCD顯示原理、LCD分類及LCD驅(qū)動(dòng)程序。</p><p> 3.2.1 LCD簡介</p><p><b> 1.顯示原理</b></p><p> 液晶顯示器的顯像原理,是將液晶置于兩片導(dǎo)電玻璃之間,靠兩個(gè)電極間電場的驅(qū)動(dòng),引起液晶分子扭曲向列的電場效應(yīng),以控制光源透射或遮蔽功能,在電源開/關(guān)之間產(chǎn)生明暗而將影像顯示出來。若加上
56、彩色濾光片,則可顯示彩色影像。在兩片玻璃基板上裝有配向膜,所以液晶會(huì)沿著溝槽配向。由于玻璃基板配向膜溝槽偏離90°,所以液晶分子成為扭轉(zhuǎn)型,當(dāng)玻璃基板沒有加入電場時(shí),光線透過偏光板跟著液晶作90°扭轉(zhuǎn),透過下方偏光板,液晶面板顯示白色;當(dāng)玻璃基板加入電場時(shí),液晶分子產(chǎn)生配列變化,光線通過液晶分子空隙維持原方向,被下方偏光板遮蔽,光線被吸收無法透出,液晶面板顯示黑色。液晶顯示器便是根據(jù)此電壓有無,使面板達(dá)到顯示效果。&
57、lt;/p><p> 2.LCD顯示器的分類</p><p> 按顯示功能的強(qiáng)弱分類,LCD可分為段位式LCD、字符式LCD和點(diǎn)陣式LCD。其中,段位式LCD和字符式LCD只能用于字符和數(shù)字的簡單顯示,不能滿足圖形、曲線和漢字顯示的要求。而點(diǎn)陣式LCD不僅可以顯示字符、數(shù)字,還可以顯示各種圖形、曲線和漢字,并且可以實(shí)現(xiàn)屏幕上下左右滾動(dòng)、動(dòng)畫、分區(qū)開窗口、反轉(zhuǎn)、閃爍等功能,用途十分廣泛。&l
58、t;/p><p> 按照液晶顯示器的使用場合,其采用的顯示模塊還可以分為數(shù)顯液晶模塊、點(diǎn)陣式液晶字符模塊、點(diǎn)陣圖型液晶模塊。下面將分別對這3類顯示模塊加以介紹。</p><p><b> ?。?)數(shù)顯液晶模塊</b></p><p> 數(shù)顯液晶模塊是一種由段式液晶顯示器件與專用的集成電路組裝成一體的功能部件,只能顯示數(shù)字和一些標(biāo)識(shí)符號。段式液晶
59、顯示器件大多應(yīng)用在便攜、袖珍設(shè)備上。由于這類設(shè)備體積小,所以盡可能不將顯示部分設(shè)計(jì)成單獨(dú)的部件。即使一些應(yīng)用領(lǐng)域需要單獨(dú)的顯示組件,也應(yīng)該使其除具有顯示功能外,還應(yīng)具有一些信息接收、處理、存儲(chǔ)傳遞等功能。由于它們具有某些通用的、特定的功能,而廣受市場的歡迎。常見的數(shù)顯液晶顯示模塊具有計(jì)數(shù)、計(jì)時(shí)、計(jì)量等功能。</p><p> ?。?)點(diǎn)陣式液晶字符模塊</p><p> 點(diǎn)陣式液晶字符模
60、塊是由點(diǎn)陣式液晶顯示器件和專用的行、列驅(qū)動(dòng)器,控制器以及必要的連接器件裝配而成的。它可以顯示數(shù)字和西文字符。這種點(diǎn)陣式字符模塊有的本身帶有字庫,有字符發(fā)生器,具有顯示容量大、功能豐富的特點(diǎn)。一般這種模塊最少也可以顯示8位1行或者16位1行以上的字符。這種模塊的點(diǎn)陣排列是有8×8、16×8或16×16的一組一組像素點(diǎn)陣排列組成的。每組的像素組成1個(gè)字,每個(gè)字之間有一定的間隔,每行字之間也有一行的間隔,所以不能
61、顯示圖形。</p><p> 一般在模塊控制、驅(qū)動(dòng)器內(nèi)不僅具有已固化好字符字模的字符庫CGROM,還具有讓用戶自定義建立專用字符的隨機(jī)存儲(chǔ)器CGRAM,它允許用戶建立自己的點(diǎn)陣字符。</p><p> ?。?)點(diǎn)陣式圖形液晶模塊</p><p> 點(diǎn)陣圖形液晶模塊也是點(diǎn)陣模塊的一種,其特點(diǎn)是點(diǎn)陣像素連續(xù)排列,行和列在排布中均沒有空隔,因此可以顯示連續(xù)、完整的圖形
62、。由于它也是由X-Y矩陣像素構(gòu)成的,所以除顯示圖形外,也可以顯示字符。它又可以分為以下幾類:</p><p><b> 1) 行、列驅(qū)動(dòng)型</b></p><p> 行、列驅(qū)動(dòng)型是一種必須外接專用控制器的模塊,其模塊只裝配有通用的行、列驅(qū)動(dòng)器,這種驅(qū)動(dòng)器實(shí)際上只有對像素的一般驅(qū)動(dòng)輸出端,而輸入端一般只有4位以下的數(shù)據(jù)輸入端、移位信號輸入端、鎖存輸入端、交流信號輸入
63、端等,如HD44100、IID66100等。此種模塊必須外接控制電路,如HD61830、SED1330等才能與計(jì)算機(jī)連接。該種模塊數(shù)量最多,應(yīng)用最普遍。雖然需要采用自配控制器,但它也給客戶留下了可以自行選擇不同控制器的自由。</p><p><b> 2) 行、列控制型</b></p><p> 行列控制型是一種可直接與計(jì)算機(jī)接口,依靠計(jì)算機(jī)直接控制驅(qū)動(dòng)器的模塊。
64、這類模塊所用的列驅(qū)動(dòng)器具有I/O總線數(shù)據(jù)接口,可以將模塊直接掛在計(jì)算機(jī)的總線上,省去了專用控制器,因此對整機(jī)系統(tǒng)降低成本有很大的好處。對于顯示系統(tǒng)的像素?cái)?shù)量不大,整機(jī)功能不是很復(fù)雜的系統(tǒng)非常適用,不過它會(huì)占用系統(tǒng)的部分資源。</p><p> 3) 行列驅(qū)動(dòng)—控制型</p><p> 行列驅(qū)動(dòng)—控制型是一種內(nèi)藏控制器的點(diǎn)陣圖形模塊,也是比較受歡迎的一種類型。這種模塊不僅裝有如第一類的行
65、、列驅(qū)動(dòng)器,而且也裝配有如T6963C等的專用控制器。這種控制器是液晶驅(qū)動(dòng)器與計(jì)算機(jī)的接口,它以最簡單的方式受控于計(jì)算機(jī),接收并反饋計(jì)算機(jī)的各種信息,經(jīng)過自己獨(dú)立的信息處理實(shí)現(xiàn)對顯示緩沖區(qū)的管理,并向驅(qū)動(dòng)器提供所需要的各種信號、脈沖,操縱驅(qū)動(dòng)器實(shí)現(xiàn)模塊的顯示功能。這種控制器具有自己的一套專用指令,并具有自己的字符發(fā)生器CGROM,這就要求用戶必須熟悉這種控制器的詳細(xì)說明書,才能進(jìn)行操作。這種模塊使用戶擺脫了對控制器的設(shè)計(jì)、加工、制作等一
66、系列工作,又使計(jì)算機(jī)避免了對顯示器的繁瑣控制,節(jié)約了主機(jī)系統(tǒng)的內(nèi)部資源。</p><p><b> 3.顯示漢字</b></p><p> 一般西文為8×8點(diǎn)陣,因而顯示一個(gè)西文字符只需要8個(gè)字節(jié),而每一個(gè)漢字要占4個(gè)西文字體,因此顯示一個(gè)漢字需要32個(gè)字節(jié)。漢字字庫表為一張數(shù)據(jù)表,每個(gè)漢字在數(shù)據(jù)表中通常由32個(gè)字節(jié)組成一個(gè)點(diǎn)陣圖形。在應(yīng)用時(shí),連續(xù)取32
67、個(gè)字節(jié)送到LCD的相應(yīng)位置,就能正確顯示漢字后的圖形符號。在嵌入式系統(tǒng)中,如果需要顯示的漢字是固定的,并且字?jǐn)?shù)較少,可以直接在軟件的頭文件中定義漢字的顯示點(diǎn)陣表格,要顯示時(shí),直接從表格變量數(shù)組中連續(xù)取出32個(gè)漢字送往LCD顯示器即可。但是如果要顯示的漢字字?jǐn)?shù)很多,或者又不能確定要顯示哪些漢字時(shí),使用上述辦法就相當(dāng)麻煩了。這時(shí)應(yīng)當(dāng)使用漢字字庫。有些LCD驅(qū)動(dòng)器自帶漢字字庫,如果沒有帶,可以自己使用ROM擴(kuò)展,通過把漢字機(jī)內(nèi)碼送往字庫文件,
68、得到對應(yīng)的顯示點(diǎn)陣。</p><p> 3.2.2 在嵌入式Linux中驅(qū)動(dòng)LCD</p><p> 隨著應(yīng)用需求的推動(dòng),嵌入式Linux操作系統(tǒng)下也出現(xiàn)了許多圖形界面軟件包,如MiniGUI、Trolletech公司的Embedded QT等。這些圖形界面開發(fā)包與WinCE相似,在圖形軟件包的開發(fā)和移植工作中都牽涉到底層LCD驅(qū)動(dòng)的問題。在本節(jié)中將介紹有關(guān)在嵌入式Linux下實(shí)現(xiàn)L
69、CD驅(qū)動(dòng)的相關(guān)知識(shí)。</p><p> Linux的設(shè)備管理是和文件系統(tǒng)緊密相關(guān)的,各種設(shè)備都以文件的形式存儲(chǔ)在/dev目錄下,稱為設(shè)備文件。應(yīng)用程序可以打開、關(guān)閉、讀寫這些設(shè)備文件,完成對設(shè)備的操作,就像對普通數(shù)據(jù)文件操作一樣。另外,Linux把它所管理的設(shè)備分為字符設(shè)備和塊設(shè)備,它們的區(qū)別在于系統(tǒng)為塊設(shè)備提供了緩沖機(jī)制。由于設(shè)計(jì)緩沖區(qū)的管理、調(diào)度和同步等問題,塊設(shè)備的驅(qū)動(dòng)要比字符設(shè)備復(fù)雜。Linux把顯示驅(qū)
70、動(dòng)也看作字符設(shè)備,把要顯示的數(shù)據(jù)一個(gè)字節(jié)一個(gè)字節(jié)地送往LCD驅(qū)動(dòng)器。</p><p> Linux為所有的設(shè)備文件都提供了統(tǒng)一的操作函數(shù)接口,方法是使用數(shù)據(jù)結(jié)構(gòu)struct file_operations,這個(gè)數(shù)據(jù)結(jié)構(gòu)中包括許多操作函數(shù)的指針,如open()、close()、read()、write()等。但是,由于外設(shè)的種類繁多,操作方式也不一樣,如聲音設(shè)備驅(qū)動(dòng)要使用DMA通道、顯示設(shè)備要提供對顯存的操作、硬
71、盤驅(qū)動(dòng)要處理復(fù)雜的緩沖區(qū)結(jié)構(gòu)等。如果file_operations中的函數(shù)都是用驅(qū)動(dòng)開發(fā)人員來編寫實(shí)現(xiàn),其工作量相當(dāng)大,而且對于每一類設(shè)備,它的許多操作也是相似的,許多數(shù)據(jù)結(jié)構(gòu)也是可以公用的。</p><p> 為了解決這個(gè)問題,Linux采用了更高一層的封裝方法,為同一類設(shè)備定義好了文件層次的file_operations結(jié)構(gòu)中的接口函數(shù),在其中處理了大多數(shù)設(shè)備相關(guān)的操作,如各種緩沖區(qū)的申請和釋放等。而具體操
72、作底層硬件的一小部分則留給驅(qū)動(dòng)開發(fā)人員去實(shí)現(xiàn),這樣就大大減少了驅(qū)動(dòng)程序開發(fā)的難度。所以Linux提供了另外一個(gè)文件層到底層驅(qū)動(dòng)的接口,通常為一個(gè)結(jié)構(gòu)體,其中包含成員變量和函數(shù)指針等,不同的設(shè)備驅(qū)動(dòng)有著不同的數(shù)據(jù)結(jié)構(gòu)。這樣,一方面保證了文件層I/O接口file_operations的一致性;另一方面,驅(qū)動(dòng)程序的開發(fā)人員也不用了解設(shè)備驅(qū)動(dòng)太多的細(xì)節(jié),只需專注于硬件相關(guān)的I/O操作即可。</p><p> Linux
73、為顯示設(shè)備提供的幀緩沖驅(qū)動(dòng)也采用這種“文件層—文件層”的方式。下面首先對幀緩沖進(jìn)行相應(yīng)介紹。</p><p> FrameBuffer是出現(xiàn)在Linux2.2.xx及其以后版本內(nèi)核當(dāng)中的一種驅(qū)動(dòng)程序接口。這種接口將顯示設(shè)備抽象為幀緩沖區(qū)。用戶可以將它看成是顯示內(nèi)存的一個(gè)映像,將其映射到進(jìn)程地址空間之后,就可以直接進(jìn)行讀寫操作,而寫操作可以立即地反映在屏幕上。</p><p> 幀緩沖設(shè)
74、備對應(yīng)的設(shè)備文件是/dev/fb*,如果系統(tǒng)有多個(gè)顯卡,Linux還支持多個(gè)幀緩沖設(shè)備,最多可以有32個(gè),分別為/dev/fb0、/dev/fb1…/dev/fb31。而/dev/fb則指向當(dāng)前的幀緩沖設(shè)備,一般為/dev/fb0,當(dāng)然在嵌入式系統(tǒng)中一般只有一個(gè)幀緩沖設(shè)備。</p><p> 幀緩沖設(shè)備也屬于字符設(shè)備,與聲音設(shè)備一樣,也采用“文件層—驅(qū)動(dòng)層”的接口方式。在文件層為之定義了數(shù)據(jù)結(jié)構(gòu):</p&
75、gt;<p> static struct file_operations fb_fops =</p><p><b> {</b></p><p> owner: THIS_MODULE,</p><p> read: fb_read,//讀操作</p><p> write:
76、 fb_write, //寫操作</p><p> ioctl: fb_ioctl, //I/O控制</p><p> mmap: fb_mmap, //映射操作</p><p> open: fb_open, //打開操作</p><p> release: fb_r
77、elease, //關(guān)閉操作</p><p><b> }</b></p><p> 其成員函數(shù)都在linux/drivers/vedio/fbmem.c中定義,其中的函數(shù)對具體的硬件進(jìn)行操作,對寄存器進(jìn)行設(shè)置,對顯示緩沖進(jìn)行映射。</p><p> 由于顯示設(shè)備的特殊性,在驅(qū)動(dòng)層的接口中不但要包括底層函數(shù),還要有一些記錄設(shè)備狀態(tài)
78、的數(shù)據(jù),Linux為幀緩沖設(shè)備定義的驅(qū)動(dòng)層接口為struct fb_info結(jié)構(gòu),在include/linux/fb.h中定義。這個(gè)數(shù)據(jù)結(jié)構(gòu)記錄了幀緩沖設(shè)備的全部信息,包括設(shè)備的設(shè)置參數(shù)、狀態(tài)以及操作函數(shù)的指針等。每個(gè)幀緩沖設(shè)備都必須對應(yīng)一個(gè)fb_info結(jié)構(gòu)。其成員變量modename為設(shè)備名稱、fontname為顯示字體、fbops為指向底層操作函數(shù)的指針,這些函數(shù)需要驅(qū)動(dòng)開發(fā)人員根據(jù)硬件設(shè)備的具體特性編寫。另外還有兩個(gè)記錄設(shè)備狀態(tài)
79、的數(shù)據(jù)結(jié)構(gòu)struct fb_var_screeninfo和struct fb_fix_screeninfo,它們分別記錄可設(shè)置信息和不可設(shè)置的設(shè)備信息。</p><p> 如果要編寫一個(gè)幀緩沖設(shè)備的驅(qū)動(dòng)程序,所要做的主要工作包括:</p><p> ?。?)編寫初始化函數(shù)</p><p> 初始化函數(shù)首先初始化LCD控制器,通過寫寄存器設(shè)置顯示模式和顯示顏色數(shù)
80、,然后分配LCD顯示緩沖區(qū)。在Linux中可以用kmalloc()函數(shù)分配一段連續(xù)的空間。緩沖區(qū)的大小為:</p><p> 點(diǎn)陣行數(shù)×點(diǎn)陣列數(shù)×用于表示一個(gè)像素的比特?cái)?shù)/8</p><p> 緩沖區(qū)通常分配在大容量的片外SDRAM中,起始地址保存在LCD控制寄存器中。</p><p> 然后,初始化一個(gè)fb_info結(jié)構(gòu),填充其成員變量,
81、并調(diào)用register_framebuffer(&fb_info),將fb_info登記入內(nèi)核。</p><p><b> (2)編寫成員函數(shù)</b></p><p> 編程fb_info中函數(shù)指針fb_ops對應(yīng)的成員函數(shù),對于嵌入式系統(tǒng)相對比較簡單,只需實(shí)現(xiàn)以下3個(gè)函數(shù)即可:</p><p> struct fb_ops<
82、;/p><p><b> {</b></p><p><b> ……</b></p><p> int(*fb_get_fix)(struct fb_fix_screeninfo*fix,int con,struct fb_info *info);</p><p> int(*fb_get_va
83、r)(struct fb_var_screeninfo*var,int con,struct fb_info *info);</p><p> int(*fb_set_fix)(struct fb_var_screeninfo*var,int con,struct fb_info *info);</p><p><b> ……</b></p><
84、;p><b> };</b></p><p> struct fb_ops在include/linux/fb.h中定義。這些函數(shù)都是用來設(shè)置/獲取fb_info中的成員變量的。當(dāng)應(yīng)用程序調(diào)用ioctl操作時(shí)會(huì)調(diào)用它們。</p><p> 通過/dev/fb,對顯示設(shè)備的操作主要有以下幾種:</p><p> ?。?)讀寫(read/
85、write) /dev/fb</p><p> 相當(dāng)于讀寫屏幕緩沖區(qū)。例如cp /dev/fb temp相當(dāng)于把屏幕中的內(nèi)容復(fù)制到一個(gè)temp文件中,而cp temp /dev/fb則把temp文件中的內(nèi)容在屏幕上顯示出來。</p><p> ?。?)映射(map)操作</p><p> 由于Linux工作于保護(hù)模式,每個(gè)應(yīng)用進(jìn)程都有自己的虛擬地址空間,在應(yīng)用程
86、序中是不能直接訪問物理緩沖地址的。為此,Linux在文件操作接口file_operations中提供了mmap操作,可以將文件的內(nèi)容映射到用戶空間。對于幀緩沖設(shè)備,則可通過映射操作,將屏幕緩沖區(qū)的物理地址映射到用戶空間的一段虛擬地址中(在µClinux中,沒有MMU,不存在虛擬地址,直接映射到實(shí)地址),之后用戶就可以通過讀寫這段地址訪問屏幕緩沖區(qū),在屏幕上繪圖了。</p><p><b>
87、(3)I/O控制</b></p><p> 對于幀緩沖設(shè)備,通過對設(shè)備文件的ioctl()調(diào)用可以讀取/設(shè)置顯示設(shè)備或者屏幕的參數(shù),如分辨率、顯示顏色數(shù)、屏幕大小等。ioctl()的實(shí)現(xiàn)由底層驅(qū)動(dòng)來完成。</p><p> 在應(yīng)用程序中,操作/dev/fb的一般步驟如下:</p><p> ?。?)打開/dev/fb設(shè)備文件。</p>
88、<p> ?。?)用ioctl()取得當(dāng)前顯示屏幕的參數(shù),如屏幕的分辨率、每個(gè)像素的比特?cái)?shù)等,根據(jù)屏幕參數(shù)可以計(jì)算出屏幕緩沖區(qū)的大小。用于存儲(chǔ)顯示信息的有兩個(gè)數(shù)據(jù)結(jié)構(gòu)即struct fb_var_screeninfo和struct fb_fix_screeninfo。其中第一個(gè)存儲(chǔ)可以設(shè)置的顯示信息,如顯示深度、分辨率等。第二個(gè)數(shù)據(jù)結(jié)構(gòu)用于存儲(chǔ)一些不可設(shè)置的顯示信息,如屏幕緩沖區(qū)的物理地址、大小等信息。</p>
89、<p> ?。?)將屏幕緩沖區(qū)映射到用戶空間。映射之后就可以直接對屏幕緩沖區(qū)進(jìn)行讀寫、繪圖和顯示圖片了。</p><p><b> 典型應(yīng)用程序如下:</b></p><p> #include <linux/fb.h></p><p><b> main()</b></p>&l
90、t;p><b> {</b></p><p> int fbfd=0;</p><p> struct fb_var_screeninfo vinfo;</p><p> struct fb_fix_screeninfo finfo;</p><p> long int screensize=0;<
91、/p><p> unsigned char *fbp;</p><p> fbfd=open(“/dev/fb0”,O_RDWR); //打開設(shè)備文件</p><p> ioctl(fbfd,FBIOGET_FSCREENINFO,&finfo); //取得屏幕相關(guān)參數(shù)</p><p> ioctl(fbf
92、d,FBIOGET_VSCREENINFO,&vinfo);</p><p> screensize=vinfo.xres*vinfo.yres*vinfo.bits_per_pixel/8; //計(jì)算屏幕緩沖區(qū)的大小</p><p> //映射屏幕緩沖區(qū)到用戶地址空間</p><p> fbp=(unsignedchar *)mmap(0,scre
93、ensize,PORT_READ|PORT_WRITE,</p><p> MAP_SHARED,FBFD,0);</p><p> //下面可以通過fbp訪問緩沖區(qū),進(jìn)行圖形繪制</p><p><b> ……</b></p><p><b> }</b></p><p
94、> 3.2.3 LCD接口電路</p><p> 表3.1 MDLS40466引腳信號定義</p><p> 注:15、16兩管腳僅用于MDLS40466,其余型號不用或?yàn)長ED背光電源輸入。</p><p> 關(guān)于該模塊的具體工作原理與控制方法等更詳細(xì)的內(nèi)容,請參考相關(guān)用戶手冊。</p><p> 本系統(tǒng)中LCD模塊與S
95、3C4510B連接如圖3.4所示。</p><p> S3C44B0X中內(nèi)置的LCD控制器可支持灰度LCD和彩色LCD。使用基于時(shí)間的抖動(dòng)算法和幀速率控制方法,可以支持單色、4級灰度和16級灰度模式的灰度LCD。在彩色LCD上,可以支持256級彩色。對于不同尺寸的LCD,它們有不同數(shù)量的垂直和水平像素、數(shù)據(jù)接口的數(shù)據(jù)寬度、接口時(shí)間及刷新率,而LCD控制器可以通過編程來控制相應(yīng)的寄存器值,以適應(yīng)不同的LCD顯示板
96、。</p><p> 圖3.5 S3C44B0X的LCD控制器邏輯圖</p><p> 圖3.5為S3C44B0X中內(nèi)置的LCD控制器邏輯框圖,它用于傳輸顯示數(shù)據(jù)并產(chǎn)生必要的控制信號,如VFRAME、VLINE、VCLK和VM,以及顯示數(shù)據(jù)的數(shù)據(jù)端口VD[7:4]和VD[3:0]。</p><p> LCD控制器包含REGBANK、LCDCDMA、VIDPR
97、CS和TIMEGEN。REGBANK具有18個(gè)可編程寄存器,用于配置LCD控制器;LCDCDMA為專用DMA,可以自動(dòng)地將顯示數(shù)據(jù)從幀內(nèi)存?zhèn)魉偷絃CD驅(qū)動(dòng)器中,通過專用DMA,可以在不需要CPU介入的情況下顯示數(shù)據(jù);VIDPRCS從LCDCDMA接收不同格式的數(shù)據(jù),以支持常見的LCD驅(qū)動(dòng)器所需要的不同接口時(shí)間和速率的要求。TIMEGEN包含可編程的邏輯,產(chǎn)生VFRAME、VLINE、VCLK和VM等信號。表3.2給出了LCD控制器外部接
98、口信號的含義。</p><p> 表3.2 LCD控制器外部接口信號</p><p> LCDCDMA對應(yīng)于先入先出(FIFO,F(xiàn)irst Input First Output)寄存器。當(dāng)FIFO變空或部分空的時(shí)候,LCDCDMA請求從幀內(nèi)存中用突發(fā)傳輸模式預(yù)取數(shù)據(jù),這種傳輸請求被內(nèi)存控制器的總線仲裁器接收時(shí),就把4個(gè)連續(xù)的字從系統(tǒng)內(nèi)存?zhèn)鬏數(shù)絻?nèi)部FIFO。FIFO由分別為12個(gè)字的F
99、IFOL和FIFOH組成,總長度為24個(gè)字。S3C44B0X因?yàn)樾枰С蛛p掃描顯示模式,所以有兩個(gè)這樣的FIFO,但是在單掃描模式下只用其中的一個(gè)。</p><p> S3C44B0X中內(nèi)置的LCD控制器可通過一系列的寄存器進(jìn)行控制。</p><p> 3.2.4 uClinux下開發(fā)LCD應(yīng)用程序</p><p> uClinux系統(tǒng)提供了—系列的圖形界面
100、接口函數(shù)API。它們仿照Win32API的接口,使用戶能夠以最短的時(shí)間熟悉并使用它們。API的原型可以參考/HHARM44B0-EDU-R1/uClinux/appsrc/gui/graphic.c文件。在該文件中,對各個(gè)API給出了詳細(xì)的定義和使用方法??梢哉{(diào)用graphic.c中的函數(shù),也可以有選擇地將函數(shù)中的代碼加到所需要的應(yīng)用中。</p><p> 下面分析這些API是如何通過LCD驅(qū)動(dòng)程序操作LCD的
101、。</p><p><b> 1.打開LCD設(shè)備</b></p><p> LCD設(shè)備的打開由short initgraph(void)函數(shù)完成。</p><p> 變量聲明:unsigned char *screen_ptr:static int screen_fd:</p><p> 打開LCD函數(shù),首先調(diào)用
102、函數(shù)screen_fd=open(“/dev/fb0”,O_RDWR)打開fb0設(shè)備;然后通過ioctl發(fā)送FBIOGET_VSCREENINFO取得設(shè)備的相關(guān)參數(shù),其中主要參數(shù)是屏的長、寬像素?cái)?shù),都是160,每個(gè)像素用1bit表示;緊接著調(diào)用函數(shù)mmap()取得指向LCD幀緩存內(nèi)存的指針screen_ptr,以后對LCD的操作就是對這個(gè)指針的操作,與對內(nèi)存操作完全相同,例如清屏操作memset(screen_ptr,0,160*160
103、/8)。</p><p> Linux中提供內(nèi)存映像文件的機(jī)制來加速I/O操作,普通的設(shè)備操作read/write會(huì)通過內(nèi)核緩存讀入或讀出數(shù)據(jù),內(nèi)存映像文件的機(jī)制跳過內(nèi)核緩存,加快了對fb0設(shè)備的訪問。而且?guī)彺姹挥成涞竭M(jìn)程地址空間后,進(jìn)程可以像訪問普通內(nèi)存一樣對文件進(jìn)行訪問,不必再調(diào)用read(),write()等操作。</p><p> mmap()系統(tǒng)調(diào)用形式如下:</p&
104、gt;<p> void *mmap(void *addr,size_t len,int port,int flags,int fd,off_t offset)</p><p> 參數(shù)addr指定文件應(yīng)被映射到進(jìn)程空間的起始地址,一般被指定一個(gè)空指針,此時(shí)選擇起始地址的任務(wù)留給內(nèi)核來完成。函數(shù)的返回值為最后文件映射到進(jìn)程空間的地址,進(jìn)程可直接操作起始地址為該值的有效地址。參數(shù)1en是映射到調(diào)用進(jìn)
105、程地址空間的字節(jié)數(shù),它從被映射文件開頭offset個(gè)字節(jié)開始算起。參數(shù)prot指定共享內(nèi)存的訪問權(quán)限,可對以下幾個(gè)值進(jìn)行或運(yùn)算:PROT_READ(可讀),PR0T_WRITE(可寫),PROT_EXEC(可執(zhí)行),PROT_NONE(不可訪問)。參數(shù)flags由以下幾個(gè)常值指定:MAP_SHARED,MAP_PRIVATE,MAP_FIXED,其中,MAP_SHARED和MAP_PRIVATE必選其一,而MAP_FIXED則不推薦使用
106、。參數(shù)fd為即將映射到進(jìn)程空間的文件描述符;參數(shù)offset一般設(shè)為0,表示從文件頭開始映射。關(guān)于mmap()參數(shù)的進(jìn)一步信息,讀者可參考mmap()手冊。</p><p> 本程序中可以這樣調(diào)用mmap()取得指向LCD幀緩存內(nèi)存的指針screen_ptr:</p><p> screen_ptr=mmap(0,screen_height*screen_width>>3,
107、PORT_READ|PORT_WRITE,0,screen_fd,0);</p><p> LCD幀緩存的大小就是全屏顯示所有像素所需字節(jié)數(shù)。由于每個(gè)像素由1bit表示,因此幀緩存的大小等于像素?cái)?shù)除以8。</p><p><b> 2.關(guān)閉LCD設(shè)備</b></p><p> 這一功能通過如下方法完成:</p><p&
108、gt; void closegraph()</p><p> if(screen_fd!=-1) close(screen_fd)</p><p><b> 3.點(diǎn)的繪制</b></p><p> 描點(diǎn)setpixe函數(shù)就是將二維(x,y)坐標(biāo)對應(yīng)的幀緩存中某一位置0或置1。函數(shù)代碼如下:</p><p> s
109、tatic short masktab[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};</p><p> inline void setpixel(short x,short y,short color)</p><p><b> {</b></p><p> if((x<0)||(x>
110、;=screen_width)||(y<0)||(y>=screen_height)) //參數(shù)有效性檢測</p><p><b> return;</b></p><p> //操作系統(tǒng)的內(nèi)存操作都是基于字節(jié)的,所以要計(jì)算(x,y)對應(yīng)的位首先要計(jì)算出(x,y)對應(yīng)的字</p><p> //節(jié),還要根據(jù)x的后3位計(jì)算出要
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 測控網(wǎng)絡(luò)課程設(shè)計(jì)
- 網(wǎng)絡(luò)通信課程設(shè)計(jì)
- 人機(jī)交互課程設(shè)計(jì)---vrml設(shè)計(jì)--虛擬校園漫游系統(tǒng)
- 測控網(wǎng)絡(luò)技術(shù)課程設(shè)計(jì)
- 人機(jī)交互設(shè)計(jì)課程報(bào)告---談人機(jī)交互技術(shù)
- 網(wǎng)絡(luò)通信課程設(shè)計(jì)--公寓網(wǎng)絡(luò)設(shè)計(jì)
- 網(wǎng)絡(luò)通信winsock課程設(shè)計(jì)
- 汽車導(dǎo)航系統(tǒng)中人機(jī)交互接口的設(shè)計(jì)與完善.pdf
- 人機(jī)交互綜合設(shè)計(jì)報(bào)告
- 基于串口通信的人機(jī)交互系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 導(dǎo)納型力覺接口研制及人機(jī)交互穩(wěn)定性研究.pdf
- 捷變頻雷達(dá)信號源人機(jī)交互接口設(shè)計(jì).pdf
- 汽車人機(jī)交互系統(tǒng)
- PLC人機(jī)交互系統(tǒng)設(shè)計(jì)與研究.pdf
- java課程設(shè)計(jì)報(bào)告--“即時(shí)通”網(wǎng)絡(luò)通信系統(tǒng)的設(shè)計(jì)與開發(fā)
- 流星余跡通信人機(jī)交互通信界面設(shè)計(jì)開發(fā).pdf
- 人機(jī)交互考試設(shè)計(jì)研究.pdf
- 基于ARM的嵌入式系統(tǒng)人機(jī)交互接口的設(shè)計(jì)與研究.pdf
- 接口與通信課程設(shè)計(jì)--雙pc通信系統(tǒng)設(shè)計(jì)
- 基于視線跟蹤的人機(jī)交互系統(tǒng)設(shè)計(jì).pdf
評論
0/150
提交評論