<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM微控制器LPC210X的LCD接口技術(shù)

          ARM微控制器LPC210X的LCD接口技術(shù)

          作者: 時間:2004-12-11 來源:網(wǎng)絡 收藏
          摘要:本文分別以GPI0口直接連接、串行轉(zhuǎn)換連接、CPLD分部連接三種方法闡述了無外部總線的Philips 與點陣圖形液晶顯示器的設計,并給出硬件電路框圖和主要程序。

          關(guān)鍵詞: 串并轉(zhuǎn)換 CPLD

          引言

          Philips最近推出了其第一款基于內(nèi)核的,但由于LPC210X外部總線不開放,無法擴展內(nèi)存、驅(qū)動液晶顯示器等,給它的推廣帶來了一定的影響。筆者最近在一工控板項目中采用了該系列芯片,項目后斯應客戶要求需對幾個參量進行顯示并擴展鍵盤,不得已之下,采用了CPLD,并利用了GPIO口模擬總線和液晶時序與點陣圖形液日模塊HS12864-16建立了連接。下面詳細探討包括該種連接的三種方式。

          1 LPC210X的GPI0口和HS12864-16A介紹

          LPC210X包含LPC2104、LPC2105、LPC2106,除了片內(nèi)靜態(tài)RAM不同外,其他完全相同。該系列器件具有32個GPIO口(P0.0~P0.31),沒有外部總線,大多GPIO口是復用口,所以它一般不適合連接大屏幕液晶顯示器,但驅(qū)動小規(guī)模液晶模塊進行工業(yè)控制上的參量顯示還是非常合適的。

          GPIO包含四個寄存器,如表1所列。

          表1 配置GPI0口的四個寄存器

          名 稱地 址

          描 述

          IOPIN0xE0028000引腳值寄存器,引腳當前狀態(tài)都從該寄存器讀出
          IOSET0xE0028004輸出置位寄存器,只能寫1,對應引腳輸出高電平
          IOCLR0xE0028008輸出清零寄存器,只能寫1,對應引腳輸出低電平
          IODIR0xE002800C方向控制寄存器??刂泼總€I/O方向

          另外GPIO口還包含兩個引腳連接模塊寄存器PINSEL0、PINSEL1,用來為32個引腳配置I/O功能或其他特殊功能。

          HS12864-16A是內(nèi)部不帶字符發(fā)生器的3V液晶模塊(LPC210X可直接驅(qū)動5V液晶模塊俁考慮到功耜耗,不贊成連接),其主要引腳如表2所列)。

          表2 HS12864-16A引腳525252

          引 腳 號引 腳 名 稱

          描 述

          1、23、VSS、VDD、V0電源(3.3V)、電源地、驅(qū)動負太
          4D/I數(shù)據(jù)指令選擇
          5R/W讀寫選擇
          6E使能,R/W=0,下降沿鎖存DB7DB0
          7~14DB0~DB7數(shù)據(jù)線
          15、16CS1、CS2左、右半屏選擇
          17RET復位,低電平復位
          18Vout驅(qū)動負壓,-10V,分壓接3腳
          19、20EN、NO背光電源

          顯示屏由12864點陣組成,共有64行,分為8頁,每頁8行,每行128列。寫指令規(guī)則如下:當D/I=0、R/W=0,所有指令由傳輸?shù)綌?shù)據(jù)線的8位二進制數(shù)據(jù)決定,開顯示為0x3f,并顯示為0x3e,傳輸行、列地址由2低6位決定,傳輸頁地址為低3位決定。

          2 三種接口設計

          2.1 直接連接法

          連接框圖如圖1所示。

          該種方式占用GPIO口較多,對于要大量應用GPIO口復用功能的系統(tǒng)并不合適。為便于說明,圖1將LPC210X的P0.0~P0.12選為連接的13個口,具體到設計系統(tǒng)中,可根據(jù)系統(tǒng)用到功能對應GPIO口復用功能進行選取和配置。HS12864-16A的數(shù)據(jù)線為8條,所以存在于Flash中的字模也是按8位存的,可由字模軟件得出,傳輸數(shù)據(jù)進行顯示的時候要滿足以下時序:首先使D/I為高電平,R/W為低電平,接著將Flash里的某個8位二進制字模傳送到8個I/O口上,然后使能E模擬下降沿時序,把數(shù)據(jù)鎖存到液晶顯示器內(nèi)部的顯示存儲器中即可顯示。

          程序由ADS1.2編譯器編譯。

          GPIO口配置:

          #define _DI 0x00000100 ;指令選擇線P0.8

          #define LCD_RW 0x00000200 //讀寫選擇線P0.9

          #define LCD_E 0x00000400 //使能線P0.10

          #define LCD_CS1 0x00000800 //左屏選擇線P0.11

          #define LCD_CS1 0x00000800 //左屏選擇線P0.11

          #define IO_USE 0x00001FFF //13個GPIO口傳輸方向

          傳輸字模數(shù)值到液晶顯示器數(shù)據(jù)上的子程序如下:

          void SendData(unsigned char date){

          IOSET=data;

          IOCLR=~data0x000000FF;

          }

          備注:以上子程序為并行傳輸,也可以用串行移位進行傳輸,具體代碼如下:

          unsigned char i;

          for(i=0;i8;i++){ //依次發(fā)送8位數(shù)據(jù)

          if((data0x80)!=0) //最高位為1,對應口線置1

          IOSET=IO_TURN;

          Else

          IOCLR=IO_TURN; //否則置0

          data=1; //移到下一數(shù)據(jù)線

          }

          IO_TURN=0x00000080; //8位數(shù)據(jù)傳輸完畢后,仍然將P0.7設為起始線

          }

          下面以左半屏來說明如何在屏幕上任意顯示1616點陣漢字。

          傳送指令子程序如下:

          void wcodel(unsigned char code){ //送指令

          IOSET=LCD_CS1; //開左屏

          IOCLR=LCD_CS2; //關(guān)右屏

          IOCLR=LCD_RW; //寫選擇

          IOCLR=LCD_DI; //指令選擇

          SendData(code); //依次將指令代碼傳到數(shù)據(jù)線上

          IOSET=LCD_E; //模擬使能E下降沿

          IOCLR=LCD_E;

          }

          同理,只要把IOCLR=LCD_DI改為IOSET=LCD_DI便成傳送數(shù)據(jù)了。為便于區(qū)分,可將函數(shù)名改為wdata1(data)。

          顯示左屏漢字子程序如下:

          void hzleft(unsigned char page,unsigned charrow,unsigned char number){ //形參分別為頁、列、漢字序號

          unsigned char i,j;

          wcode1(0xc0); //設置12864從第1行顯示

          wcode1(0x3f); //開顯示器

          for(j=page;jpage+2;j++){

          wcode1(row); //設置顯示列

          wcode1(0xb8+j); //設置顯示頁

          for(i=16*(j-page);i16*(j+1-page);i++)//依次取字模傳輸

          wdata1(hangzi[32*a+i]);

          }

          }

          每個漢字字模由32個字節(jié)組成,前16個字節(jié)顯示漢字上半部分,后16個字節(jié)顯示漢字下半部分,構(gòu)成完整的1616點陣。其中number代表存在Flash中的漢字排名序列號,只要把頁、列、漢字序號實參值傳到漢字顯示子程序中進行調(diào)用即可顯示漢字了。參考上面程序便能很方便地寫出字母、數(shù)字的顯示子程序。

          程序中使用寄存器名稱時要先在頭文件中將其映射到對應地址,如對IOSET做如下定義:

          #define IOSET(*((volatile unsigned long *)0xE0028004))

          其它類似。

          另外,要定義設置引腳連接GPIO,以及GPIO方向設置。

          PINSEL0=0xX0000000;//設置用到的13個引腳連接到GPIO,為X的根據(jù)應用系統(tǒng)配置

          PINSEL1=0xXXXXXXXX;

          IODIR=IO_USE; //設置用到的13線方向為輸出

          當然,完整的應用還必須包括ARM時鐘代碼、啟動代碼等。

          2.2 串行轉(zhuǎn)換法

          從上面可以看出,盡管用8個GPIO口模塊總線非常容易與液晶顯示器建立連接,但是占用口線太多。為節(jié)省口線,可以考慮加入串入并出的移位寄存器74HC595,用LPC210X的GPIO口復用SPI功能或直接用GPIO口模擬SPI功能進行驅(qū)動,后者更加方便。下面用這種方式進行說明,同樣為方便,選用了連續(xù)的GPIO口P0.0~P0.7,具體設計系統(tǒng)要按實現(xiàn)情況進行配置,框圖如圖2所示。

          該種方法通過3個GPIO口模擬SPI對74HC595進行控制,驅(qū)動液晶數(shù)據(jù)顯示。

          模擬SPI的GPIO口配置如下:

          #define SPI_CLK 0x00000001 //時鐘線為P0.0

          #define SPI_DATA 0x00000002 //傳輸數(shù)據(jù)線為P0.1

          #define SPI_CS 0x00000004 //74HC595選通線為P0.2

          傳輸字模數(shù)值到數(shù)據(jù)線上的子程序:

          void SendData(unsigned char date){

          unsigned char i;

          IOCLR=SPI_CS; //SPI_CS=0

          for(i=0;i8;i++){ //依次發(fā)送8位數(shù)據(jù)

          IOCLR=SPI_CLK; //SPI_CLK=0

          if((date0x80)!=0) //傳輸最高位

          IOSET=SPI_DATA;

          Else

          IOCLR=SPI_DATA;

          date=1;

          IOSET=SPI_CLK; //SPI_CLK=1

          }

          IOSET=SPI_CS; //SPI_CS=1

          }

          其它程序與方法1類似。有了以上子程序,就可以很方便地加以調(diào)用,進行液晶驅(qū)動顯示。

          2.3 CPLD分部連接法

          CPLD是大規(guī)模邏輯器件,對于LPC210X的復雜應用顯得非常重要,筆者的項目是用它來擴展外部接口的,LCD應用只是其中一部分,連接圖如圖3所示。

          共占用9線,為說明方便,也選用了連續(xù)的GPIO口。該方法把一個字節(jié)字模分成高4位和低4位,分別通過P0.0~P0.3傳送。在CPLD里設計一個4位鎖存器,當高4位傳送完畢后,鎖存器進行鎖存,然后發(fā)送低4位,接著由P0.4選通鎖存器,將8位數(shù)據(jù)同時送出,這樣節(jié)省了4個GPIO口;另外由P0.5通過CPLD直接控制CS1和CS2,也節(jié)省了1個GPIO口。LPC210X程序參照方法1很容易寫出,只是注意這里是分兩次、每次4位傳送,以及每次傳送要改變P0.4的狀態(tài)。CPLD采用了Xilinx XC9500系列的XC9572,程序用Verilog-HDL語言編寫,其中數(shù)據(jù)分部傳送程序設計如下:

          module latch(out_high,out_low,data,enable);//定義模塊latch

          output[3:0]out_high; //定義輸出口高4位

          output[3:0]out_low; //定義輸出口低4位

          input enable; 定義鎖存選通信號

          reg[3:0] out_high;

          reg[3:0]out_low;

          reg[3:0]lock; //定義鎖存寄存器

          always@(enable or data)

          begin

          if(!enable) //低電平鎖存

          lock=data;

          else //高電平開通鎖存 ,輸出8位

          begin

          out_high=lock;

          out_low=data;

          end

          end

          endmodule

          至于P0.5選通CS1、CS2,在另一always塊中用ifelse語句進行判斷就可以了。

          程序設計完成后,在WEBPACK中對用到的引腳進行分配與鎖定,然后編譯。如果需要仿真的 埃?鴕?杓貧ゲ鬮件,可使用Xilinx公司推出的免費仿真軟件MODELSIM。

          對于上面的第二種方法,也可以考慮用CPLD設計稱位存儲器及時序控制。在復雜應用中,加上CPLD不但可以令設計簡化,還可以使系統(tǒng)性能大大增加。

          結(jié)語

          對于無外部總線的Philips LPC210X,只能通過GPIO口模擬部連接液晶顯示器。但在設計過程中,可以考慮通過串行轉(zhuǎn)換或CPLD分部連接的方法減少GPIO口的使用,以便充分利用LPC210X的資源。不過沒有總線畢竟有所束縛,好在Philips即將推出的LPC22X4系列控制器開放了外部總線,相信當這款芯片推出后,必將得到更多的關(guān)注。



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();