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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 無(wú)字庫(kù)12864液晶的驅(qū)動(dòng)方法

          無(wú)字庫(kù)12864液晶的驅(qū)動(dòng)方法

          作者: 時(shí)間:2011-12-27 來(lái)源:網(wǎng)絡(luò) 收藏

          在制作單片機(jī)系統(tǒng)時(shí),一般都需要用顯示器件來(lái)顯示單片機(jī)的工作狀態(tài)并顯示輸出結(jié)果,如LED、數(shù)碼管和顯示器等。LED最簡(jiǎn)單,但能給出的信息很少。數(shù)碼管能清晰地顯示數(shù)字和部分字母,但是耗電較大,不適合使用電池供電的裝置。

          本文引用地址:http://www.ex-cimer.com/article/172271.htm

          常見(jiàn)的顯示器有段式、字符液晶和圖形液晶等。其中,段式液晶最省電,但對(duì)于通用顯示使用起來(lái)不很方便,只能顯示固定式數(shù)字或符號(hào),而且需要專用電路或特殊的單片機(jī)。

          字符液晶(如1602)用得比較多,容易和單片機(jī)配合,但是一般都需要5V工作電壓,雖然現(xiàn)在也有3V就可以工作的模塊,但是體積還是較大,而且只能顯示數(shù)字和西文字符,無(wú)法顯示圖形和漢字。

          點(diǎn)陣液晶模塊既可以顯示ASCII字符,又可以顯示漢字和圖形,相對(duì)于前面幾種,具有更大的靈活性,所以使用得越來(lái)越多。不過(guò)常用的圖形液晶因?yàn)轱@示面積增加,體積比字符液晶(如1602)更大,價(jià)格也更貴。初學(xué)者要注意的是,12864圖形點(diǎn)陣液晶隨著廠家設(shè)計(jì)使用的芯片不同,程序有所區(qū)別,不像1602那樣基本通用。

          幾種常見(jiàn)的12864圖形點(diǎn)陣模塊

          12864點(diǎn)陣液晶模塊分為帶漢和不帶漢兩大類,目前帶漢的通常是ST7920驅(qū)動(dòng),它可以工作在漢字字符方式和圖形點(diǎn)陣方式,很多制作都用它,如果需要顯示較多漢字,用它最為方便。

          在顯示漢字?jǐn)?shù)量很少的場(chǎng)合,我們可以使用更加廉價(jià)的、不帶字庫(kù)的點(diǎn)陣液晶模塊,這正是本文重點(diǎn)介紹的。它們的控制電路有KS0108和ST7565兩種:KS0108很簡(jiǎn)單,一共只有7條指令,可是它沒(méi)有串行接口;ST7565有20多條指令(最常用的也就幾條),有串行接口,可選串行或并行工作。KS0108和ST7565的指令和上述帶字庫(kù)的ST7920區(qū)別較大,所以初學(xué)者買(mǎi)液晶時(shí)一定要搞清楚是哪種驅(qū)動(dòng)電路。即使同樣的驅(qū)動(dòng)電路,不同廠家或者不同型號(hào)的產(chǎn)品,具體細(xì)節(jié)仍可能不同。例如有的片選信號(hào)是高電平有效,有的卻是低電平有效,有的把顯示區(qū)分為左右兩半分別選取,有的卻不加區(qū)分。所以使用前要仔細(xì)看廠家說(shuō)明,如果沒(méi)有,就要看液晶模塊背面給出的具體型號(hào),根據(jù)這個(gè)型號(hào)去查找使用手冊(cè)。

          筆者最近在淘寶網(wǎng)上搜尋到一款12864的圖形點(diǎn)陣液晶,只有4cm寬、3.5cm高,顯示面積為3.2cm寬、1.95cm高,非常小巧。更加難能可貴的是它可以在3V低電壓工作,很適合我們制作小型便攜裝置。該液晶模塊型號(hào)是SP12864FPD-12CSBE,由北京集粹電子設(shè)備公司出品,它的外形見(jiàn)圖1。

          未命名.jpg

          圖2、圖3所示為筆者用它制作的一個(gè)小小日歷鐘,它的特點(diǎn)是具有可以隨意轉(zhuǎn)換的文字和圖形界面。文字界面除了顯示年月日時(shí)分秒,在右上角還有一個(gè)小雞啄米的小動(dòng)畫(huà),圖形界面用指針在刻度上指示出時(shí)分秒,是不是有點(diǎn)新意呢?圖4所示是調(diào)頻收音機(jī)的顯示屏,用進(jìn)度條指示音量,用刻度尺顯示信號(hào)強(qiáng)度,比1602只能顯示數(shù)字和字母要生動(dòng)多了。沒(méi)有字庫(kù)用起來(lái)是否很麻煩?其實(shí)搞清了圖形點(diǎn)陣的基本工作原理,用起來(lái)并不麻煩卻更靈活,不帶字庫(kù)我們就按需要打造字符!

          1.jpg

          下面就談?wù)勥@個(gè)液晶的驅(qū)動(dòng),以后將給出一些制作實(shí)例,以幫助初學(xué)者用它做出具有個(gè)性的東西。

          液晶模塊SO12864-12C簡(jiǎn)介

          此型號(hào)小液晶包括一系列子型號(hào)。這次所用的SO12864FPD-12CSBE只是其中的一種,我們先來(lái)了解一下它的主要特性:
          ◆ 邏輯或電源電壓2.8~5.5V;
          ◆ 藍(lán)色背光,背光電壓3V;
          ◆ 串行接口,用 8個(gè)焊盤(pán)引出包括電源、背光、地和控制線數(shù)據(jù)線;
          ◆ 不帶字庫(kù),需要自己編輯外部字模數(shù)組;
          ◆ 速度較快,用時(shí)鐘1MHz的AVR單片機(jī)驅(qū)動(dòng),編程時(shí)無(wú)須附加脈沖額外延時(shí);
          ◆ 使用ST7565電路,命令代碼一共23條。

          顯然,它十分適合低壓小尺寸場(chǎng)合應(yīng)用,串行接口最大限度減少了液晶和單片機(jī)的連線,雖說(shuō)比并行慢一點(diǎn),實(shí)際上如果不是頻繁刷屏影響并不大。要自己編制字庫(kù)確實(shí)比較麻煩,但是只要顯示的文字量少,制作小字模也不困難,反而可以自己打造個(gè)性化的字體,使得顯示具有特色。

          把液晶模塊翻過(guò)來(lái),如圖5所示,發(fā)現(xiàn)電路板上沒(méi)有通常液晶模塊的黑膠封裝集成電路,原來(lái)這個(gè)液晶采用的是“COG”封裝,就是把集成電路直接綁定在液晶玻璃板上。

          它的8個(gè)接口焊盤(pán)位于模塊上方,定義如下:
          1. 片選CS:它為低電平才能進(jìn)行操作,在加載數(shù)據(jù)后至少維持40ns低電平。
          2. 復(fù)位RES:?jiǎn)?dòng)時(shí)至少維持1μs低電平以使液晶內(nèi)部復(fù)位,然后升高,再過(guò)1μs完成復(fù)位,以后才能對(duì)液晶進(jìn)行操作。
          3. 命令數(shù)據(jù)選擇A0:高電平為數(shù)據(jù),低電平為命令。
          4. 串行時(shí)鐘SCL:頂?shù)讓挾戎辽?5ns,低時(shí)A0和SI至少穩(wěn)定20ns,然后在上升沿加載數(shù)據(jù)或命令。
          5. 串行數(shù)據(jù)SI:同上,在SCL上升沿加載后至少還要保持10ns穩(wěn)定。
          6. 電源正VCC:最低2.8V,標(biāo)準(zhǔn)3V,最大5.5V。
          7. 地VSS。
          8. 背光LED+:藍(lán)色背光最低2.8V,標(biāo)準(zhǔn)3V,最大3.2V,使用時(shí)要注意不要超過(guò)。

          在串行模式時(shí),一個(gè)命令或數(shù)據(jù)字節(jié)要分為8次加載,從最高位開(kāi)始。

          圖形點(diǎn)陣的顯示原理

          12864點(diǎn)陣液晶的圖形顯示原理都差不多。液晶屏x方向(水平)具有128列像素從左到右為第0列……第127列,y方向(垂直)具有64行像素。每8行組成1頁(yè),從上到下就是第0頁(yè)……第7頁(yè)。這樣以列號(hào)和頁(yè)號(hào)為坐標(biāo),就可以指定交叉位置的8個(gè)像素。例如第0、1、2、3列第1頁(yè)的8個(gè)像素,如圖6所示。在液晶內(nèi)部有一塊顯示緩存區(qū),按照列號(hào)和頁(yè)號(hào)就可以對(duì)顯緩區(qū)的某個(gè)字節(jié)寫(xiě)數(shù),該字節(jié)的8位二進(jìn)制數(shù)就對(duì)應(yīng)了液晶屏同樣位置的像素的亮滅,如對(duì)第1列第1頁(yè)的那個(gè)緩存單元寫(xiě)入0X80即0b10000000,那么液晶對(duì)應(yīng)位置的最下面一點(diǎn)7亮(低位在上高位在下)其余都滅,如果第2列第1頁(yè)寫(xiě)入0X0F即0b00001111,則該位置上方4個(gè)點(diǎn)0123亮,其余像素不亮,第3列第1頁(yè)寫(xiě)0X33,則該處間隔2點(diǎn)亮。這樣就可以通過(guò)程序控制液晶屏的任意像素了。不同的液晶屏指令代碼可能不同(例如這個(gè)屏和常見(jiàn)的7920驅(qū)動(dòng)不一樣),屏幕劃分也可能不同,例如有的是分為左右兩半,每半邊64列,有的是分為上下兩半等。

          液晶SO12864-12C的編程要點(diǎn)

          控制液晶最基本的工作就是往液晶的控制器寫(xiě)入命令碼或往顯緩區(qū)寫(xiě)入數(shù)據(jù)碼,是命令還是數(shù)據(jù)由加到上述A0的電平高低決定:高,數(shù)據(jù);低,命令。

          因?yàn)楝F(xiàn)在是串行傳送,所以只能由高到低一位位寫(xiě)。

          串行只能寫(xiě)不能讀。以前要靠讀來(lái)判定液晶是否忙,這個(gè)液晶速度較高,實(shí)際使用證明串行傳輸不用讀忙。

          編程就是用單片機(jī)的幾根口線按照所需的時(shí)序發(fā)出高低電平,再往液晶里送入代碼或數(shù)據(jù)。控制脈沖和代碼脈沖的時(shí)序關(guān)系如圖7所示。

          圖7 控制脈沖和代碼脈沖的時(shí)序關(guān)系

          2.jpg

          最常用的幾個(gè)命令

          1. 顯示開(kāi)/關(guān):代碼:0XAF(開(kāi)),0XAE(關(guān))啟動(dòng)復(fù)位后為“關(guān)”,必須在液晶初始化時(shí)置“開(kāi)”。
          2. 頁(yè)地址定位:代碼:0XB0……0XB7,對(duì)應(yīng)第0頁(yè)到第7頁(yè),復(fù)位后自動(dòng)安置為第0頁(yè)。
          3. 列地址定位:列地址是0X00……0X7F,但不是直接用列地址而要轉(zhuǎn)換為雙字節(jié)代碼。是0X10加原高4位和0X00加原低4位。例如第33列,本是0X21,現(xiàn)在應(yīng)該轉(zhuǎn)換為0X12和0X01,分2次寫(xiě)入。
          4. 寫(xiě)顯示數(shù)據(jù):代碼就是顯示數(shù)據(jù),控制脈沖A0為高。
          5. 復(fù)位:代碼0XE2,通過(guò)程序使得液晶恢復(fù)各種起始默認(rèn)狀態(tài)。

          有了這幾條命令就已經(jīng)可以使液晶畫(huà)出以像素點(diǎn)為基礎(chǔ)的圖形或字符了。有些其他命令(如對(duì)比控制、亮度、偏壓等)就取默認(rèn)值,無(wú)需修改(初始化要用一下),還有些很有用的命令(如反向列頁(yè)掃描、起始行、反白顯示等),需要時(shí)再去查資料不遲。有了上述命令代碼,我們就可以通過(guò)匯編或C語(yǔ)言,按照控制時(shí)序編出子程序或函數(shù),以便在程序中使用。C語(yǔ)言因?yàn)橐鬃x性好、通用性好、移植性好所以用得較多,下面就給出一些C的函數(shù),由它們就構(gòu)成了液晶的驅(qū)動(dòng)。

          驅(qū)動(dòng)液晶的基本C函數(shù)

          我們用C語(yǔ)言編程,在C語(yǔ)言里,用“函數(shù)”把單片機(jī)的一系列具體操作包裝起來(lái)起個(gè)函數(shù)名,需要時(shí)直接按名調(diào)用即可,非常方便。

          首先必須解決怎樣對(duì)液晶串行寫(xiě)數(shù)據(jù)的問(wèn)題,然后按照A0線的高低,我們就可以自行編出寫(xiě)數(shù)據(jù)函數(shù)和寫(xiě)命令函數(shù)。

          一下只列出函數(shù)說(shuō)明和用法舉例,函數(shù)的具體內(nèi)容可到《無(wú)線電》網(wǎng)站上下載C程序代碼。
          1. 串行傳送1字節(jié)數(shù)據(jù)函數(shù),參數(shù)為待傳字節(jié)。
          void LcdWriByte(unsigned char nn) //nn就是待寫(xiě)字節(jié)
          這個(gè)是最基本的函數(shù),不過(guò)我們不直接用它而是把它放在其他寫(xiě)數(shù)據(jù)函數(shù)里調(diào)用。
          2. 寫(xiě)命令。參數(shù)為命令碼。
          void LcdWriCommand(unsigned char command);
          例如,打開(kāi)顯示:LcdWriCommand(0XAF);
          3. 寫(xiě)數(shù)據(jù)。參數(shù)為待寫(xiě)的顯示數(shù)據(jù)。
          void LcdWriData(unsigned char data);
          例如,寫(xiě)顯示一個(gè)點(diǎn)的數(shù)據(jù): LcdWriData(0X01);
          4. 指定列、頁(yè)地址。參數(shù)為列地址x和頁(yè)地址y。
          void LcdSetxy(unsigned char x,unsigned chary);
          例如:LcdSetxy(68,2);//設(shè)置顯示地址為第68列、第2頁(yè)。
          通常和上一個(gè)函數(shù)連用,見(jiàn)下一節(jié)函數(shù)應(yīng)用舉例。
          在以上基本函數(shù)基礎(chǔ)上我們還可以根據(jù)命令碼推演出幾個(gè)便于使用的功能函數(shù)。
          5. 開(kāi)顯示。
          void LcdOn(void );
          例:LcdOn( );
          6. 關(guān)顯示。
          void LcdOff(void );
          例:LcdOff( );
          7. 軟復(fù)位。用它可以在任何時(shí)刻使液晶屏回到起始狀態(tài)而顯示緩沖區(qū)內(nèi)容不變。
          void LcdReset(void );
          例:LcdReset( );
          8. 刷屏。
          void LcdCls(unsigned char data );
          就是用數(shù)據(jù)data寫(xiě)滿顯示緩沖區(qū),data如果為0,那全屏刷白(無(wú)像素顯示),如果data為0XFF則全屏刷黑(像素全部亮)。如果為0XAA呢?感興趣的讀者不妨實(shí)驗(yàn)一下。
          例:LcdCls(0 );
          最后給出該液晶的初始化函數(shù),在系統(tǒng)啟動(dòng)后,MCU初始化以后就進(jìn)行液晶初始化。
          9. LCD初始化。
          Void Lcd_ini();
          通常在程序開(kāi)始階段進(jìn)行,對(duì)各種參數(shù)進(jìn)行設(shè)置,具體初始化項(xiàng)目請(qǐng)參看函數(shù)內(nèi)容和注解。

          函數(shù)應(yīng)用舉例

          1. 在指定位置畫(huà)1點(diǎn)
          先給定頁(yè)和列坐標(biāo),就指定了1列8個(gè)像素點(diǎn),1個(gè)點(diǎn)的位置從上到下對(duì)應(yīng)數(shù)值為0X01、0X02、0X04、0X08、0X10、0X20、0X40、0X80。
          例如在第9列、第3頁(yè)最低位畫(huà)點(diǎn):
          LcdSetxy(9,3);
          LcdWriData(0X80);
          2. 在指定位置畫(huà)連續(xù)8個(gè)點(diǎn)構(gòu)成的短豎線
          例如位置同上,則
          LcdSetxy(9,3);
          LcdWriData(0XFF);
          3. 畫(huà)水平線
          例如從第10列起在第3頁(yè)底部畫(huà)1根長(zhǎng)度50像素點(diǎn)的連續(xù)直線:
          unsigned char i;
          LcdSetxy(10,3);
          for(i=0;i50;i++)
          {
          LcdWriData(0X80); //循環(huán)中列地址自動(dòng)遞增
          }

          明白了以上基礎(chǔ),我們就可以進(jìn)一步畫(huà)出長(zhǎng)短豎線、更粗的水平線、水平雙線矩形方框、黑塊等,這樣就可以畫(huà)簡(jiǎn)單圖形了。

          怎樣顯示字符或漢字

          字符和漢字實(shí)質(zhì)是在一個(gè)矩形區(qū)域內(nèi)由一系列像素點(diǎn)構(gòu)成的圖形,也就是點(diǎn)陣圖。例如在一個(gè)8×8點(diǎn)陣區(qū)域內(nèi),字母“L”點(diǎn)陣如圖8左所示。如果要在第0頁(yè)第0……第7列顯示這個(gè)字符,那么就應(yīng)該在相應(yīng)的顯示緩沖區(qū)裝入相應(yīng)的數(shù)據(jù)如右邊圖所示,這里用1表示顯示像素,不顯示的像素都是0,為清楚起見(jiàn)圖中就不標(biāo)出,上方表示列號(hào)0……7,那么從0列開(kāi)始,各列的二進(jìn)數(shù)和16進(jìn)數(shù)分別表示為:
          0B00000000 : 0X00
          0B01000010 : 0X42
          0B01111110 : 0X7E
          0B01000010 : 0X82
          0B01000000 : 0X40
          0B01000000 : 0X40
          0B01100000 : 0X60
          0B00000000 : 0X00

          所以我們就用一個(gè)8元素的數(shù)組來(lái)表示這個(gè)“L”:
          const unsigned char L[8]={0X00,0X42,0X7E,0X82,0X40,0X40,0X60,0X00};

          要在液晶上的第3頁(yè)第6列顯示這個(gè)“L”,就使用如下函數(shù):
          LcdShow88(unsigned x,unsigned y, const char *p);

          其中p指向8點(diǎn)陣字符數(shù)組,那么具體代碼為:
          LcdShow88(6,3, L);

          打造字模就是按照所需顯示的文字符號(hào)一一編制各自的數(shù)組,上述8×8點(diǎn)陣就可以在1頁(yè)高度內(nèi)顯示,實(shí)際上其上下左右都要留空,這樣有效的點(diǎn)陣只有6×6,要顯示數(shù)字和ASCII字符尚可,簡(jiǎn)單筆畫(huà)的漢字也行,可是筆畫(huà)稍多的漢字就不行了。對(duì)于漢字顯示我們一般使用16×16點(diǎn)陣的字模。這樣的漢字高度占2頁(yè),寬度是16列,12864的液晶可以顯示4行,每行8個(gè)字。所有的12864液晶不論尺寸大小都是如此。

          一個(gè)16點(diǎn)陣字模數(shù)組具有32個(gè)元素,每一頁(yè)有16個(gè)元素。因此顯示這樣的漢字時(shí),就要給同一列的某一頁(yè)和下一頁(yè)分別寫(xiě)入各自的16個(gè)元素。例如漢字“鐘”的字模數(shù)組為:
          const unsigned char ZHONG[]={0x80,0x40,0x70,0xCF,0x48,0x48,0x00,0xF0,0x10,0x10,0xFF,0x10,0x10,0xF8,0x10,0x00, 0x02,0x02,0x02,0x7F,0x22,0x12,0x00,0x07,0x02,0x02,0xFF,0x02,0x02,0x07,0x00,0x00};

          led顯示器相關(guān)文章:led顯示器原理



          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          相關(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); })();