三,液晶顯示曲線(xiàn)要想使用12864實(shí)現(xiàn)曲線(xiàn)的顯示,必須先實(shí)現(xiàn)能夠自由控制12864中的任意一個(gè)像素點(diǎn)的亮滅,而不能影響到相鄰其他點(diǎn)的狀態(tài)。
本文引用地址:http://butianyuan.cn/article/201611/322841.htm因?yàn)閷?duì)12874液晶進(jìn)行寫(xiě)操作的話(huà),寫(xiě)入數(shù)據(jù)的最小單位也是一個(gè)16進(jìn)制數(shù),是8位的,能夠控制8個(gè)像素點(diǎn),所以,對(duì)液晶進(jìn)行操作時(shí),能夠一次控制液晶的最少像素點(diǎn)數(shù)為8個(gè)。
所以要想控制液晶中的某一個(gè)點(diǎn)的亮滅,必須找到一種辦法,使這一個(gè)點(diǎn)的數(shù)據(jù)的寫(xiě)入由寫(xiě)入這個(gè)16進(jìn)制數(shù)來(lái)實(shí)現(xiàn),而基本原則是不能影響其他7位數(shù)據(jù)的狀態(tài)。所以要想實(shí)現(xiàn)控制某一個(gè)像素點(diǎn),必須先知道目前液晶中在這個(gè)像素點(diǎn)左右其他7位的目前數(shù)據(jù),然后把該點(diǎn)的數(shù)據(jù)按位加到這個(gè)數(shù)據(jù)上,而不能影響其他7位數(shù)據(jù)的狀態(tài)。
實(shí)現(xiàn)知道目前顯示的數(shù)據(jù)的方法有兩種:1,實(shí)現(xiàn)液晶的讀操作,把GDRAM中的對(duì)應(yīng)的數(shù)據(jù)讀出來(lái),就可以了;2,人工構(gòu)建一個(gè)虛擬的緩存寄存器(其實(shí)也就是一個(gè)二維數(shù)組),保存液晶GDRAM最后一次寫(xiě)入的數(shù)據(jù),即是目前液晶顯示的數(shù)據(jù),因?yàn)楸4娴氖?位的16進(jìn)制數(shù),所以128*64個(gè)像素點(diǎn)只需要16*64的數(shù)組就可以存儲(chǔ)完了。在寫(xiě)12864的同時(shí)寫(xiě)虛擬寄存器,寫(xiě)之前讀出虛擬寄存器的值與點(diǎn)位置相或,這樣才不會(huì)覆蓋之前的點(diǎn)。
因?yàn)?strong>msp430g2553的IO管腳有限,所以我的12864是串行連接的。而并行連接的話(huà),液晶的讀操作并不難實(shí)現(xiàn)?,F(xiàn)在串行的,雖然比較復(fù)雜一些,但很類(lèi)似于串行的讀操作,主要是看懂時(shí)序,然后嚴(yán)格按照時(shí)序就可以寫(xiě)出。我已經(jīng)可以實(shí)現(xiàn)了液晶的讀,寫(xiě)操作。讀寫(xiě)操作的函數(shù)如下,其中注釋的也比較詳細(xì):
//12864串行連接寫(xiě)數(shù)據(jù),寫(xiě)命令函數(shù)按照手冊(cè)上的時(shí)序進(jìn)行編程
voidwr_lcd(uchardat_comm,ucharcontent)//
{//要寫(xiě)的數(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ù)時(shí)序*****************8前5個(gè)高電平的同步碼
{
LCD_SCLK1;
LCD_SCLK0;
}
LCD_SID0;//wr=0寫(xiě)操作
LCD_SCLK1;//en=1來(lái)一個(gè)時(shí)鐘
LCD_SCLK0;//en=0
if(dat_comm)
LCD_SID1;//RS=1寫(xiě)數(shù)據(jù)
else
LCD_SID0;//RS=0寫(xiě)指令
LCD_SCLK1;//來(lái)一個(gè)時(shí)鐘
LCD_SCLK0;
LCD_SID0;//控制字的最后一位為0
LCD_SCLK1;//來(lái)一個(gè)時(shí)鐘
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ù)時(shí)序*****************8前5個(gè)高電平的同步碼
{
LCD_SCLK1;
LCD_SCLK0;
}
LCD_SID1;//wr=1讀操作
LCD_SCLK1;//en=1來(lái)一個(gè)時(shí)鐘
LCD_SCLK0;//en=0
LCD_SID1;//RS=1讀數(shù)據(jù)
LCD_SCLK1;//來(lái)一個(gè)時(shí)鐘
LCD_SCLK0;
LCD_SID0;//控制字的最后一位為0
LCD_SCLK1;//來(lái)一個(gè)時(shí)鐘
LCD_SCLK0;
for(j=0;j<2;j++)/
voidDraw_Point(unsignedcharx,unsignedchary0,unsignedcharcolor)
{
unsignedcharrow,collum,cbite;
unsignedchartempH,tempL;
wr_lcd(comm,0x34);//打開(kāi)擴(kuò)展指令集
wr_lcd(comm,0x36);//打開(kāi)繪圖顯示
//uchary_Byte,y_bit,x_Byte,x_bit;
//y_Byte=y/32;//0:上半屏幕1:下半屏幕
//y_bit=y2;//y的行號(hào)
//x_Byte=x/16;//x的列號(hào)
//x_bit=x;//x的位
//Write_Cmd(0x34);//打開(kāi)擴(kuò)展指令集
//Write_Cmd(0x36);//打開(kāi)繪圖顯示
//Write_Cmd(0x80+31-y_bit);
//Write_Cmd(0x80+x_Byte+(1-y_Byte)*8);
collum=x>>4;//右移4位相當(dāng)于除以16取整,得到的是x的所在大列的列號(hào)
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ù),然后再寫(xiě)入新的數(shù)據(jù)
rd_lcd();//讀操作要先執(zhí)行一次空讀指令
tempH=rd_lcd();//兩次讀操作
tempL=rd_lcd();
//因?yàn)闆](méi)進(jìn)行一次讀或?qū)懖僮鳎刂分羔楢C都會(huì)自加1,所以下面要重新輸入地址同樣還是先輸入垂直地址,然后再輸入水平地址
wr_lcd(comm,0x80+row);
wr_lcd(comm,0x80+collum);
if(color)//color=1,點(diǎn)亮;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);//寫(xiě)入數(shù)據(jù)
wr_lcd(dat,tempL);
wr_lcd(comm,0x30);//回到基本指令集
}
使用上面的函數(shù),就可以實(shí)現(xiàn)對(duì)任意一個(gè)像素點(diǎn)的亮滅控制了。有了上面的函數(shù),然后就可以實(shí)現(xiàn)控制液晶顯示任意曲線(xiàn)或任意形狀的圖像了。下面就貼一個(gè)顯示坐標(biāo)軸的函數(shù)吧,函數(shù)實(shí)現(xiàn)的功能是在液晶屏上顯示X,Y坐標(biāo)軸,并且把坐標(biāo)軸按每10個(gè)點(diǎn)進(jìn)行分段,函數(shù)如下:
未完待續(xù)。。。
評(píng)論