新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 我的12864學(xué)習(xí)筆記_3---控制12864液晶顯示曲線

        我的12864學(xué)習(xí)筆記_3---控制12864液晶顯示曲線

        作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
        三,液晶顯示曲線

        要想使用12864實現(xiàn)曲線的顯示,必須先實現(xiàn)能夠自由控制12864中的任意一個像素點的亮滅,而不能影響到相鄰其他點的狀態(tài)。

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

        因為對12874液晶進(jìn)行寫操作的話,寫入數(shù)據(jù)的最小單位也是一個16進(jìn)制數(shù),是8位的,能夠控制8個像素點,所以,對液晶進(jìn)行操作時,能夠一次控制液晶的最少像素點數(shù)為8個。

        所以要想控制液晶中的某一個點的亮滅,必須找到一種辦法,使這一個點的數(shù)據(jù)的寫入由寫入這個16進(jìn)制數(shù)來實現(xiàn),而基本原則是不能影響其他7位數(shù)據(jù)的狀態(tài)。所以要想實現(xiàn)控制某一個像素點,必須先知道目前液晶中在這個像素點左右其他7位的目前數(shù)據(jù),然后把該點的數(shù)據(jù)按位加到這個數(shù)據(jù)上,而不能影響其他7位數(shù)據(jù)的狀態(tài)。

        實現(xiàn)知道目前顯示的數(shù)據(jù)的方法有兩種:1,實現(xiàn)液晶的讀操作,把GDRAM中的對應(yīng)的數(shù)據(jù)讀出來,就可以了;2,人工構(gòu)建一個虛擬的緩存寄存器(其實也就是一個二維數(shù)組),保存液晶GDRAM最后一次寫入的數(shù)據(jù),即是目前液晶顯示的數(shù)據(jù),因為保存的是8位的16進(jìn)制數(shù),所以128*64個像素點只需要16*64的數(shù)組就可以存儲完了。在寫12864的同時寫虛擬寄存器,寫之前讀出虛擬寄存器的值與點位置相或,這樣才不會覆蓋之前的點。

        因為msp430g2553的IO管腳有限,所以我的12864是串行連接的。而并行連接的話,液晶的讀操作并不難實現(xiàn)。現(xiàn)在串行的,雖然比較復(fù)雜一些,但很類似于串行的讀操作,主要是看懂時序,然后嚴(yán)格按照時序就可以寫出。我已經(jīng)可以實現(xiàn)了液晶的讀,寫操作。讀寫操作的函數(shù)如下,其中注釋的也比較詳細(xì):

        //12864串行連接寫數(shù)據(jù),寫命令函數(shù)按照手冊上的時序進(jìn)行編程

        voidwr_lcd(uchardat_comm,ucharcontent)//

        {//要寫的數(shù)據(jù)

        uchara,i,j;

        delay_us(50);

        a=content;

        LCD_SCLK0;//en=0;

        LCD_SID1;//wr=1

        for(i=0;i<5;i++)//數(shù)據(jù)時序*****************8前5個高電平的同步碼

        {

        LCD_SCLK1;

        LCD_SCLK0;

        }

        LCD_SID0;//wr=0寫操作

        LCD_SCLK1;//en=1來一個時鐘

        LCD_SCLK0;//en=0

        if(dat_comm)

        LCD_SID1;//RS=1寫數(shù)據(jù)

        else

        LCD_SID0;//RS=0寫指令

        LCD_SCLK1;//來一個時鐘

        LCD_SCLK0;

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

        LCD_SCLK1;//來一個時鐘

        LCD_SCLK0;

        for(j=0;j<2;j++)//

        {

        uchari,j;

        uchara=0;//a存放讀取的數(shù)據(jù)

        delay_us(50);

        LCD_SCLK0;//en=0;

        LCD_SID1;//wr=1

        for(i=0;i<5;i++)//數(shù)據(jù)時序*****************8前5個高電平的同步碼

        {

        LCD_SCLK1;

        LCD_SCLK0;

        }

        LCD_SID1;//wr=1讀操作

        LCD_SCLK1;//en=1來一個時鐘

        LCD_SCLK0;//en=0

        LCD_SID1;//RS=1讀數(shù)據(jù)

        LCD_SCLK1;//來一個時鐘

        LCD_SCLK0;

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

        LCD_SCLK1;//來一個時鐘

        LCD_SCLK0;

        for(j=0;j<2;j++)/

        voidDraw_Point(unsignedcharx,unsignedchary0,unsignedcharcolor)

        {

        unsignedcharrow,collum,cbite;

        unsignedchartempH,tempL;

        wr_lcd(comm,0x34);//打開擴展指令集

        wr_lcd(comm,0x36);//打開繪圖顯示

        //uchary_Byte,y_bit,x_Byte,x_bit;

        //y_Byte=y/32;//0:上半屏幕1:下半屏幕

        //y_bit=y2;//y的行號

        //x_Byte=x/16;//x的列號

        //x_bit=x;//x的位

        //Write_Cmd(0x34);//打開擴展指令集

        //Write_Cmd(0x36);//打開繪圖顯示

        //Write_Cmd(0x80+31-y_bit);

        //Write_Cmd(0x80+x_Byte+(1-y_Byte)*8);

        collum=x>>4;//右移4位相當(dāng)于除以16取整,得到的是x的所在大列的列號

        cbite=x&0x0f;

        if(y0<32)

        row=y0;

        else

        {

        row=y0-32;

        collum+=8;

        }

        wr_lcd(comm,0x80+row);//先設(shè)定垂直位置

        wr_lcd(comm,0x80+collum);//再設(shè)定水平位置

        //上面兩句指定了地址,下面先讀出目前的數(shù)據(jù),然后再寫入新的數(shù)據(jù)

        rd_lcd();//讀操作要先執(zhí)行一次空讀指令

        tempH=rd_lcd();//兩次讀操作

        tempL=rd_lcd();

        //因為沒進(jìn)行一次讀或?qū)懖僮鳎刂分羔楢C都會自加1,所以下面要重新輸入地址同樣還是先輸入垂直地址,然后再輸入水平地址

        wr_lcd(comm,0x80+row);

        wr_lcd(comm,0x80+collum);

        if(color)//color=1,點亮;color=0,擦除

        {

        if(cbite<8)

        {

        tempH|=(1<<(7-cbite));

        //tempL=(1<<(7-cbite));

        }

        else

        {

        //tempH=(1<<(15-cbite));

        tempL|=(1<<(15-cbite));

        }

        }

        else

        {

        if(cbite<8)

        {

        tempH&=~(1<<(7-cbite));

        //tempL=(1<<(7-cbite));

        }

        else

        {

        //tempH=(1<<(15-cbite));

        tempL&=~(1<<(15-cbite));

        }

        }

        wr_lcd(dat,tempH);//寫入數(shù)據(jù)

        wr_lcd(dat,tempL);

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

        }

        使用上面的函數(shù),就可以實現(xiàn)對任意一個像素點的亮滅控制了。有了上面的函數(shù),然后就可以實現(xiàn)控制液晶顯示任意曲線或任意形狀的圖像了。下面就貼一個顯示坐標(biāo)軸的函數(shù)吧,函數(shù)實現(xiàn)的功能是在液晶屏上顯示X,Y坐標(biāo)軸,并且把坐標(biāo)軸按每10個點進(jìn)行分段,函數(shù)如下:

        未完待續(xù)。。。



        評論


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

        關(guān)閉
        主站蜘蛛池模板: 河南省| 太仆寺旗| 广东省| 册亨县| 越西县| 桐柏县| 武强县| 彭山县| 宕昌县| 嘉兴市| 弥渡县| 大同县| 庆安县| 黄冈市| 什邡市| 湟源县| 延边| 嵊泗县| 开封市| 临朐县| 宜昌市| 蒙阴县| 明光市| 博客| 凤翔县| 平南县| 德州市| 伊宁市| 陆河县| 方山县| 茂名市| 芜湖市| 水富县| 沧州市| 鹤山市| 楚雄市| 长治县| 安图县| 吉首市| 静宁县| 定襄县|