<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 我的12864學(xué)習筆記_4---幾點(diǎn)補充詳解

我的12864學(xué)習筆記_4---幾點(diǎn)補充詳解

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò ) 收藏
我發(fā)現前面幾篇對圖畫(huà)顯示RAM (GDRAM)介紹的不是很詳細,我就在下面再詳細地介紹一下:

圖畫(huà)顯示RAM(GDRAM)

本文引用地址:http://dyxdggzs.com/article/201611/322842.htm

提供64*256位元的GDRAM提供64*32個(gè)位元組的記憶空間(由擴充指令設定繪圖RAM地址),最多可以控制256*64點(diǎn)的二維繪圖緩存空間。在更改繪圖RAM時(shí),由擴充指令設定GDRAM地址,先設垂直地址,再設水平地址(連續寫(xiě)入兩個(gè)位元組的資料來(lái)完成垂直與水平的坐標地址)。再寫(xiě)入兩個(gè)8位元的資料到繪圖RAM,而地址計數器(AC)會(huì )自動(dòng)加一,整個(gè)寫(xiě)入繪圖RAM的步驟如下:

(1),先將垂直的位元組坐標(Y)寫(xiě)入繪圖RAM地址

(2),再將水平坐標(X)寫(xiě)入繪圖RAM地址

(3),將D15~D8寫(xiě)入RAM中(寫(xiě)入第一個(gè)bytes)。

(4),將D7~D0寫(xiě)入到RAM中(寫(xiě)入第二個(gè)bytes)。

當顯示圖形的時(shí)候,默認的將128*64的液晶模塊分成了32*16的16塊,地址分別是80H-8FH,顯示時(shí)候可分為兩個(gè)部分給數據.這時(shí)就可以看為32*128的兩塊。

注意圖形顯示時(shí)候的每一個(gè)字節地址所對應的位置。每行共八個(gè)模塊,共送兩次,開(kāi)始地址分別為80H和88H。

也就是顯示的時(shí)候會(huì )只用到GDRAM的前0~31行,共有0~255列,列又分每16列為一個(gè)大列,所以有0~15共16大列。也可以像上面那樣理解為分成了32*16的16個(gè)模塊,地址分別為80H-8FH。

然后把這16個(gè)模塊分成兩行顯示,所以每一行是8個(gè)32*16模塊,也就是32*128。所以這兩行的起始地址分別為80H和88H。所以在寫(xiě)入圖形數據的時(shí)候會(huì )分兩次寫(xiě)入,先寫(xiě)入第一行的8個(gè)32*16模塊,再寫(xiě)入第二行的8個(gè)32*16模塊。

在寫(xiě)入數據的時(shí)候要注意,要先輸入垂直地址,再輸入水平地址。

上面的對GDRAM進(jìn)行分塊及分行進(jìn)行顯示都是液晶出廠(chǎng)時(shí)默認設定好的,我們用的時(shí)候就直接對相應位置的RAM進(jìn)行寫(xiě)入數據就可以了。

所以由上面顯示圖片的原理的介紹就可以看出12864液晶只能顯示GDRAM的一半,只用了全部GDRAM的一半。

清除了上面GDRAM的工作原理,那么GDRAM圖片數據的寫(xiě)入和GDRAM清除程序就不難理解了。程序下面給出,注釋的也很詳細。

有了上面的介紹,那么再看下面對GDRAM的操作(如:清除,數據等)就會(huì )明白很多了,下面是對GDRAM的清除函數,注釋的也比較詳細:

清除GDRAM的函數如下:

voidClear_GDRAM(void)//清除GDRAM中的的隨機數據。因為上電后GDRAM中的數據是隨機的,如果不清除而直接打開(kāi)GDRAM顯示時(shí),會(huì )顯示亂碼

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

//不必清除,因為新數據會(huì )把隨機數據給覆蓋掉

{

uchari,j,k;

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

i=0x80;

for(j=0;j<32;j++)//寫(xiě)入第一行的8個(gè)32*16模塊

{

wr_lcd(comm,i++);//寫(xiě)入第一行8個(gè)32*16模塊的垂直起始地址,在寫(xiě)入地址時(shí),要先輸入垂直地址,再輸入水平地址這是規定好的

wr_lcd(comm,0x80);//第一行水平的起始地址為80H

//以后寫(xiě)入數據后,地址計數器(AC)會(huì )自動(dòng)加一

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

{

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

//寫(xiě)入32*16個(gè)圖片數據因為一個(gè)數據是8位的,所以這一次就相當于寫(xiě)入了8個(gè)數據,所以一共為8個(gè)32*16模塊

}

}

i=0x80;

for(j=0;j<32;j++)//寫(xiě)入第二行的8個(gè)32*16模塊

{

wr_lcd(comm,i++);//寫(xiě)入第一行8個(gè)32*16模塊的垂直起始地址,在寫(xiě)入地址時(shí),要先輸入垂直地址,再輸入水平地址這是規定好的

wr_lcd(comm,0x88);//第二行的水平起始地址為88H

//以后寫(xiě)入數據后,地址計數器(AC)會(huì )自動(dòng)加一

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

{

wr_lcd(dat,0x00);//寫(xiě)入32*16個(gè)圖片數據因為一個(gè)數據是8位的,所以這一次就相當于寫(xiě)入了8個(gè)數據,所以一共為8個(gè)32*16模塊

//寫(xiě)入空字符,就相當于清零

}

}

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

}

向GDRAM的寫(xiě)函數如下:

voidDraw_PM(constuchar*ptr)//整屏顯示圖形

{

uchari,j,k;

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

i=0x80;

for(j=0;j<32;j++)//寫(xiě)入第一行的8個(gè)32*16模塊

{

wr_lcd(comm,i++);//寫(xiě)入第一行8個(gè)32*16模塊的垂直起始地址,在寫(xiě)入地址時(shí),要先輸入垂直地址,再輸入水平地址這是規定好的

wr_lcd(comm,0x80);//第一行水平的起始地址為80H

//以后寫(xiě)入數據后,地址計數器(AC)會(huì )自動(dòng)加一

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

{

wr_lcd(dat,*ptr++);//寫(xiě)入32*16個(gè)圖片數據因為一個(gè)數據是8位的,所以這一次就相當于寫(xiě)入了8個(gè)數據,所以一共為8個(gè)32*16模塊

//這些16進(jìn)制數,一共可以控制32*16*8個(gè)像素

}

}

i=0x80;

for(j=0;j<32;j++)//寫(xiě)入第二行的8個(gè)32*16模塊

{

wr_lcd(comm,i++);//寫(xiě)入第一行8個(gè)32*16模塊的垂直起始地址,在寫(xiě)入地址時(shí),要先輸入垂直地址,再輸入水平地址這是規定好的

wr_lcd(comm,0x88);//第二行的水平起始地址為88H

//以后寫(xiě)入數據后,地址計數器(AC)會(huì )自動(dòng)加一

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

{

wr_lcd(dat,*ptr++);//寫(xiě)入32*16個(gè)圖片數據因為一個(gè)數據是8位的,所以這一次就相當于寫(xiě)入了8個(gè)數據,所以一共為8個(gè)32*16模塊

//這些16進(jìn)制數,一共可以控制32*16*8個(gè)像素

}

}

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

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

}

最后在說(shuō)一個(gè)簡(jiǎn)單的函數,拿到液晶時(shí),我們希望檢查一下液晶是不是好的,是不是所有的點(diǎn)都是可用的,就要寫(xiě)一個(gè)檢查液晶的函數。原理很簡(jiǎn)單,就是把液晶的所有的像素點(diǎn)都點(diǎn)亮,看看有沒(méi)有壞點(diǎn)就可以了,函數,如下,和寫(xiě)GDRAM,清除GDRAM的函數基本相同,只不過(guò)向GDRAM中寫(xiě)入的是全1,點(diǎn)亮所有的像素點(diǎn),函數如下:

voidcheck_screen(void)//點(diǎn)亮全屏,檢查壞點(diǎn)

{

uchari,j,k;

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

i=0x80;

for(j=0;j<32;j++)//寫(xiě)入第一行的8個(gè)32*16模塊

{

wr_lcd(comm,i++);//寫(xiě)入第一行8個(gè)32*16模塊的垂直起始地址,在寫(xiě)入地址時(shí),要先輸入垂直地址,再輸入水平地址

wr_lcd(comm,0x80);//第一行水平的起始地址為80H

//以后寫(xiě)入數據后,地址計數器(AC)會(huì )自動(dòng)加一

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

{

wr_lcd(dat,0xff);//全部點(diǎn)亮屏幕

//寫(xiě)入32*16個(gè)圖片數據因為一個(gè)數據是8位的,所以這一次就相當于寫(xiě)入了8個(gè)數據,所以一共為8個(gè)32*16模塊

}

}

i=0x80;

for(j=0;j<32;j++)//寫(xiě)入第二行的8個(gè)32*16模塊

{

wr_lcd(comm,i++);//寫(xiě)入第一行8個(gè)32*16模塊的垂直起始地址,在寫(xiě)入地址時(shí),要先輸入垂直地址,再輸入水平地址

wr_lcd(comm,0x88);//第二行的水平起始地址為88H

//以后寫(xiě)入數據后,地址計數器(AC)會(huì )自動(dòng)加一

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

{

wr_lcd(dat,0xff);//全部點(diǎn)亮屏幕

//寫(xiě)入32*16個(gè)圖片數據因為一個(gè)數據是8位的,所以這一次就相當于寫(xiě)入了8個(gè)數據,所以一共為8個(gè)32*16模塊

}

}

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

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

}



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>