新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 12864液晶深入學(xué)習(xí)筆記_1

        12864液晶深入學(xué)習(xí)筆記_1

        作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
        Createdon:2012-8-30

        Author:zhangbin

        本文引用地址:http://www.104case.com/article/201611/322839.htm

        學(xué)習(xí)筆記

        for12864

        redesignedbyzhangbin

        2012-08-30

        versions:12_08_01

        這是我對12864的學(xué)習(xí)筆記,12864液晶功能很全面,使用起來也很方便,能夠滿足一般的研究和工程應(yīng)用的需求。

        下面我就對幾個(gè)方面講述一下我對它學(xué)習(xí)過程中的一些體會。我會盡量全面的介紹,并且會主要針對一些特殊的應(yīng)用和一些我認(rèn)為要特別注意的地方進(jìn)行較為詳細(xì)的說明。而對于那些較為固定的,常用的方面會簡略一些。

        其中的不管串行模式還是并行模式,對液晶的寫指令,寫數(shù)據(jù),讀操作等這些基本的操作都是一些比較固定的,基礎(chǔ)的東西。我認(rèn)為只要能夠看懂,并且能夠在不同的處理器上移植就夠了,沒有必要非要自己對著手冊時(shí)序圖寫出來。因?yàn)橛腥艘呀?jīng)寫好了,而且工作穩(wěn)定,我們只要在它的基礎(chǔ)上學(xué)會應(yīng)用就可以了。現(xiàn)在是知識爆炸時(shí)期,知識,信息迅速膨脹,我們要學(xué)會使用已有的成果,然后在這個(gè)基礎(chǔ)上自己再進(jìn)行開發(fā)應(yīng)用的研究。我們不必一定要從底層開始把別人已經(jīng)做的很成熟的東西再做一遍,這樣不但效率不高,而且我們一般人的精力也不允許。

        好了,不說廢話了,下面就開始介紹,當(dāng)然,那些基礎(chǔ)層面的東西我也會介紹的。

        下面所涉及到的程序,是針對msp430g2553的,都是我已經(jīng)調(diào)通的,可以直接應(yīng)用。

        一,12864的介紹

        1,液晶顯示模塊是128×64點(diǎn)陣的漢字圖形型液晶顯示模塊,可顯示漢字及圖形,內(nèi)置國標(biāo)GB2312碼簡體中文字庫(16X16點(diǎn)陣)、128個(gè)字符(8X16點(diǎn)陣)及64X256點(diǎn)陣顯示RAM(GDRAM)。可與CPU直接接口,提供兩種界面來連接微處理機(jī):8-位并行及串行兩種連接方式。具有多種功能:光標(biāo)顯示、畫面移位、睡眠模式等。

        2,常用的12864液晶內(nèi)部都是使用ST7920控制器。

        1),ST7920提供8位元,4位元及串行三種微處理器控制方式,大陸常用的是8位元和串行控制方式。

        2),ST7920可以控制顯示字母,數(shù)字符號,中文字型和自定義的圖畫。可以用來顯示圖形,演示動(dòng)畫,繪制曲線等。

        3),字符顯示RAM(DDRAM)

        ST7920的字符顯示RAM(DDRAM)最多可以控制16字元*4行,LCD的顯示范圍為16字元*2行。

        這里要注意,其實(shí)ST7920的DDRAM每一行可以控制16個(gè)漢字的,共有4行。但是LCD的每行只能顯示8個(gè)字符,為了顯示觀察的方便,在lcd制作的過程中,是將DDRAM的其中兩行拆分開成四行,然后在lcd上顯示,也即是DDRAM只用到了一半。

        lcd的顯示字符的坐標(biāo)地址如下表:

        漢字顯示坐標(biāo)

        Line180H81H82H83H84H85H86H87H

        Line290H91H92H93H94H95H96H97H

        Line388H89H8AH8BH8CH8DH8EH8FH

        Line498H99H9AH9BH9CH9DH9EH9FH

        從上表不難看出,其中第一行和第三行是DDRAM中的同一行拆分來的,同理24行也是DDRAM中的同一行拆分而來的。

        了解了這一點(diǎn)就不難理解下面程序中在換行顯示時(shí),要認(rèn)為手動(dòng)地指定下一行的地址。例如:如果第一行顯示完了,下面的數(shù)據(jù)我要接著顯示在第二行,這樣才符合人觀察的習(xí)慣,那么我就要在換第二行顯示之前要手動(dòng)地把顯示地址切換到第二行。要不然的話,第一行顯示完了,地址會自動(dòng)增加,就會顯示到第三行上去,這樣的話我們觀察起來就不自然了。程序?qū)嵗龝谙旅嫔婕暗降摹?/p>

        4),中文字庫ROM(CGROM)

        內(nèi)置的是GB2312碼簡體中文字庫,共提供了8192個(gè)16*16點(diǎn)的中文字型。

        5),半寬字型ROM(HCGROM)

        提供126個(gè)16*8點(diǎn)半字寬的字母符號字型。

        6),圖畫顯示RAM(GDRAM)

        提供64*256位元的GDRAM

        其中我們常用的RAM就是上面所提到的,還有一些CGRAM,IRAM這些我們不經(jīng)常使用,就不再介紹了。

        上面介紹的DDRAM控制顯示漢字,字符。GDRAM控制顯示圖畫,上電后,默認(rèn)DDRAM是打開的,控制液晶顯示。GDRAM默認(rèn)不打開,它里面的數(shù)據(jù)是隨機(jī)的,如果此時(shí)打開了GDRAM的話,lcd會同時(shí)受到DDRAM和GDRAM的控制,由于GDRAM中的數(shù)據(jù)是隨機(jī)的,所以會顯示亂碼。所以在使用GDRAM之前要先清除里面的隨機(jī)數(shù)據(jù)。

        清除GDRAM的函數(shù)如下:

        voidClear_GDRAM(void)//清除GDRAM中的的隨機(jī)數(shù)據(jù)。因?yàn)樯想姾驡DRAM中的數(shù)據(jù)是隨機(jī)的,如果不清除而直接打開GDRAM顯示時(shí),會顯示亂碼

        //所以在局部使用GDRAM顯示圖形時(shí),要先清除隨機(jī)數(shù)據(jù)。如果是全局使用GDRAM,即整個(gè)lcd屏全部設(shè)置顯示數(shù)據(jù),則可以

        //不必清除,因?yàn)樾聰?shù)據(jù)會把隨機(jī)數(shù)據(jù)給覆蓋掉

        {

        uchari,j,k;

        wr_lcd(comm,0x34);//打開擴(kuò)展指令集操作GDRAM是擴(kuò)展指令集

        i=0x80;

        for(j=0;j<32;j++)

        {

        wr_lcd(comm,i++);

        wr_lcd(comm,0x80);

        for(k=0;k<16;k++)

        {

        wr_lcd(dat,0x00);//寫入空字符,就相當(dāng)于清零

        }

        }

        i=0x80;

        for(j=0;j<32;j++)

        {

        wr_lcd(comm,i++);

        wr_lcd(dat,0x88);

        for(k=0;k<16;k++)

        {

        wr_lcd(dat,0x00);

        }

        }

        wr_lcd(comm,0x30);//回到基本指令集

        }

        3,12864有兩種工作模式

        1),并行模式和串行模式。并行模式就是常用的8位數(shù)據(jù)線,4為控制線。這種方式雖然占用的IO口較多,但是向液晶收發(fā)數(shù)據(jù)較容易實(shí)現(xiàn),數(shù)據(jù)傳輸速度較快。所以在一些連續(xù)顯示多幅圖畫,演示動(dòng)畫或?qū)︼@示的實(shí)時(shí)性要求較高的場合應(yīng)該考慮這種方式。其中在并行模式中,在向液晶寫數(shù)據(jù)或命令前,要進(jìn)行液晶忙標(biāo)志判斷BF,要確定液晶顯示不忙了,才能進(jìn)行操作。

        其中并行模式的液晶的讀寫數(shù)據(jù),命令函數(shù)如下:

        voidWrite_Cmd(ucharcmd)

        {

        ucharlcdtemp=0;

        LCD_RS_L;

        LCD_RW_H;

        LCD_DataIn;//數(shù)據(jù)輸入單片機(jī)

        do//判忙

        {

        LCD_EN_H;

        _NOP();

        lcdtemp=LCD2MCU_Data;

        LCD_EN_L;

        }

        while(lcdtemp&0x80);//判斷忙標(biāo)志等待忙

        LCD_DataOut;//數(shù)據(jù)輸出到lcd

        LCD_RW_L;

        MCU2LCD_Data=cmd;//單片機(jī)向lcd輸入命令

        LCD_EN_H;

        _NOP();

        LCD_EN_L;

        }

        voidWrite_Data(uchardat)

        {

        ucharlcdtemp=0;

        LCD_RS_L;

        LCD_RW_H;

        LCD_DataIn;

        do//判忙

        {

        LCD_EN_H;

        _NOP();

        lcdtemp=LCD2MCU_Data;

        LCD_EN_L;

        }

        while(lcdtemp&0x80);//等待忙

        LCD_DataOut;

        LCD_RS_H;

        LCD_RW_L;

        MCU2LCD_Data=dat;//單片機(jī)向lcd中輸入數(shù)據(jù)

        LCD_EN_H;

        _NOP();

        LCD_EN_L;

        }

        2),串行模式只用到了兩根線WREN于單片機(jī)進(jìn)行通信。這種方式可以大大減少單片機(jī)IO口的開銷,適用于IO口資源有限的單片機(jī)(如msp430g2553)。但是這種方式實(shí)現(xiàn)起來較麻煩,數(shù)據(jù)的傳輸效率不高。對于一般的文字,簡單圖形的顯示還是可以的。(有可能是因?yàn)閙sp430g2553的處理能力較強(qiáng),我現(xiàn)在用串行連接方式,顯示下面的幾幅圖畫,顯示效果很好,看不出有什么數(shù)據(jù)傳輸速度慢的問題)。

        由于我用的是msp430g2553,所以我一直都是使用串行的控制模式。

        //下面重點(diǎn)講一下串行的時(shí)序

        //SCLK:串行同步時(shí)鐘線,每操作一位數(shù)據(jù)都要有一個(gè)SCLK跳變沿,而且在這里是上升沿有效。也即是說,每次SCLK由低電平變?yōu)楦唠娖降乃查g,液晶控

        //制器將SID上的數(shù)據(jù)讀入或輸出。

        //SID:串行數(shù)據(jù),每一次操作都由三個(gè)字節(jié)數(shù)據(jù)組成,第一個(gè)字節(jié)向控制器發(fā)送命令控制字,告訴控制器接下來是什么操作,若為寫指令則發(fā)送11111000

        //(0xf8),若為若為寫數(shù)據(jù)則發(fā)送11111010(0xfa),若為讀狀態(tài)則發(fā)送11111100(0xfc),若為讀數(shù)據(jù)則發(fā)送11111110(0xfe)。

        //第二個(gè)字節(jié)的高4位為發(fā)送指令或數(shù)據(jù)的高4位,第二個(gè)字節(jié)的低4位補(bǔ)0.

        //第三個(gè)字節(jié)的高4位為發(fā)送指令或數(shù)據(jù)的低4位,第三個(gè)字節(jié)的低4位補(bǔ)0

        //具體的可以觀察時(shí)序進(jìn)行理解

        其中數(shù)據(jù)的傳輸?shù)暮瘮?shù)如下:

        //12864串行連接寫數(shù)據(jù),寫命令函數(shù)按照手冊上的時(shí)序進(jìn)行編程
        void wr_lcd(uchar dat_comm,uchar content)//
        {//要寫的數(shù)據(jù)
        uchar a,i,j;
        delay_us(50);
        a=content;
        LCD_SCLK0; //en=0;
        LCD_SID1;//wr=1
        for(i=0;i<5;i++) //數(shù)據(jù)時(shí)序*****************8前5個(gè)高電平的同步碼
        {
        LCD_SCLK1;
        LCD_SCLK0;
        }
        LCD_SID0;//wr=0寫操作

        LCD_SCLK1;//en=1來一個(gè)時(shí)鐘
        LCD_SCLK0;//en=0
        if(dat_comm)
        LCD_SID1;//RS=1寫數(shù)據(jù)
        else
        LCD_SID0;//RS=0寫指令


        LCD_SCLK1; //來一個(gè)時(shí)鐘
        LCD_SCLK0;

        LCD_SID0;//控制字的最后一位為0

        LCD_SCLK1;//來一個(gè)時(shí)鐘
        LCD_SCLK0;

        for(j=0;j<2;j++)//************一共2*4次循環(huán)寫寫一字節(jié)數(shù)據(jù),第一次大循環(huán)寫高4位,第二次大循環(huán)寫低4位
        {
        for(i=0;i<4;i++)
        {
        if(a&0x80)
        LCD_SID1;
        else
        LCD_SID0;
        a=a<<1;
        LCD_SCLK1;
        LCD_SCLK0;
        }
        LCD_SID0;
        for(i=0;i<4;i++)//時(shí)鐘下面來4個(gè)時(shí)鐘脈沖
        {
        LCD_SCLK1;
        LCD_SCLK0;
        }
        }
        }


        上一頁 1 2 下一頁

        關(guān)鍵詞: 12864液晶學(xué)習(xí)筆

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 曲松县| 斗六市| 诸暨市| 太和县| 大荔县| 福清市| 凤冈县| 永和县| 新宁县| 岳池县| 呈贡县| 咸宁市| 巴林左旗| 台湾省| 萝北县| 巨野县| 新源县| 安阳县| 甘谷县| 尤溪县| 安福县| 阜平县| 阿巴嘎旗| 台中市| 富源县| 金乡县| 合山市| 锦屏县| 米易县| 马龙县| 尚志市| 绥阳县| 浠水县| 永靖县| 濉溪县| 门头沟区| 蕉岭县| 宁远县| 建平县| 靖西县| 鄯善县|