2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩25頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、<p>  測控網(wǎng)絡通信系統(tǒng)與人機交互設計接口</p><p><b>  設計任務書</b></p><p><b>  設計題目</b></p><p>  測控網(wǎng)絡通信系統(tǒng)及人機交互接口設計設計目標</p><p>  實現(xiàn)測控系統(tǒng)的人機交互接口的硬件電路與軟件設計、實現(xiàn)測控節(jié)

2、點的互通信以及節(jié)點與上位機PC通信的硬件電路以及軟件設計。設計內(nèi)容</p><p>  1、實現(xiàn)兩個按鍵輸入;2、實現(xiàn)4位LED顯示輸出;3、采用RS485協(xié)議實現(xiàn)單片機與單片機遠距離互通信;4、實現(xiàn)單片機與PC的串口通信協(xié)議轉(zhuǎn)換與通信;5、利用按鍵控制通信進程、利用LED顯示通信數(shù)據(jù)。設計要求1、按鍵的檢測與去抖動電路及C語言軟件編程;2、LED數(shù)碼管的接口電路設計及C語言軟件編

3、程;3、通信協(xié)議轉(zhuǎn)換元件的選擇與電路設計;4、通信過程的C語言編程;5、51單片機系統(tǒng)的時鐘與復位部分元器件選擇與設計;6、按鍵調(diào)度通信過程的程序設計;7、通信數(shù)據(jù)的LED顯示;8、說明書中完整給出方案原理、元器件選擇與計算、電路原理圖和程序描述。</p><p>  摘要:針對我國小企業(yè)的特點,提出了以RS-485 總線方式的測控網(wǎng)絡,給出了測控網(wǎng)絡的網(wǎng)絡結(jié)構(gòu)。PC 主機使用Visual

4、 Basic軟件開發(fā),重點討論了利用VB的MSComm 通信控件實現(xiàn)PC 機與多測控節(jié)點之間的通信。 </p><p>  關鍵詞:節(jié)點;MSComm 控件;VB;RS-485 :</p><p><b>  系統(tǒng)設計的意義:</b></p><p>  根據(jù)我國的具體情況,各廠商在選擇網(wǎng)絡結(jié)構(gòu)時通常是按隸屬關系確定網(wǎng)絡形式。例如 隸屬郵電行業(yè)

5、的企業(yè)優(yōu)選電話網(wǎng),隸屬廣播電視行業(yè)的企業(yè)優(yōu)選有線電視網(wǎng)絡,而電力行業(yè) 的企業(yè)優(yōu)選電力配電網(wǎng)。不屬于上述行業(yè)的企業(yè)未經(jīng)許可不大可能進入這幾種專業(yè)網(wǎng)絡。在這種情況下一般有兩種解決方案:一是借助與網(wǎng)絡公司聯(lián)盟進入公共網(wǎng)絡,二是做自己的現(xiàn)場總線。目前,現(xiàn)場總線技術雖然取得了很大成績,但還是存在一些問題,主要體現(xiàn)在工程應用方面。在我國,大多數(shù)企業(yè)生產(chǎn)規(guī)模還比較小,各種現(xiàn)場總線都把降低成本作為主要追求目標,但據(jù)許多已經(jīng)投入應用的企業(yè)反映,實際現(xiàn)場總

6、線的系統(tǒng)開銷比傳統(tǒng)RS-485總線要大。這里可能有兩個問題,一是使用的系統(tǒng)規(guī)模太小,從制造商處得到的折扣少;二是使用的系統(tǒng)多沿用原有布線的習慣,因此無法充分發(fā)揮現(xiàn)場總線節(jié)省線纜的優(yōu)勢。又由于現(xiàn)場總線包含許多新的技術內(nèi)容,中小企業(yè)往往因人才方面的劣勢等原因,在調(diào)試、運行和維護 方面經(jīng)常會遇到困難。 基于以上情況,有必要開發(fā)一種結(jié)構(gòu)簡單、價格低廉、便于維護的RS-485 總線網(wǎng)絡測 控系統(tǒng),網(wǎng)絡節(jié)點采用AT89C52 單片機,PC 主機采用

7、VB 編程,因VB 功能強大,</p><p><b>  1系統(tǒng)組成:</b></p><p>  在測控系統(tǒng)的實際設計中,首先是系統(tǒng)網(wǎng)絡的設計,RS-485總線方式有結(jié)構(gòu)簡單、工 作可靠、通信速率高(最大10Mbps)、距離遠(不加中繼最遠可達1200m)等諸多優(yōu)點,在目前的測控網(wǎng)絡中得到了廣泛的應用。綜合考慮施工環(huán)境的具體情況和系統(tǒng)可靠性,我們選擇 RS-485

8、總線方式作為測控系統(tǒng)的網(wǎng)絡結(jié)構(gòu),降低了系統(tǒng)復雜性,減少了成本。測控節(jié)點與主控PC 機采用RS-485 總線式網(wǎng)絡結(jié)構(gòu),主控PC機的COM 串行通信端口通過RS232/RS-485轉(zhuǎn)換器與RS-485 網(wǎng)絡相連,以半雙工方式工作,最大傳輸距離可達 1200m,波特率在1200 和38400b/s 間可設置,RS-485 網(wǎng)絡采用一對有補償?shù)碾p絞線。測控節(jié)點采用AT89C52單片機,片中串行口加MAX487 轉(zhuǎn)換器,連接到RS-4

9、85網(wǎng)絡,以半雙工方式與主控PC機通信。PC 機本身并不具備專用的RS-485通信口,其對外的兩個串口COM1、COM2 都是專門為RS-232 通信而設置的。由于RS-485與RS-232 的工作電平不相同,工作方式與控制機理也有差別,故而想利用現(xiàn)成的COM1、COM2串口來實現(xiàn)RS-48</p><p>  2 PC 主機與節(jié)點群之間串行通信的實現(xiàn) </p><p>  2.1 利用

10、VB6.0 提供MSComm 通信控件訪問串口 </p><p>  通過VB6.0 中通信控件的屬性設置數(shù)據(jù)傳輸率,奇偶校驗,緩沖區(qū)容量等,通過方法 和事件發(fā)送、接收數(shù)據(jù)和控制命令。 </p><p><b> ?。?)主要屬性設置</b></p><p>  Commport:設置通信連接端口代號 </p><p>

11、  Settings:以字符串的形式設置或回傳“BBBB ,P ,D ,S” </p><p>  PortOpen:通信連接端口狀態(tài) </p><p>  Input:從輸入寄存器傳回并移除字符 </p><p>  Output:將一個字符串寫入輸出寄存器 </p><p>  Inputlen:指定由串行端口讀入的字符串長度 </

12、p><p>  InBufferCount:已接收并在接收寄存器等待讀取的字符數(shù) </p><p>  InputMode: ComInputModeText 0 以文字字符串形式取回 ComInputModeBinary 1 二進制形式取回 </p><p>  (2)利用VB 中的MSComm 的Settings 屬性的動態(tài)設置,實現(xiàn)多機通信 在屬性

13、中尤其值得注意的是MSComm 控件中的Settings 屬性,其值的格式為“BBBB, P,D,S”。 </p><p>  ①BBBB 為傳輸波特率如,9600bps,2400bps 等。 </p><p> ?、赑 為奇偶方式設定位,其值為E(偶校驗位Even )、M 記號Mark )、N(默認值Default )、 None(無奇偶校驗)、O(奇校驗Odd)和S(空白Space)五

14、種。 </p><p> ?、跠 位數(shù)據(jù)位數(shù),其值有4,5,6,7,8 五種。 </p><p> ?、躍 為停止位數(shù),其值有1,1.5,2 三種。 </p><p>  一般認為,VB6.0 的通信控件MSComm 只能實現(xiàn)雙機通信,而無法實現(xiàn)對分布式網(wǎng)絡節(jié)點群的控制,因而只能另覓他徑,如通過動態(tài)鏈接庫(DLL )技術等。另一方面,由于 PC 機系統(tǒng)配置的串行接口

15、芯片,不論是早期的8250 還是后來的16C450 或16C55無多機工作的模式(即串行通信幀格式中無地址/數(shù)據(jù)使能位定義)。因此,在PC 機允許的串行通信幀格式中,利用奇偶校驗來模擬產(chǎn)生多機系統(tǒng)中必須的地址/數(shù)據(jù)使能位,可以實現(xiàn)對分布式節(jié)點群的控制。通過對VB6.0 環(huán)境下的串行通信控件MSComm 屬性以及串行信息幀 格式的深入研究,提出了直接利用串行通信控件MSComm 的有關屬性,保證串行通信幀的 奇偶位隨傳送地址或數(shù)據(jù)的變化而

16、動態(tài)變化。 </p><p>  實現(xiàn)方式:可通過動態(tài)設定MSComm 控件的Settings 屬性中的奇偶方式,以串行通信 幀中奇偶位的變化來模擬多機通信時地址/數(shù)據(jù)使能位的變化,當發(fā)送地址幀時設定奇偶校 驗位為“1”,發(fā)送數(shù)據(jù)幀時設定奇偶校驗位“0”。 </p><p>  具體有兩種實現(xiàn)方法: </p><p>  方法一:對于每次要發(fā)送的8bit 數(shù)據(jù),根據(jù)

17、發(fā)送地址幀和數(shù)據(jù)幀的要求,確定待發(fā)送數(shù)據(jù)類型,動態(tài)設定串行通信奇偶校驗為奇校驗或偶校驗。 </p><p>  方法二:利用MSComm 控件的Settings 屬性中奇偶設置方式位P的“M(Mark )”或“S(Space)”值來實現(xiàn),發(fā)送地址幀時設置奇偶方式位P 值為M,而發(fā)送數(shù)據(jù)幀時設定奇偶方式位P 值為S。 </p><p>  以上兩種方法均以犧牲串行信息幀的奇偶校驗功能為代價,

18、本系統(tǒng)中用簡單且行之有效 的“累加和校驗”方法。 </p><p> ?。?)PC 機串行通信初始化(以上述方法二為例) </p><p>  在VB6.0 的環(huán)境下,直接利用MSComm 串行通信控制Settings 屬性中的奇偶方式位P, 通過動態(tài)改變P 的值,選M(Mark)或S(Space)來模擬串行信息幀的地址/數(shù)據(jù)使能位,從而 實現(xiàn)對網(wǎng)絡多節(jié)點的控制。 </p>

19、<p><b>  其屬性設置為: </b></p><p> ?、費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>  ③InBufferCount:傳回在接收寄存器中的字符,InBufferCount 屬性設為0,用來清除寄存器。 </p><p> ?、躀nputMode:設置或傳回Input 屬性取回的數(shù)據(jù)的形式。 </p><p>  ComInputModeText: 0 以文字形式取回 </p><p>  Com

21、InputModeBinary: 1 以二進制形式取回 </p><p><b>  2.2 程序設計 </b></p><p><b>  發(fā)送數(shù)據(jù)過程: </b></p><p>  發(fā)送端口號 發(fā)送從機地址 發(fā)送命令及數(shù)據(jù) 等待 接收從機回應 判斷地址

22、 完成 </p><p><b>  接收數(shù)據(jù)過程: </b></p><p>  發(fā)送端口號 發(fā)送從機地址 發(fā)送命令 等待 接收從機地址及數(shù)據(jù) 判斷地址 判斷校驗和 完成 </p><p><b>  發(fā)送程序為例: </b></p><

23、;p>  Dim OutB( ) As Byte, InB( ) As Byte ’定義動態(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ù)庫取從機地址并發(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ù)錯誤!" </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 ’延時 </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 或定時時間到 </p><p><b>  {接收校驗} </b></p>&

30、lt;p> ?、儆捎赑C 主機與節(jié)點之間傳送的數(shù)據(jù)量比較大,通常用二進制的方式來傳輸數(shù)據(jù),并 且將數(shù)據(jù)首先存入一個形式為Byte 的動態(tài)數(shù)組中,然后在將此動態(tài)數(shù)組傳送出去。 </p><p> ?、谠诿看蝹鬏斆詈?,等待一段時間,才可能得到節(jié)點機的應答,通過計算節(jié)點機響應 時間以及反復試驗確定最佳等待時間,測試中最佳等待時間為50ms,發(fā)送節(jié)點機地址的等 待時間為50ms,在接收節(jié)點機地址及數(shù)據(jù)時等待時間為

31、200ms。 </p><p> ?、墼赑C 主機接收節(jié)點機回應時,利用一條等待循環(huán)語句來判斷InBufferCount 的字符數(shù) 和等待時間。 </p><p>  ④接收數(shù)據(jù)時,用一條循環(huán)語句將動態(tài)數(shù)組中的數(shù)據(jù)取出,并將數(shù)據(jù)轉(zhuǎn)換排序按照十進 制順序放入數(shù)據(jù)庫相應表中。 </p><p>  3.人機交互接口設計</p><p>  人機接

32、口是計算機同人機交互設備之間實現(xiàn)信息傳輸?shù)目刂齐娐?。接口中要分別傳送數(shù)據(jù)信息、命令信息和狀態(tài)信息。數(shù)據(jù)信息、命令信息和狀態(tài)信息都通過數(shù)據(jù)總線來傳送。大多數(shù)計算機都把外設的狀態(tài)信息視為輸入數(shù)據(jù),而把命令信息看成輸出數(shù)據(jù),并在接口中分設各自相應的寄存器,賦以不同的端口地址,各種信息分時地使用數(shù)據(jù)總線傳送到各自的寄存器中去。在嵌入式系統(tǒng)中,目前常見的人機接口設備有鍵盤、LCD、觸摸屏、鍵盤輸入接口</p><p>  

33、在ARM嵌入式系統(tǒng)應用中,鍵盤是人機交互對話最通用的方法之一。操作者通過鍵盤向系統(tǒng)發(fā)送各種指令或置入必要的數(shù)據(jù)信息。鍵盤模塊設計的好壞,直接關系到系統(tǒng)的可靠性和穩(wěn)定性。</p><p>  在ARM應用系統(tǒng)中,鍵盤掃描只是ARM的工作內(nèi)容之一,ARM在忙于各項工作任務的同時,如何兼顧鍵盤的輸入,則取決于鍵盤的工作方式。鍵盤工作方式的選取原則是既要保證能及時響應按鍵操作,又要不過多占用ARM的工作時間。</p

34、><p><b>  3.1按鍵接口:</b></p><p>  通常的標準鍵盤是由許多按鍵開關組成的。按鍵開關電路是指通過外力使電路瞬時接通的開關,在許多場合都有應用。比如大多數(shù)處理器的RESET電路都用到了按鍵開關,它通過按鍵產(chǎn)生一個瞬時的低電壓,CPU感知這個低電壓后重啟。在有些系統(tǒng)中也用按鍵開關切換工作模式,它通過按鍵開關生成一個低壓脈沖,產(chǎn)生一次中斷,在中斷處

35、理程序中改變工作模式,并且通過置外部標志的方式告知用戶當前的工作模式,通過切換開關,就可以實現(xiàn)在不同工作模式之間進行切換。</p><p>  3.1.1 按鍵原理:</p><p>  按鍵開關的電路如圖6.1所示。</p><p>  圖3.1 按鍵開關電路示意圖</p><p>  當按鍵斷開時,輸出高電壓,為邏輯1;當按鍵按下時,電平

36、輸出點與地相連,輸出低電平,為邏輯0。</p><p>  如圖3.1所示的按鍵開關電路是最簡單的,遺憾的是,它并不完善,因為它按下或者被釋放時,并不能明確地產(chǎn)生一個邏輯0或者邏輯1。由于按鍵是機械觸點,當機械觸點斷開、閉合時,會產(chǎn)生抖動。</p><p>  這種抖動對于用戶來說是感覺不到的,但對計算機來說,則是完全可以感應的。計算機處理的速度是在微秒級,而機械抖動的時間至少是毫秒級,這

37、對計算機而言,已是一個“漫長”的時間了。假如利用按鍵開關產(chǎn)生中斷可能就會產(chǎn)生一個問題,就是說按鍵有時靈,有時不靈,其實就是這個原因。有可能只按了一次按鍵,可是計算機卻已執(zhí)行了多次中斷的操作。</p><p>  為使CPU能正確地讀出按鍵的狀態(tài),對每一次按鍵只作一次響應,就必須考慮如何去除抖動。常用的去除抖動方法有軟件方式和硬件方式兩種。</p><p>  對于簡單的按鍵電路,可以采用軟

38、件方法去除抖動。軟件方法其實很簡單,就是在程序獲得外接端口為低的信息后,不是立即認定按鍵已被按下,而是延時10毫秒或者更長一段時間后再次檢測外部端口,如果仍為低,說明按鍵的確按下了,這實際上是避開了按鍵按下時的抖動時間。同理,在檢測到按鍵釋放后再延時5~10毫秒,消除后沿的抖動,然后再對鍵值處理。實踐證明,不對按鍵釋放的后沿進行處理,通常也能滿足一定的要求。</p><p>  但有時用軟件方式并不能很好地解決按

39、鍵抖動問題,例如按鍵開關連接的是中斷請求線,程序是不能讀取中斷請求線的狀態(tài)的,這時就需要使用硬件方法。硬件方法其實就是一個去除抖動電路,用于去除按下和釋放按鍵時的波形抖動,這個電路也是比較簡單的,讀者可以查找相關去抖電路。對于比較復雜的矩陣鍵盤而言,通常使用專用芯片去除抖動,例如鍵盤接口芯片8279、MAX6816、MAX6817、MAX6818等。</p><p>  3.1.2 常用鍵盤接口</p>

40、;<p>  常用按鍵接口可分為獨立式按鍵接口、行列式按鍵接口和專用芯片式按鍵接口等。具體采用哪種方式,可根據(jù)所設計系統(tǒng)的實際情況而定。下面分別介紹這幾種接口方式的優(yōu)缺點及適用場合。</p><p><b>  1.獨立式按鍵接口</b></p><p>  獨立式按鍵接口設計優(yōu)點是電路配置靈活,軟件實現(xiàn)簡單。但缺點也很明顯,每個按鍵需要占用一根口線,若

41、按鍵數(shù)量較多,資源浪費將比較嚴重,電路結(jié)構(gòu)也變得復雜。因此本方法主要用于按鍵較少或?qū)Σ僮魉俣纫筝^高的場合。軟件實現(xiàn)時,可以采用中斷方式,也可以采用查詢方式,如圖3.2所示。</p><p>  圖3.2 獨立式鍵盤接口</p><p><b>  2.行列式按鍵接口</b></p><p>  行列式按鍵接口如圖3.3所示,其使用原理將在下

42、節(jié)詳細講述。行列式按鍵接口適用于按鍵數(shù)量較多,又不方便使用專用鍵盤芯片的場合。這種方式的按鍵接口由行線和列線組成,按鍵位于行、列的交叉點上。這種方式的優(yōu)點就是相對于獨立接口方式可以節(jié)省很多I/O資源,相對于專用芯片鍵盤可以節(jié)省成本,且更為靈活。缺點就是需要用軟件處理消抖、重鍵等。</p><p>  行列式按鍵接口是一種老式的鍵盤接口,其按鍵掃描方法是幾乎所有PC鍵盤所采用的方法。</p><

43、p>  如何確定行列式鍵盤上哪個鍵被按下,這里介紹一種“行掃描法”。行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法。掃描過程分為以下兩步。</p><p>  (1)判斷鍵盤中有無鍵按下。將全部行線置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平與4根行線相交叉的4個按鍵中。若所有列線</p><p>  均為高電平

44、,則鍵盤中無鍵按下。</p><p> ?。?)判斷閉合鍵所在的位置。在確認有鍵被按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在某根行線為低電平時,把其他行線置為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵即為閉合按鍵。</p><p>  例如在圖3.3中,CPU的低8位用作鍵盤I/O口,

45、其中,鍵盤的列線連接到I/O口的低4位,鍵盤的行線連接到I/O口的高4位。列線B0~B3分別連接有4個上拉電阻到正電源+5V,并把列線設置為輸入線,行線B4~B7設置為輸出線,4根行線和4根列線形成16個相交點。如果進行鍵盤掃描,再加上去除抖動的功能,要執(zhí)行如下操作:</p><p> ?。?)檢測當前是否有按鍵被按下。檢測的方法是B4~B7輸出全“0”,讀取B0~B3的狀態(tài),若B0~B3全為“1”,則無鍵閉合,

46、否則為0的那一列有鍵閉合。</p><p> ?。?)去除鍵抖動。當檢測到有鍵按下后,延時一段時間再作下一步的檢測判斷。</p><p> ?。?)若有鍵被按下,應識別出是哪一個鍵閉合。方法是對鍵盤的行線進行掃描。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> ?。?)在每組行輸出時讀取P0~P3,若全為“1”,則表示設為“0”的這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,通常是一個掃描碼,然后可采用計算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值。為了保證鍵每閉合一次CPU僅作一

48、次處理,必須去除按鍵釋放時的抖動。</p><p>  通過以上步驟就可以得到被按下鍵的掃描碼了,通常把掃描碼放到一個緩沖區(qū)內(nèi),直到應用程序處理按鍵為止。緩沖是一個很有用的措施,因為當應用程序出現(xiàn)按鍵狀態(tài)改變卻不能及時處理的情況時,通過緩沖區(qū)就可以防止按鍵的丟失。緩沖區(qū)的大小取決于應用程序的需要,一般應該大于10。一般來說,都是把緩沖區(qū)作為一個環(huán)行隊列來管理。使用兩個指針,一個指向第一個空位,一個指向第一個掃描碼

49、。當一個按鍵被按下時,掃描碼將被放置在環(huán)形隊列的空指針指向的位置。而應用程序則是通過指向第一個掃描碼的指針去讀取掃描碼。若緩沖區(qū)已滿,則任何下一個按鍵都將被丟棄</p><p>  3.專用芯片式按鍵接口</p><p>  專用鍵盤處理芯片一般功能比較完善,芯片本身能完成對按鍵的編碼、掃描、消抖和重鍵等問題的處理,甚至還集成了顯示接口功能。專用鍵盤處理芯片的優(yōu)點很明顯,可靠性高,接口簡單

50、,使用方便,適合處理按鍵較多的情況。但在很多應用場合,考慮成本因素,可能并不是最佳選擇。</p><p>  3.1.3鍵盤驅(qū)動程序?qū)嵗?lt;/p><p>  在前面部分已經(jīng)對如何在一個嵌入式系統(tǒng)中擴展小鍵盤及相關電路連接進行了說明。在嵌入式系統(tǒng)的軟件部分,要做的就是把前面的硬件電路驅(qū)動起來,為它們寫一個驅(qū)動程序,下面就以一個實例進行說明如何編寫鍵盤驅(qū)動程序。</p><

51、p>  鍵盤作為Linux默認輸入設備,一般嵌入式Linux操作系統(tǒng)都帶有標準鍵盤的驅(qū)動程序。鍵盤是一個字符設備,它的驅(qū)動程序為drivers/char/keyboard.c,其對應的頭文件為keyboard.h。在Intel構(gòu)架中,鍵盤把自己固定在IRQ1上,鍵盤狀態(tài)的寄存器地址為0x64h,鍵盤掃描碼的寄存器地址為0x60h。當用戶按下按鍵后,將產(chǎn)生中斷,在中斷處理程序中,將讀出鍵盤狀態(tài)和鍵盤掃描碼,然后把鍵盤掃描碼通過對應表

52、轉(zhuǎn)換為ASCII碼,送往用戶應用程序。</p><p>  本節(jié)的實例也是針對Intel x86體系結(jié)構(gòu)。參照標準鍵盤的驅(qū)動程序,這個實例也使用IRQ1中斷,從0x64h讀入鍵盤狀態(tài),從0x60h讀入鍵盤掃描碼,這樣就跟系統(tǒng)自帶的鍵盤驅(qū)動程序發(fā)生沖突了,這時的新添程序是無法捕捉按鍵中斷的。由于系統(tǒng)自帶的驅(qū)動程序和要寫的驅(qū)動代碼不能共存,所以首先必須使系統(tǒng)自帶的鍵盤驅(qū)動釋放中斷。但因為在內(nèi)核源文件里它是作為一個靜態(tài)

53、符號被定義的,所以沒有辦法恢復它,只能重新啟動,才能恢復原來的中斷。</p><p>  本節(jié)這段代碼是把它自動綁定到IRQ1上,在Intel結(jié)構(gòu)下這是鍵盤控制的IRQ。這時,當它連接到一個鍵盤中斷時,將讀出鍵盤的狀態(tài)(這是inb(0x64)的目的)和由鍵盤返回的掃描碼。隨后只要內(nèi)核認為可以時,它將運行got_char給出鍵的編碼(掃描碼的前7位)和是否被按下的信息(如果第8位是0則表示按下,是1表示釋放)。&l

54、t;/p><p>  3.2 LCD顯示接口</p><p>  在ARM嵌入式系統(tǒng)中,人機接口不但包括可以輸入的鍵盤,還有用于傳送信息給用戶的輸出設備。液晶顯示器LCD具有顯示信息多、質(zhì)量高、無電磁輻射、可視面積大、應用范圍廣、畫面效果好、數(shù)字式接口、體積小、功耗低等特點,在基于微處理器的嵌入式系統(tǒng)終端顯示、人機接口中受到普遍歡迎,極大地提高了嵌入式系統(tǒng)的易用性和操作的直觀性。本節(jié)將主要介

55、紹LCD顯示原理、LCD分類及LCD驅(qū)動程序。</p><p>  3.2.1 LCD簡介</p><p><b>  1.顯示原理</b></p><p>  液晶顯示器的顯像原理,是將液晶置于兩片導電玻璃之間,靠兩個電極間電場的驅(qū)動,引起液晶分子扭曲向列的電場效應,以控制光源透射或遮蔽功能,在電源開/關之間產(chǎn)生明暗而將影像顯示出來。若加上

56、彩色濾光片,則可顯示彩色影像。在兩片玻璃基板上裝有配向膜,所以液晶會沿著溝槽配向。由于玻璃基板配向膜溝槽偏離90°,所以液晶分子成為扭轉(zhuǎn)型,當玻璃基板沒有加入電場時,光線透過偏光板跟著液晶作90°扭轉(zhuǎn),透過下方偏光板,液晶面板顯示白色;當玻璃基板加入電場時,液晶分子產(chǎn)生配列變化,光線通過液晶分子空隙維持原方向,被下方偏光板遮蔽,光線被吸收無法透出,液晶面板顯示黑色。液晶顯示器便是根據(jù)此電壓有無,使面板達到顯示效果。&

57、lt;/p><p>  2.LCD顯示器的分類</p><p>  按顯示功能的強弱分類,LCD可分為段位式LCD、字符式LCD和點陣式LCD。其中,段位式LCD和字符式LCD只能用于字符和數(shù)字的簡單顯示,不能滿足圖形、曲線和漢字顯示的要求。而點陣式LCD不僅可以顯示字符、數(shù)字,還可以顯示各種圖形、曲線和漢字,并且可以實現(xiàn)屏幕上下左右滾動、動畫、分區(qū)開窗口、反轉(zhuǎn)、閃爍等功能,用途十分廣泛。&l

58、t;/p><p>  按照液晶顯示器的使用場合,其采用的顯示模塊還可以分為數(shù)顯液晶模塊、點陣式液晶字符模塊、點陣圖型液晶模塊。下面將分別對這3類顯示模塊加以介紹。</p><p><b> ?。?)數(shù)顯液晶模塊</b></p><p>  數(shù)顯液晶模塊是一種由段式液晶顯示器件與專用的集成電路組裝成一體的功能部件,只能顯示數(shù)字和一些標識符號。段式液晶

59、顯示器件大多應用在便攜、袖珍設備上。由于這類設備體積小,所以盡可能不將顯示部分設計成單獨的部件。即使一些應用領域需要單獨的顯示組件,也應該使其除具有顯示功能外,還應具有一些信息接收、處理、存儲傳遞等功能。由于它們具有某些通用的、特定的功能,而廣受市場的歡迎。常見的數(shù)顯液晶顯示模塊具有計數(shù)、計時、計量等功能。</p><p> ?。?)點陣式液晶字符模塊</p><p>  點陣式液晶字符模

60、塊是由點陣式液晶顯示器件和專用的行、列驅(qū)動器,控制器以及必要的連接器件裝配而成的。它可以顯示數(shù)字和西文字符。這種點陣式字符模塊有的本身帶有字庫,有字符發(fā)生器,具有顯示容量大、功能豐富的特點。一般這種模塊最少也可以顯示8位1行或者16位1行以上的字符。這種模塊的點陣排列是有8×8、16×8或16×16的一組一組像素點陣排列組成的。每組的像素組成1個字,每個字之間有一定的間隔,每行字之間也有一行的間隔,所以不能

61、顯示圖形。</p><p>  一般在模塊控制、驅(qū)動器內(nèi)不僅具有已固化好字符字模的字符庫CGROM,還具有讓用戶自定義建立專用字符的隨機存儲器CGRAM,它允許用戶建立自己的點陣字符。</p><p> ?。?)點陣式圖形液晶模塊</p><p>  點陣圖形液晶模塊也是點陣模塊的一種,其特點是點陣像素連續(xù)排列,行和列在排布中均沒有空隔,因此可以顯示連續(xù)、完整的圖形

62、。由于它也是由X-Y矩陣像素構(gòu)成的,所以除顯示圖形外,也可以顯示字符。它又可以分為以下幾類:</p><p><b>  1) 行、列驅(qū)動型</b></p><p>  行、列驅(qū)動型是一種必須外接專用控制器的模塊,其模塊只裝配有通用的行、列驅(qū)動器,這種驅(qū)動器實際上只有對像素的一般驅(qū)動輸出端,而輸入端一般只有4位以下的數(shù)據(jù)輸入端、移位信號輸入端、鎖存輸入端、交流信號輸入

63、端等,如HD44100、IID66100等。此種模塊必須外接控制電路,如HD61830、SED1330等才能與計算機連接。該種模塊數(shù)量最多,應用最普遍。雖然需要采用自配控制器,但它也給客戶留下了可以自行選擇不同控制器的自由。</p><p><b>  2) 行、列控制型</b></p><p>  行列控制型是一種可直接與計算機接口,依靠計算機直接控制驅(qū)動器的模塊。

64、這類模塊所用的列驅(qū)動器具有I/O總線數(shù)據(jù)接口,可以將模塊直接掛在計算機的總線上,省去了專用控制器,因此對整機系統(tǒng)降低成本有很大的好處。對于顯示系統(tǒng)的像素數(shù)量不大,整機功能不是很復雜的系統(tǒng)非常適用,不過它會占用系統(tǒng)的部分資源。</p><p>  3) 行列驅(qū)動—控制型</p><p>  行列驅(qū)動—控制型是一種內(nèi)藏控制器的點陣圖形模塊,也是比較受歡迎的一種類型。這種模塊不僅裝有如第一類的行

65、、列驅(qū)動器,而且也裝配有如T6963C等的專用控制器。這種控制器是液晶驅(qū)動器與計算機的接口,它以最簡單的方式受控于計算機,接收并反饋計算機的各種信息,經(jīng)過自己獨立的信息處理實現(xiàn)對顯示緩沖區(qū)的管理,并向驅(qū)動器提供所需要的各種信號、脈沖,操縱驅(qū)動器實現(xiàn)模塊的顯示功能。這種控制器具有自己的一套專用指令,并具有自己的字符發(fā)生器CGROM,這就要求用戶必須熟悉這種控制器的詳細說明書,才能進行操作。這種模塊使用戶擺脫了對控制器的設計、加工、制作等一

66、系列工作,又使計算機避免了對顯示器的繁瑣控制,節(jié)約了主機系統(tǒng)的內(nèi)部資源。</p><p><b>  3.顯示漢字</b></p><p>  一般西文為8×8點陣,因而顯示一個西文字符只需要8個字節(jié),而每一個漢字要占4個西文字體,因此顯示一個漢字需要32個字節(jié)。漢字字庫表為一張數(shù)據(jù)表,每個漢字在數(shù)據(jù)表中通常由32個字節(jié)組成一個點陣圖形。在應用時,連續(xù)取32

67、個字節(jié)送到LCD的相應位置,就能正確顯示漢字后的圖形符號。在嵌入式系統(tǒng)中,如果需要顯示的漢字是固定的,并且字數(shù)較少,可以直接在軟件的頭文件中定義漢字的顯示點陣表格,要顯示時,直接從表格變量數(shù)組中連續(xù)取出32個漢字送往LCD顯示器即可。但是如果要顯示的漢字字數(shù)很多,或者又不能確定要顯示哪些漢字時,使用上述辦法就相當麻煩了。這時應當使用漢字字庫。有些LCD驅(qū)動器自帶漢字字庫,如果沒有帶,可以自己使用ROM擴展,通過把漢字機內(nèi)碼送往字庫文件,

68、得到對應的顯示點陣。</p><p>  3.2.2 在嵌入式Linux中驅(qū)動LCD</p><p>  隨著應用需求的推動,嵌入式Linux操作系統(tǒng)下也出現(xiàn)了許多圖形界面軟件包,如MiniGUI、Trolletech公司的Embedded QT等。這些圖形界面開發(fā)包與WinCE相似,在圖形軟件包的開發(fā)和移植工作中都牽涉到底層LCD驅(qū)動的問題。在本節(jié)中將介紹有關在嵌入式Linux下實現(xiàn)L

69、CD驅(qū)動的相關知識。</p><p>  Linux的設備管理是和文件系統(tǒng)緊密相關的,各種設備都以文件的形式存儲在/dev目錄下,稱為設備文件。應用程序可以打開、關閉、讀寫這些設備文件,完成對設備的操作,就像對普通數(shù)據(jù)文件操作一樣。另外,Linux把它所管理的設備分為字符設備和塊設備,它們的區(qū)別在于系統(tǒng)為塊設備提供了緩沖機制。由于設計緩沖區(qū)的管理、調(diào)度和同步等問題,塊設備的驅(qū)動要比字符設備復雜。Linux把顯示驅(qū)

70、動也看作字符設備,把要顯示的數(shù)據(jù)一個字節(jié)一個字節(jié)地送往LCD驅(qū)動器。</p><p>  Linux為所有的設備文件都提供了統(tǒng)一的操作函數(shù)接口,方法是使用數(shù)據(jù)結(jié)構(gòu)struct file_operations,這個數(shù)據(jù)結(jié)構(gòu)中包括許多操作函數(shù)的指針,如open()、close()、read()、write()等。但是,由于外設的種類繁多,操作方式也不一樣,如聲音設備驅(qū)動要使用DMA通道、顯示設備要提供對顯存的操作、硬

71、盤驅(qū)動要處理復雜的緩沖區(qū)結(jié)構(gòu)等。如果file_operations中的函數(shù)都是用驅(qū)動開發(fā)人員來編寫實現(xiàn),其工作量相當大,而且對于每一類設備,它的許多操作也是相似的,許多數(shù)據(jù)結(jié)構(gòu)也是可以公用的。</p><p>  為了解決這個問題,Linux采用了更高一層的封裝方法,為同一類設備定義好了文件層次的file_operations結(jié)構(gòu)中的接口函數(shù),在其中處理了大多數(shù)設備相關的操作,如各種緩沖區(qū)的申請和釋放等。而具體操

72、作底層硬件的一小部分則留給驅(qū)動開發(fā)人員去實現(xiàn),這樣就大大減少了驅(qū)動程序開發(fā)的難度。所以Linux提供了另外一個文件層到底層驅(qū)動的接口,通常為一個結(jié)構(gòu)體,其中包含成員變量和函數(shù)指針等,不同的設備驅(qū)動有著不同的數(shù)據(jù)結(jié)構(gòu)。這樣,一方面保證了文件層I/O接口file_operations的一致性;另一方面,驅(qū)動程序的開發(fā)人員也不用了解設備驅(qū)動太多的細節(jié),只需專注于硬件相關的I/O操作即可。</p><p>  Linux

73、為顯示設備提供的幀緩沖驅(qū)動也采用這種“文件層—文件層”的方式。下面首先對幀緩沖進行相應介紹。</p><p>  FrameBuffer是出現(xiàn)在Linux2.2.xx及其以后版本內(nèi)核當中的一種驅(qū)動程序接口。這種接口將顯示設備抽象為幀緩沖區(qū)。用戶可以將它看成是顯示內(nèi)存的一個映像,將其映射到進程地址空間之后,就可以直接進行讀寫操作,而寫操作可以立即地反映在屏幕上。</p><p>  幀緩沖設

74、備對應的設備文件是/dev/fb*,如果系統(tǒng)有多個顯卡,Linux還支持多個幀緩沖設備,最多可以有32個,分別為/dev/fb0、/dev/fb1…/dev/fb31。而/dev/fb則指向當前的幀緩沖設備,一般為/dev/fb0,當然在嵌入式系統(tǒng)中一般只有一個幀緩沖設備。</p><p>  幀緩沖設備也屬于字符設備,與聲音設備一樣,也采用“文件層—驅(qū)動層”的接口方式。在文件層為之定義了數(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, //關閉操作</p><p><b>  }</b></p><p>  其成員函數(shù)都在linux/drivers/vedio/fbmem.c中定義,其中的函數(shù)對具體的硬件進行操作,對寄存器進行設置,對顯示緩沖進行映射。</p><p>  由于顯示設備的特殊性,在驅(qū)動層的接口中不但要包括底層函數(shù),還要有一些記錄設備狀態(tài)

78、的數(shù)據(jù),Linux為幀緩沖設備定義的驅(qū)動層接口為struct fb_info結(jié)構(gòu),在include/linux/fb.h中定義。這個數(shù)據(jù)結(jié)構(gòu)記錄了幀緩沖設備的全部信息,包括設備的設置參數(shù)、狀態(tài)以及操作函數(shù)的指針等。每個幀緩沖設備都必須對應一個fb_info結(jié)構(gòu)。其成員變量modename為設備名稱、fontname為顯示字體、fbops為指向底層操作函數(shù)的指針,這些函數(shù)需要驅(qū)動開發(fā)人員根據(jù)硬件設備的具體特性編寫。另外還有兩個記錄設備狀態(tài)

79、的數(shù)據(jù)結(jié)構(gòu)struct fb_var_screeninfo和struct fb_fix_screeninfo,它們分別記錄可設置信息和不可設置的設備信息。</p><p>  如果要編寫一個幀緩沖設備的驅(qū)動程序,所要做的主要工作包括:</p><p> ?。?)編寫初始化函數(shù)</p><p>  初始化函數(shù)首先初始化LCD控制器,通過寫寄存器設置顯示模式和顯示顏色數(shù)

80、,然后分配LCD顯示緩沖區(qū)。在Linux中可以用kmalloc()函數(shù)分配一段連續(xù)的空間。緩沖區(qū)的大小為:</p><p>  點陣行數(shù)×點陣列數(shù)×用于表示一個像素的比特數(shù)/8</p><p>  緩沖區(qū)通常分配在大容量的片外SDRAM中,起始地址保存在LCD控制寄存器中。</p><p>  然后,初始化一個fb_info結(jié)構(gòu),填充其成員變量,

81、并調(diào)用register_framebuffer(&fb_info),將fb_info登記入內(nèi)核。</p><p><b> ?。?)編寫成員函數(shù)</b></p><p>  編程fb_info中函數(shù)指針fb_ops對應的成員函數(shù),對于嵌入式系統(tǒng)相對比較簡單,只需實現(xiàn)以下3個函數(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ù)都是用來設置/獲取fb_info中的成員變量的。當應用程序調(diào)用ioctl操作時會調(diào)用它們。</p><p>  通過/dev/fb,對顯示設備的操作主要有以下幾種:</p><p> ?。?)讀寫(read/

85、write) /dev/fb</p><p>  相當于讀寫屏幕緩沖區(qū)。例如cp /dev/fb temp相當于把屏幕中的內(nèi)容復制到一個temp文件中,而cp temp /dev/fb則把temp文件中的內(nèi)容在屏幕上顯示出來。</p><p> ?。?)映射(map)操作</p><p>  由于Linux工作于保護模式,每個應用進程都有自己的虛擬地址空間,在應用程

86、序中是不能直接訪問物理緩沖地址的。為此,Linux在文件操作接口file_operations中提供了mmap操作,可以將文件的內(nèi)容映射到用戶空間。對于幀緩沖設備,則可通過映射操作,將屏幕緩沖區(qū)的物理地址映射到用戶空間的一段虛擬地址中(在µClinux中,沒有MMU,不存在虛擬地址,直接映射到實地址),之后用戶就可以通過讀寫這段地址訪問屏幕緩沖區(qū),在屏幕上繪圖了。</p><p><b>  

87、(3)I/O控制</b></p><p>  對于幀緩沖設備,通過對設備文件的ioctl()調(diào)用可以讀取/設置顯示設備或者屏幕的參數(shù),如分辨率、顯示顏色數(shù)、屏幕大小等。ioctl()的實現(xiàn)由底層驅(qū)動來完成。</p><p>  在應用程序中,操作/dev/fb的一般步驟如下:</p><p> ?。?)打開/dev/fb設備文件。</p>

88、<p> ?。?)用ioctl()取得當前顯示屏幕的參數(shù),如屏幕的分辨率、每個像素的比特數(shù)等,根據(jù)屏幕參數(shù)可以計算出屏幕緩沖區(qū)的大小。用于存儲顯示信息的有兩個數(shù)據(jù)結(jié)構(gòu)即struct fb_var_screeninfo和struct fb_fix_screeninfo。其中第一個存儲可以設置的顯示信息,如顯示深度、分辨率等。第二個數(shù)據(jù)結(jié)構(gòu)用于存儲一些不可設置的顯示信息,如屏幕緩沖區(qū)的物理地址、大小等信息。</p>

89、<p> ?。?)將屏幕緩沖區(qū)映射到用戶空間。映射之后就可以直接對屏幕緩沖區(qū)進行讀寫、繪圖和顯示圖片了。</p><p><b>  典型應用程序如下:</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); //打開設備文件</p><p>  ioctl(fbfd,FBIOGET_FSCREENINFO,&finfo); //取得屏幕相關參數(shù)</p><p>  ioctl(fbf

92、d,FBIOGET_VSCREENINFO,&vinfo);</p><p>  screensize=vinfo.xres*vinfo.yres*vinfo.bits_per_pixel/8; //計算屏幕緩沖區(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ū),進行圖形繪制</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,其余型號不用或為LED背光電源輸入。</p><p>  關于該模塊的具體工作原理與控制方法等更詳細的內(nèi)容,請參考相關用戶手冊。</p><p>  本系統(tǒng)中LCD模塊與S

95、3C4510B連接如圖3.4所示。</p><p>  S3C44B0X中內(nèi)置的LCD控制器可支持灰度LCD和彩色LCD。使用基于時間的抖動算法和幀速率控制方法,可以支持單色、4級灰度和16級灰度模式的灰度LCD。在彩色LCD上,可以支持256級彩色。對于不同尺寸的LCD,它們有不同數(shù)量的垂直和水平像素、數(shù)據(jù)接口的數(shù)據(jù)寬度、接口時間及刷新率,而LCD控制器可以通過編程來控制相應的寄存器值,以適應不同的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個可編程寄存器,用于配置LCD控制器;LCDCDMA為專用DMA,可以自動地將顯示數(shù)據(jù)從幀內(nèi)存?zhèn)魉偷絃CD驅(qū)動器中,通過專用DMA,可以在不需要CPU介入的情況下顯示數(shù)據(jù);VIDPRCS從LCDCDMA接收不同格式的數(shù)據(jù),以支持常見的LCD驅(qū)動器所需要的不同接口時間和速率的要求。TIMEGEN包含可編程的邏輯,產(chǎn)生VFRAME、VLINE、VCLK和VM等信號。表3.2給出了LCD控制器外部接

98、口信號的含義。</p><p>  表3.2 LCD控制器外部接口信號</p><p>  LCDCDMA對應于先入先出(FIFO,F(xiàn)irst Input First Output)寄存器。當FIFO變空或部分空的時候,LCDCDMA請求從幀內(nèi)存中用突發(fā)傳輸模式預取數(shù)據(jù),這種傳輸請求被內(nèi)存控制器的總線仲裁器接收時,就把4個連續(xù)的字從系統(tǒng)內(nèi)存?zhèn)鬏數(shù)絻?nèi)部FIFO。FIFO由分別為12個字的F

99、IFOL和FIFOH組成,總長度為24個字。S3C44B0X因為需要支持雙掃描顯示模式,所以有兩個這樣的FIFO,但是在單掃描模式下只用其中的一個。</p><p>  S3C44B0X中內(nèi)置的LCD控制器可通過一系列的寄存器進行控制。</p><p>  3.2.4 uClinux下開發(fā)LCD應用程序</p><p>  uClinux系統(tǒng)提供了—系列的圖形界面

100、接口函數(shù)API。它們仿照Win32API的接口,使用戶能夠以最短的時間熟悉并使用它們。API的原型可以參考/HHARM44B0-EDU-R1/uClinux/appsrc/gui/graphic.c文件。在該文件中,對各個API給出了詳細的定義和使用方法??梢哉{(diào)用graphic.c中的函數(shù),也可以有選擇地將函數(shù)中的代碼加到所需要的應用中。</p><p>  下面分析這些API是如何通過LCD驅(qū)動程序操作LCD的

101、。</p><p><b>  1.打開LCD設備</b></p><p>  LCD設備的打開由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設備;然后通過ioctl發(fā)送FBIOGET_VSCREENINFO取得設備的相關參數(shù),其中主要參數(shù)是屏的長、寬像素數(shù),都是160,每個像素用1bit表示;緊接著調(diào)用函數(shù)mmap()取得指向LCD幀緩存內(nèi)存的指針screen_ptr,以后對LCD的操作就是對這個指針的操作,與對內(nèi)存操作完全相同,例如清屏操作memset(screen_ptr,0,160*160

103、/8)。</p><p>  Linux中提供內(nèi)存映像文件的機制來加速I/O操作,普通的設備操作read/write會通過內(nèi)核緩存讀入或讀出數(shù)據(jù),內(nèi)存映像文件的機制跳過內(nèi)核緩存,加快了對fb0設備的訪問。而且?guī)彺姹挥成涞竭M程地址空間后,進程可以像訪問普通內(nèi)存一樣對文件進行訪問,不必再調(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指定文件應被映射到進程空間的起始地址,一般被指定一個空指針,此時選擇起始地址的任務留給內(nèi)核來完成。函數(shù)的返回值為最后文件映射到進程空間的地址,進程可直接操作起始地址為該值的有效地址。參數(shù)1en是映射到調(diào)用進

105、程地址空間的字節(jié)數(shù),它從被映射文件開頭offset個字節(jié)開始算起。參數(shù)prot指定共享內(nèi)存的訪問權(quán)限,可對以下幾個值進行或運算:PROT_READ(可讀),PR0T_WRITE(可寫),PROT_EXEC(可執(zhí)行),PROT_NONE(不可訪問)。參數(shù)flags由以下幾個常值指定:MAP_SHARED,MAP_PRIVATE,MAP_FIXED,其中,MAP_SHARED和MAP_PRIVATE必選其一,而MAP_FIXED則不推薦使用

106、。參數(shù)fd為即將映射到進程空間的文件描述符;參數(shù)offset一般設為0,表示從文件頭開始映射。關于mmap()參數(shù)的進一步信息,讀者可參考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ù)。由于每個像素由1bit表示,因此幀緩存的大小等于像素數(shù)除以8。</p><p><b>  2.關閉LCD設備</b></p><p>  這一功能通過如下方法完成:</p><p&

108、gt;  void closegraph()</p><p>  if(screen_fd!=-1) close(screen_fd)</p><p><b>  3.點的繪制</b></p><p>  描點setpixe函數(shù)就是將二維(x,y)坐標對應的幀緩存中某一位置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é)的,所以要計算(x,y)對應的位首先要計算出(x,y)對應的字</p><p>  //節(jié),還要根據(jù)x的后3位計算出要

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論