日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

音频电平vu显示表软件下载_正点原子开拓者 Nios II资料连载第十章MCU TFT-LCD图片显示实验...

發(fā)布時(shí)間:2023/12/20 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 音频电平vu显示表软件下载_正点原子开拓者 Nios II资料连载第十章MCU TFT-LCD图片显示实验... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1)實(shí)驗(yàn)平臺(tái):正點(diǎn)原子開拓者FPGA 開發(fā)板

2)摘自《開拓者 Nios II開發(fā)指南》關(guān)注官方微信號(hào)公眾號(hào),獲取更多資料:正點(diǎn)原子

3)全套實(shí)驗(yàn)源碼+手冊(cè)+視頻下載地址:http://www.openedv.com/docs/index.html

第十章MCU TFT-LCD圖片顯示實(shí)驗(yàn)

TFT LCD是Thin Film Transistor Liquid Crystal Display的縮寫,即薄膜場(chǎng)效應(yīng)晶體

管液晶顯示器,即每個(gè)液晶像素點(diǎn)都是由集成在像素點(diǎn)后面的薄膜晶體管來驅(qū)動(dòng),這樣不僅

提高了顯示屏的響應(yīng)速度,同時(shí)還可以精確控制顯示色階,做到高速度、高彩色保真度、高

亮度、高對(duì)比度和高分辨率。TFT LCD能夠低電壓驅(qū)動(dòng),具有功耗低,使用壽命長(zhǎng)等特點(diǎn)。其

顯示應(yīng)用范圍覆蓋了從1英寸至40英寸范圍內(nèi)的所有顯示器以及投影大平面,是全尺寸顯示終

端。另外TFT LCD的環(huán)保特性好,無輻射、無閃爍,是設(shè)計(jì)用戶友好型圖形界面的優(yōu)良載體。

本章我們將使用Nios II驅(qū)動(dòng)TFT LCD的顯示。

本章包括以下幾個(gè)部分:

10.1 簡(jiǎn)介

10.2 實(shí)驗(yàn)任務(wù)

10.3 硬件設(shè)計(jì)

10.4 軟件設(shè)計(jì)

10.5 下載驗(yàn)證

簡(jiǎn)介

ATK-4.3’TFTLCD是ALIENTEK推出的一款高性能4.3寸電容觸摸屏模塊。該模塊屏幕分辨

率為800*480,16位真彩顯示,采用Intel8080接口(MCU接口),該芯片自帶GRAM,無需外加

驅(qū)動(dòng)器,因而任何單片機(jī),都可以輕易驅(qū)動(dòng)。此外ALIENTEK還推出了一款具有相同接口和分

辨率的TFTLCD——ALIENTEK第二代7寸TFTLCD——ATK-7’ TFTLCD-V2.2,ATK-7’TFTLCD V2

模塊具有屏幕分辨率高(800*480),支持16/18/24位真彩顯示、支持8/9/12/16位數(shù)據(jù)格

式、支持開窗顯示等特色。當(dāng)然了,ALIENTEK也提供了3.5寸和2.8寸的TFTLCD,以滿足不同

應(yīng)用的需求。

雖然這些不同尺寸的TFTLCD的LCD驅(qū)動(dòng)器芯片不同(關(guān)于各尺寸的TFTLCD的詳細(xì)介紹可參

見提供的增值資料部分),如7寸的ATK-7’ TFTLCD-V2.2采用的是SSD1963、4.3寸的ATK-

4.3’TFTLCD采用的是NT35510等,但都采用Intel8080接口。Intel8080接口是一種并行接口

協(xié)議,由Intel公司提出,被廣泛應(yīng)用于各類液晶顯示器。下面我們了解一下Intel8080接口

的操作時(shí)序。

為了更好的了解Intel8080接口,我們先來看一下TFTLCD模塊的接口原理圖,如下圖所

示:

圖10.1.1 TFTLCD模塊接口原理圖

各引腳的詳細(xì)描述如下表所示:

表格10.1.1 TFTLCD模塊接口引腳功能描述

在Intel8080并口模式下,LCD驅(qū)動(dòng)需要用到的信號(hào)線如下:

CS:LCD片選信號(hào)。

WR:向LCD寫入數(shù)據(jù)。

RD:從LCD讀取數(shù)據(jù)。

D[15:0]:16位雙向數(shù)據(jù)線(RGB565)。

RST:硬復(fù)位LCD。

RS:命令/數(shù)據(jù)標(biāo)志(0,讀寫命令;1,讀寫數(shù)據(jù))。

除了以上信號(hào),我們一般還需要用到這2個(gè)信號(hào):RST和BL_CTR,其中RST是液晶的硬復(fù)位

腳,低電平有效,用于復(fù)位TFTLCD的驅(qū)動(dòng)芯片如NT35510,實(shí)現(xiàn)液晶復(fù)位,在每次初始化之

前,我們建議先執(zhí)行硬復(fù)位,再做初始化。BL_CTR則是背光控制引腳,高電平有效,即高電平時(shí)點(diǎn)亮背光,另外可以用PWM控制BL_CTR腳,從而控制背光的亮度。

Intel8080并口讀/寫的過程為:拉低片選CS,選中驅(qū)動(dòng)芯片,并根據(jù)要寫入/讀取的數(shù)據(jù)

的類型,設(shè)置RS為高(數(shù)據(jù))/低(命令),然后我們根據(jù)是讀數(shù)據(jù)還是寫數(shù)據(jù)設(shè)置RD/WR為

低,即當(dāng)寫數(shù)據(jù)時(shí),WR設(shè)為低電平,RD保持高電平,當(dāng)讀數(shù)據(jù)時(shí),RD設(shè)為低電平,WR保持高

電平,然后:當(dāng)WR由低到高時(shí),TFTLCD鎖存數(shù)據(jù)。寫時(shí)序的時(shí)序圖如下:

圖10.1.2 8080 并口寫時(shí)序圖

從上圖可以看到,在寫數(shù)據(jù)時(shí),讀信號(hào)RD保持高電平,RS根據(jù)寫數(shù)據(jù)的類型設(shè)置為高或

低電平(高:數(shù)據(jù),低:命令),當(dāng)WR為低電平時(shí),往D0~D15寫數(shù)據(jù),當(dāng)WR由低電平變成高

電平時(shí),TFTLCD鎖存數(shù)據(jù)。

讀時(shí)序的時(shí)序圖如下:

圖 10.1.3 8080 并口讀時(shí)序圖

從上圖可以看到,在讀數(shù)據(jù)時(shí),寫信號(hào)WR保持高電平,當(dāng)RD為低電平時(shí),TFTLCD控制數(shù)

據(jù)總線D0~D15,當(dāng)RD由低電平變成高電平時(shí),主機(jī)讀取數(shù)據(jù)。

Intel8080接口方式下,控制腳的信號(hào)狀態(tài)所對(duì)應(yīng)的功能如下表所示:

圖 10.1.4 控制腳信號(hào)狀態(tài)功能表

在Intel8080接口下讀數(shù)據(jù)操作的時(shí)候,我們有時(shí)候(例如讀顯存的時(shí)候)需要一個(gè)假讀

命(Dummy Read),以使得微控制器的操作頻率和顯存的操作頻率相匹配。在讀取真正的數(shù)

據(jù)之前,由一個(gè)的假讀的過程。這里的假讀,其實(shí)就是第一個(gè)讀到的字節(jié)丟棄不要,從第二

個(gè)開始,才是我們真正要讀的數(shù)據(jù)。一個(gè)典型的讀顯存的時(shí)序圖,如下圖所示:

圖10.1.5 讀顯存時(shí)序圖

可以看到,在發(fā)送了列地址之后,開始讀數(shù)據(jù),第一個(gè)是Dummy Read,也就是假讀,我

們從第二個(gè)開始,才算是真正有效的數(shù)據(jù)

現(xiàn)在我們以ATK-4.3’TFTLCD為例,看一下Intel8080總線讀寫時(shí)序的具體參數(shù),如下圖

所示:

圖10.1.6 Intel總線讀寫時(shí)序

圖中各時(shí)間參數(shù)見表10.1.3 所示:

圖 10.1.7 Intel8080 并口讀寫時(shí)間參數(shù)

從上表可以看出,模塊的寫周期是非??斓?#xff0c;只需要33ns即可,理論上最大速度可以達(dá)

到:3030W像素每秒,即刷屏速度可以達(dá)到每秒鐘78.9 幀。模塊的讀取速度相對(duì)較慢:讀ID

(RD(ID))周期是160ns,讀顯存周期是400ns(RD(FM))。

并行接口模式就介紹到這里,現(xiàn)在我們以4.3寸的ATK-4.3’TFTLCD的LCD驅(qū)動(dòng)芯片

NT35510為例進(jìn)行介紹,其它的驅(qū)動(dòng)芯片基本都類似,我們就不詳細(xì)闡述了。

NT35510自帶LCD GRAM(480*864*3字節(jié)),并且最高支持24位顏色深度(1600萬色),

不過,我們一般使用16位顏色深度(65K色),RGB565格式,這樣,在16位模式下,可以達(dá)到

最快的速度。

在16位模式下,NT35510采用RGB565格式存儲(chǔ)顏色數(shù)據(jù),此時(shí)NT35510的低16位數(shù)據(jù)總線

(高8位沒有用到)與MCU(這里指Nios II)的16位數(shù)據(jù)線以及24位LCD GRAM的對(duì)應(yīng)關(guān)系如下

表所示:

圖10.1.8 16位總線與24位GRAM對(duì)應(yīng)關(guān)系

從上表可以看出,NT35510的24位GRAM與16位RGB565的對(duì)應(yīng)關(guān)系,其實(shí)就是分別將高位的

R、G、B數(shù)據(jù),搬運(yùn)到低位做填充,“湊成”24位,再顯示。

MCU的16位數(shù)據(jù)中,最低5位代表藍(lán)色,中間6位為綠色,最高5位為紅色。數(shù)值越大,表

示該顏色越深。另外,特別注意NT35510的指令是16位寬,數(shù)據(jù)除了GRAM讀寫的時(shí)候是16位

寬,其它都是8位寬的(高8位無效),這個(gè)和ILI9320等驅(qū)動(dòng)器不一樣,必須加以注意。

接下來,我們介紹一下NT35510的幾個(gè)重要命令,因?yàn)镹T35510的命令很多,我們這里就

不全部介紹了,有興趣的讀者可以查看NT35510的datasheet。里面對(duì)這些命令有詳細(xì)的介

紹。我們將介紹:0XDA00,0XDB00,0XDC00,0X3600,0X2A00~0X2A03,0X2B00~0X2B03,

0X2C00,0X2E00 等14條指令。

首先來看指令:0XDA00,0XDB00,0XDC00,這三條指令是讀ID1,ID2,ID3指令,也就是

用于讀取LCD控制器的ID,該指令如下表所示

圖10.1.9 讀ID指令描述

從上表可以看出,LCD讀ID,總共由3個(gè)指令(0XDA00、0XDB00和0XDC00)構(gòu)成,每個(gè)指

令輸出一個(gè)參數(shù),每個(gè)ID以8位數(shù)據(jù)(即指令后的參數(shù))的形式輸出(高8位固定為0),不過

這里輸出的ID,并不包含5510這樣的字樣,僅有指令0XDB00會(huì)輸出ID:0X80,其他兩個(gè)指令

讀到的ID都是0。將3個(gè)指令的輸出,組合在一起,可以得到NT35510的ID為:0X8000。

通過這個(gè)ID,即可判別所用的LCD驅(qū)動(dòng)器是什么型號(hào),這樣,我們的代碼,就可以根據(jù)控

制器的型號(hào)去執(zhí)行對(duì)應(yīng)驅(qū)動(dòng)IC的初始化代碼,從而兼容不同驅(qū)動(dòng)IC的屏,使得一個(gè)代碼支持

多款LCD。

接下來看指令:0X3600,這是存儲(chǔ)訪問控制指令,可以控制NT35510存儲(chǔ)器的讀寫方向,

簡(jiǎn)單的說,就是在連續(xù)寫GRAM的時(shí)候,可以控制GRAM指針的增長(zhǎng)方向,從而控制顯示方式

(讀GRAM也是一樣)。該指令如表所示:

圖10.1.10 0X3600 指令描述

從上表可以看出,0X3600指令后面,緊跟一個(gè)參數(shù),這里我們主要關(guān)注:MY、MX、MV這三個(gè)位,

通過這三個(gè)位的設(shè)置,我們可以控制整個(gè) NT35510 的全部掃描方向,如下表所示:

圖10.1.11 MY、MX、MV設(shè)置與LCD掃描方向關(guān)系表

這樣,我們?cè)诶?NT35510 顯示內(nèi)容的時(shí)候,就有很大靈活性了,比如顯示 BMP 圖片,BMP

解碼數(shù)據(jù),就是從圖片的左下角開始,慢慢顯示到右上角,如果設(shè)置 TFTLCD掃描方向?yàn)閺淖?/p>

到右,從下到上,那么我們只需要設(shè)置一次坐標(biāo),然后就不停的往LCD填充顏色數(shù)據(jù)即可,這

樣可以大大提高顯示速度。

接下來看指令:0X2A00~0X2A03,這幾個(gè)是列地址設(shè)置指令,在從左到右,從上到下的掃

描方式(默認(rèn))下面,該指令用于設(shè)置橫坐標(biāo)(x 坐標(biāo)),該指令如下 表 所示:

圖10.1.12 0X2A00~0X2A03指令描述

在默認(rèn)掃描方式時(shí),這4個(gè)指令用于設(shè)置x坐標(biāo),每條指令帶有1個(gè)參數(shù),實(shí)際上總共就是

2個(gè)坐標(biāo)值:SC和EC(SC和EC都是16位的,由2個(gè)8位組成),即列地址的起始值和結(jié)束值,SC

必須小于等于EC,且0≤SC/EC≤479。一般在設(shè)置x坐標(biāo)的時(shí)候,我們只需要0X2A00和0X2A01

兩條指令即可,也就是設(shè)置SC即可,因?yàn)槿绻鸈C沒有變化,我們只需要設(shè)置一次即可(在初

始化NT35510的時(shí)候設(shè)置),從而提高速度。

與0X2A00~0X2A03指令類似,指令:0X2B00~0X2B03,是頁(yè)地址設(shè)置指令,在從左到右,

從上到下的掃描方式(默認(rèn))下面,該指令用于設(shè)置縱坐標(biāo)(y坐標(biāo))。該指令如下 表 所

示:

圖10.1.13 0X2B00~0X2B03指令描述

在默認(rèn)掃描方式時(shí),這4個(gè)指令用于設(shè)置y坐標(biāo),每條指令帶有1個(gè)參數(shù),實(shí)際上總共就是

2個(gè)坐標(biāo)值:SP和EP(SP和EP都是16位的,由2個(gè)8位組成),即頁(yè)地址的起始值和結(jié)束值,SP

必須小于等于EP,且0≤SP/EP≤799。一般在設(shè)置y坐標(biāo)的時(shí)候,我們只需要帶0X2B00和

0X2B01兩條指令即可,也就是設(shè)置SP即可,因?yàn)槿绻鸈P沒有變化,我們只需要設(shè)置一次即可

(在初始化NT35510的時(shí)候設(shè)置),從而提高速度。

接下來看指令:0X2C00,該指令是寫GRAM指令,在發(fā)送該指令之后,我們便可以往LCD的

GRAM里面寫入顏色數(shù)據(jù)了,該指令支持連續(xù)寫,指令描述如下表所示:

圖10.1.14 0X2C00指令描述

從上表可知,在收到指令 0X2C00之后,數(shù)據(jù)有效位寬變?yōu)?6位,我們可以連續(xù)

寫入LCD GRAM值,而GRAM的地址將根據(jù)MY/MX/MV設(shè)置的掃描方向進(jìn)行自增。例如:假

設(shè)設(shè)置的是從左到右,從上到下的掃描方式,那么設(shè)置好起始坐標(biāo)(通過SC,SP設(shè)

置)后,每寫入一個(gè)顏色值,GRAM地址將會(huì)自動(dòng)自增1(SC++),如果碰到EC,則回

到 SC,同時(shí)SP++,一直到坐標(biāo):EC,EP結(jié)束,其間無需再次設(shè)置的坐標(biāo),從而大大

提高寫入速度。

最后,來看看指令:0X2E00,該指令是讀 GRAM 指令,用于讀取 NT35510 的顯存(GRAM),該指令在NT35510的數(shù)據(jù)手冊(cè)上面的描述是有誤的,真實(shí)的輸出情況如

下表所示:

表10.1.11 0X2E00指令描述

該指令用于讀取GRAM,如上表所示,NT35510在收到該指令后,第一次輸出的是dummy數(shù)

據(jù),也就是無效的數(shù)據(jù),第二次開始,讀取到的才是有效的GRAM數(shù)據(jù)(從坐標(biāo):SC,SP開

始),輸出規(guī)律為:每個(gè)顏色分量占8個(gè)位,一次輸出2個(gè)顏色分量。比如:第一次輸出是

R1G1,隨后的規(guī)律為:B1R2→G2B2→R3G3→B3R4→G4B4→R5G5...以此類推。如果我們只需要

讀取一個(gè)點(diǎn)的顏色值,那么只需要接收到參數(shù)3即可,如果要連續(xù)讀取(利用GRAM地址自增,

方法同上),那么就按照上述規(guī)律去接收顏色數(shù)據(jù)。

以上,就是操作NT35510常用的幾個(gè)指令,通過這幾個(gè)指令,我們便可以很好的控制

NT35510 顯示我們所要顯示的內(nèi)容了。

圖10.1.15 TFTLCD使用流程

任何LCD,使用流程都可以簡(jiǎn)單的用以上流程圖表示。其中硬復(fù)位和初始化序列,只需要

執(zhí)行一次即可。而畫點(diǎn)流程就是:設(shè)置坐標(biāo)→寫GRAM指令→寫入顏色數(shù)據(jù),然后在LCD 上

面,我們就可以看到對(duì)應(yīng)的點(diǎn)顯示我們寫入的顏色了。讀點(diǎn)流程為:設(shè)置坐標(biāo)→讀GRAM指令

→讀取顏色數(shù)據(jù),這樣就可以獲取到對(duì)應(yīng)點(diǎn)的顏色數(shù)據(jù)了。

以上只是最簡(jiǎn)單的操作,也是最常用的操作,有了這些操作,一般就可以正常使用

TFTLCD了。接下來,我們開始利用Nios II驅(qū)動(dòng)TFTLCD并使其顯示。

實(shí)驗(yàn)任務(wù)

本章我們使用Nios II驅(qū)動(dòng)TFTLCD,并使其顯示圖片,圖片上疊加字符顯示。

硬件設(shè)計(jì)

本章實(shí)驗(yàn)的硬件框架如下圖所示:

圖10.3.1 TFTLCD顯示實(shí)驗(yàn)的硬件框架圖

頂層代碼如下:

1 module qsys_lcd(

2 //module clock

3 input sys_clk , //系統(tǒng)時(shí)鐘,50Mhz

4 input sys_rst_n , //系統(tǒng)復(fù)位,低電平有效

5

6 //SDRAM interface

7 output sdram_clk , //SDRAM 芯片時(shí)鐘

8 output sdram_cke , //SDRAM 時(shí)鐘有效

9 output sdram_cs_n , //SDRAM 片選

10 output sdram_ras_n, //SDRAM 行有效

11 output sdram_cas_n, //SDRAM 列有效

12 output sdram_we_n , //SDRAM 寫有效

13 output [ 1:0] sdram_ba , //SDRAM Bank地址

14 output [12:0] sdram_addr , //SDRAM 行/列地址

15 inout [15:0] sdram_data , //SDRAM 數(shù)據(jù)

16 output [ 1:0] sdram_dqm , //SDRAM 數(shù)據(jù)掩碼

17

18 //EPCS FLASH interface

19 output epcs_dclk , // EPCS 時(shí)鐘信號(hào)

20 output epcs_sce , // EPCS 片選信號(hào)

21 output epcs_sdo , // EPCS 數(shù)據(jù)輸出信號(hào)

22 input epcs_data0, // EPCS 數(shù)據(jù)輸入信號(hào)

23

24 //MCU LCD interface

25 inout [15:0] mlcd_data , // LCD 數(shù)據(jù)信號(hào)

26 output mlcd_bl , // LCD 背光信號(hào)

27 output mlcd_cs_n , // LCD 片選信號(hào)

28 output mlcd_wr_n , // LCD 寫信號(hào)

29 output mlcd_rd_n , // LCD 讀信號(hào)

30 output mlcd_rs , // LCD 命令/數(shù)據(jù)信號(hào)

31 output mlcd_rst_n // LCD 復(fù)位信號(hào)

32 //user interface

33

34 );

35

36 //wire define

37 wire clk_100m; //SDRAM 控制器時(shí)鐘

38 wire rst_n ; //系統(tǒng)復(fù)位信號(hào)

39 wire locked ; //PLL輸出穩(wěn)定標(biāo)志

40

41 //*****************************************************

42 //** main code

43 //*****************************************************

44

45 //待PLL輸出穩(wěn)定之后,停止系統(tǒng)復(fù)位

46 assign rst_n = sys_rst_n & locked;

47

48 //例化PLL

49 pll_clk u_pll_clk(

50 .areset (~sys_rst_n),

51 .inclk0 (sys_clk ),

52 .c0 (clk_100m ),

53 .c1 (sdram_clk ),

54 .locked (locked )

55 );

56

57 //例化Nios2系統(tǒng)模塊

58 nios2os u_nios2os (

59 .clk_clk (clk_100m ), // 時(shí)鐘100M

60 .reset_reset_n (rst_n ), // 復(fù)位信號(hào)

61 .sdram_addr (sdram_addr ), // SDRAM 行/列地址

62 .sdram_ba (sdram_ba ), // SDRAM Bank地址

63 .sdram_cas_n (sdram_cas_n), // SDRAM 列有效

64 .sdram_cke (sdram_cke ), // SDRAM 時(shí)鐘有效

65 .sdram_cs_n (sdram_cs_n ), // SDRAM 片選

66 .sdram_dq (sdram_data ), // SDRAM 數(shù)據(jù)

67 .sdram_dqm (sdram_dqm ), // SDRAM 數(shù)據(jù)掩碼

68 .sdram_ras_n (sdram_ras_n), // SDRAM 行有效

69 .sdram_we_n (sdram_we_n ), // SDRAM 寫有效

70 .epcs_dclk (epcs_dclk ), // EPCS 時(shí)鐘信號(hào)

71 .epcs_sce (epcs_sce ), // EPCS 片選信號(hào)

72 .epcs_sdo (epcs_sdo ), // EPCS 數(shù)據(jù)輸出信號(hào)

73 .epcs_data0 (epcs_data0 ), // EPCS 數(shù)據(jù)輸入信號(hào)

74 .mlcd_data_export (mlcd_data ), // LCD 數(shù)據(jù)信號(hào)

75 .mlcd_cs_n_export (mlcd_cs_n ), // LCD 片選信號(hào)

76 .mlcd_wr_n_export (mlcd_wr_n ), // LCD 寫信號(hào)

77 .mlcd_rd_n_export (mlcd_rd_n ), // LCD 讀信號(hào)

78 .mlcd_rst_n_export(mlcd_rst_n ), // LCD 復(fù)位信號(hào)

79 .mlcd_rs_export (mlcd_rs ), // LCD 命令/數(shù)據(jù)信號(hào)

80 .mlcd_bl_export (mlcd_bl ) // LCD 背光信號(hào)

81 );

82

83 endmodule

頂層代碼主要實(shí)現(xiàn)PLL和Nios II系統(tǒng)模塊的例化。

軟件設(shè)計(jì)

創(chuàng)建好軟件工程后,我們將hello_world.c更改為qsys_lcd.c,并在qsyslcd的應(yīng)用工程

下新建一個(gè)文件夾,命名為drive,里面存放TFTLCD的驅(qū)動(dòng)代碼文件和相應(yīng)的字體文件,文件

夾結(jié)構(gòu)如下圖所示:

圖 10.4.1 文件結(jié)構(gòu)

其中font.h是由取模軟件“PCtoLCD2002”生成的不同字體大小的ASCII碼字模文件,除

了支持0~9的10個(gè)數(shù)字字符和26個(gè)英文字母的大小寫ASCII字符集外,還支持如下字符

集: !"#$%&'()*+,-./:;<=>?@ []^_`{|}~,能顯示四種字符點(diǎn)陣大小:12*12、16*16、

24*24和32*32。mculcd.h是TFTLCD驅(qū)動(dòng)文件的頭文件,mculcd.c是TFTLCD驅(qū)動(dòng)文件的c文件。

由于這兩個(gè)文件的代碼較多,我們這里就不貼出來了,只針對(duì)幾個(gè)重要的函數(shù)進(jìn)行講解。

我們先介紹一下mculcd.h里面的一個(gè)重要結(jié)構(gòu)體:

//LCD重要參數(shù)集

typedef struct

{

u16 width; //LCD 寬度

u16 height; //LCD 高度

u16 id ; //LCD ID

u8 dir; //橫屏還是豎屏控制:0,豎屏;1,橫屏

u16 wramcmd; //開始寫gram指令

u16 setxcmd; //設(shè)置x坐標(biāo)指令

u16 setycmd; //設(shè)置y坐標(biāo)指令

}_lcd_dev;

//LCD參數(shù)

_lcd_dev lcddev; //管理LCD重要參數(shù)

該結(jié)構(gòu)體用于保存一些TFTLCD重要參數(shù)信息,比如TFTLCD的長(zhǎng)寬、LCD ID(驅(qū)動(dòng)IC型

號(hào))、LCD橫豎屏狀態(tài)等,這個(gè)結(jié)構(gòu)體雖然占用了十幾個(gè)字節(jié)的內(nèi)存,但是卻可以讓我們的驅(qū)

動(dòng)函數(shù)支持不同尺寸的LCD,同時(shí)可以實(shí)現(xiàn)LCD橫豎屏切換等重要功能,所以還是利大于弊

的。有了以上了解,下面我們開始介紹mculcd.c里面的一些重要函數(shù)。

//LCD延遲函數(shù),單位毫秒

void delay_ms(u32 n)

{

usleep(n*1000);

}

//LCD寫命令

void LCD_WR_CMD(u16 Cmd)

{

IOWR_ALTERA_AVALON_PIO_DIRECTION(MLCD_DATA_BASE,0xFFFF); // 設(shè)置DATA PIO為輸出

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_RS_BASE,0); // 拉低RS

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_RD_N_BASE,1); // RD設(shè)為高電平

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_WR_N_BASE,0); // 拉低WR

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_DATA_BASE,Cmd); // 往DATA端口寫命令

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_WR_N_BASE,1); // 拉高WR

}

//LCD寫數(shù)據(jù)

void LCD_WR_DATA(u16 Data)

{

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_RS_BASE,1);

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_RD_N_BASE,1);

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_WR_N_BASE,0);

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_DATA_BASE,Data);

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_WR_N_BASE,1);

}

//LCD讀數(shù)據(jù)

u16 LCD_RD_DATA()

{

u16 read_data = 0;

IOWR_ALTERA_AVALON_PIO_DIRECTION(MLCD_DATA_BASE,0x0000); // 設(shè)置DATA PIO為輸入

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_RS_BASE,1);

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_RD_N_BASE,0);

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_WR_N_BASE,1);

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_RD_N_BASE,1);

read_data = IORD_ALTERA_AVALON_PIO_DATA(MLCD_DATA_BASE);

return read_data;

}

//LCD寫寄存器數(shù)據(jù)

void LCD_WriteReg(u16 LCD_Reg,u16 LCD_RegValue)

{

LCD_WR_CMD(LCD_Reg); // 寫入的寄存器

LCD_WR_DATA(LCD_RegValue); // 寫入的數(shù)據(jù)

}

//LCD讀寄存器

u16 LCD_ReadReg(u16 LCD_Reg)

{

LCD_WR_CMD(LCD_Reg); // 要讀取的寄存器

usleep(5); // 延時(shí)5us

return LCD_RD_DATA(); // 返回讀取的數(shù)據(jù)

}

//開始寫GRAM

void LCD_WriteRAM_Prepare(void)

{

LCD_WR_CMD(lcddev.wramcmd);

}

//LCD寫GRAM

//RGB_Code:顏色值

void LCD_WriteRAM(u16 RGB_Code)

{

LCD_WR_DATA(RGB_Code); //寫十六位GRAM

}

從該代碼中我們可以看出,寫命令和讀寫數(shù)據(jù)完全符合我們的時(shí)序圖。需要注意的是,

由于DATA PIO為雙向的,所以在讀寫命令或數(shù)據(jù)之前需要先設(shè)置其方向,否則讀寫不成功。

接下來我們介紹的是畫點(diǎn)函數(shù)。該函數(shù)實(shí)現(xiàn)代碼如下:

//畫點(diǎn)

//x,y:坐標(biāo)

//POINT_COLOR:此點(diǎn)的顏色

void LCD_DrawPoint(u16 x,u16 y)

{

LCD_SetCursor(x,y); //設(shè)置光標(biāo)位置

LCD_WriteRAM_Prepare(); //開始寫入GRAM

LCD_WR_DATA(POINT_COLOR);

}

該函數(shù)實(shí)現(xiàn)比較簡(jiǎn)單,就是先設(shè)置坐標(biāo),然后往坐標(biāo)寫顏色。其中POINT_COLOR是我們定

義的一個(gè)全局變量,用于存放畫筆顏色,順帶介紹一下另外一個(gè)全局變量:BACK_COLOR,該

變量代表LCD的背景色。LCD_DrawPoint函數(shù)雖然簡(jiǎn)單,但是至關(guān)重要,其他幾乎所有上層函

數(shù),都是通過調(diào)用這個(gè)函數(shù)實(shí)現(xiàn)的。

有了畫點(diǎn)函數(shù),自然就可以用畫點(diǎn)函數(shù)顯示字符串。顯示字符串函數(shù)如下:

//顯示字符串

//x,y:起點(diǎn)坐標(biāo)

//width,height:區(qū)域大小

//size:字體大小

//*p:字符串起始地址

//mode:疊加方式(1)還是非疊加方式(0)

void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 mode,u8 *p)

{

u8 x0=x;

width+=x;

height+=y;

while((*p<='~')&&(*p>=' ')) { //判斷是不是非法字符!

if(x>=width) {

x=x0;

y+=size;

}

if(y>=height)

break;//退出

LCD_ShowChar(x,y,*p,size,mode);

x+=size/2;

p++;

}

}

字符串顯示函數(shù)可以設(shè)置顯示的位置x、y,和顯示字體的大小size,還可以以疊加方式

顯示,或者以非疊加方式顯示。疊加方式顯示多用于在顯示的圖片上再顯示字符。非疊加方

式一般用于普通的顯示。

TFTLCD最大的用處是顯示圖片,自然需要介紹一下圖片顯示函數(shù),函數(shù)如下:

//x,y:起點(diǎn)坐標(biāo)

//size:圖片大小

//LCD顯示圖片

void LCD_DisplayPic(u16 x,u16 y,u32 size,const u8 *pic)

{

u32 i;

LCD_SetCursor(x,y);

LCD_WriteRAM_Prepare(); //開始寫入GRAM

for(i=0; i < size; i++)

LCD_WR_DATA(pic[i*2]<<8 | pic[i*2+1]);

}

這里假設(shè)圖片經(jīng)轉(zhuǎn)換后得到的頭文件數(shù)據(jù)類型是char類型,為8位,因?yàn)橐粋€(gè)像素需要16

位(RGB565),所以需要合并兩個(gè)8位為16,如果圖片經(jīng)轉(zhuǎn)換后得到的頭文件數(shù)據(jù)類型是16位

的,LCD_WR_DATA(pic[i*2]<<8 | pic[i*2+1])應(yīng)改為L(zhǎng)CD_WR_DATA(pic[i])。

最后,我們?cè)俳榻B一下TFTLCD模塊的初始化函數(shù)MCULCD_Init,該函數(shù)先復(fù)位TFTLCD,然

后讀取TFTLCD控制器(驅(qū)動(dòng)芯片)的型號(hào),根據(jù)控制IC的型號(hào)執(zhí)行不同的初始化代碼,由于

該函數(shù)代碼較長(zhǎng),我們摘錄部分如下:

//TFTLCD初始化

void MCULCD_Init(void)

{

//TFTLCD 復(fù)位

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_RST_N_BASE,0);

delay_ms(100);

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_RST_N_BASE,1);

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_CS_N_BASE,1);

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_RD_N_BASE,1);

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_WR_N_BASE,1);

IOWR_ALTERA_AVALON_PIO_DATA(MLCD_CS_N_BASE,0);

delay_ms(50);

//嘗試9341 ID的讀取

LCD_WR_CMD(0XD3);

lcddev.id=LCD_RD_DATA(); //dummy read

lcddev.id=LCD_RD_DATA(); //讀到0X00

lcddev.id=LCD_RD_DATA(); //讀取93

lcddev.id<<=8;

lcddev.id|=LCD_RD_DATA(); //讀取41

if(lcddev.id!=0X9341) //非9341,嘗試看看是不是NT35310

……

主函數(shù)部分的代碼如下:

1 #include <stdio.h>

2 #include <unistd.h>

3 #include "./drive/mculcd.h"

4 #include "pic01.h" //顯示的圖片

5

6 int main()

7 {

8 MCULCD_Init();

9 POINT_COLOR=MLCD_RED;

10

11 LCD_DisplayPic(0,0,lcddev.width * lcddev.height,gImage_pic01);

12

13 LCD_ShowString(30,50,300,30,24,1,"Welcome to PIONEER FPGA");

14 LCD_ShowString(30,80,400,30,24,1,"This is a TFT LCD test application");

15 LCD_ShowString(30,110,200,30,24,1,"ATOM@ALIENTEK");

16 LCD_ShowString(30,140,200,30,24,1,"2018/10/10");

17

18 return 0;

19 }

“pic01.h”是由Image2Lcd軟件轉(zhuǎn)換得到的圖片文件,該軟件我們?cè)凇堕_拓者FPGA開發(fā)

指南》的第四十章 SD卡圖片顯示實(shí)驗(yàn)(VGA顯示)中已介紹其使用,這里我們?cè)俸?jiǎn)單的介紹

下使用步驟,按下圖箭頭指示的方向,首先打開選擇一幅分辨率為800*480的jpg或bmp格式的

圖片,圖片加載進(jìn)來之后,在工具界面左側(cè)設(shè)置輸出數(shù)據(jù)類型為“C語言數(shù)據(jù)(*.c)”,掃描

模式為“垂直掃描”,輸出灰度為“16位真彩色”,最大寬度和高度分別為“800”和

“480”,選中“自右至左掃描”和“高位在前(MSB First)”。設(shè)置完成后在菜單欄中點(diǎn)

擊“保存”,并在彈出的界面中選擇C file(*.c;*.h)文件的保存路徑并輸入文件名,后綴

為.h,我們這里設(shè)置文件名為pic01.h。

圖 10.4.2 圖片轉(zhuǎn)換設(shè)置

代碼第17行的gImage_pic01是pic01.h中的數(shù)組,如下圖所示:

圖 10.4.3 轉(zhuǎn)換后得到的圖片數(shù)組

這里的字符顯示我們?cè)O(shè)置為疊加模式,當(dāng)然了也可以設(shè)置為非疊加模式,疊加模式在圖

片上顯示字符效果好。

下載驗(yàn)證

講完了軟件工程,接下來我們就將該實(shí)驗(yàn)下載至我們的開拓者開發(fā)板進(jìn)行驗(yàn)證。

首先我們將4.3寸的ATK-4.3’TFTLCD與開發(fā)板上的MCU TFT LCD接口連接。再將下載器一

端連電腦,另一端與開發(fā)板上對(duì)應(yīng)端口連接,最后連接電源線并打開電源開關(guān)。開拓者開發(fā)

板實(shí)物圖如下所示:

圖 10.5.1 開發(fā)板實(shí)物圖

接下來我們下載程序,驗(yàn)證TFT LCD顯示功能。

我們?cè)赒uartus II軟件中將qsys_lcd.sof文件下載至我們的開拓者開發(fā)板,

qsys_lcd.sof下載完成后,我們還需要在Nios II SBT for Eclipse軟件中將qsys_lcd.elf文

件下載至我們的開拓者開發(fā)板,qsys_lcd.elf下載完成以后,我們的C程序?qū)?huì)執(zhí)行在我們的

開拓者開發(fā)板上,運(yùn)行結(jié)果如下圖所示。

圖 10.5.2 實(shí)驗(yàn)結(jié)果圖

圖片上疊加顯示我們寫入的字符。至此,我們的TFT LCD顯示實(shí)驗(yàn)就完成了。

總結(jié)

以上是生活随笔為你收集整理的音频电平vu显示表软件下载_正点原子开拓者 Nios II资料连载第十章MCU TFT-LCD图片显示实验...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。