<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-ST7920液晶繪圖的介紹

12864-ST7920液晶繪圖的介紹

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

基于控制的液晶用于字符顯示很方便的,但網(wǎng)友說(shuō)用它顯示圖形并不合適,原因就是它繪圖時(shí)先要關(guān)閉顯示,繪完后又要打開(kāi),速度會(huì )較慢。我沒(méi)有用過(guò)別的液晶,手中只有這一款,擺弄了幾天,掌握了一點(diǎn)東西,

寫(xiě)出來(lái)共享。


首先,我們知道,圖形都是由像素點(diǎn)組成的,繪圖的基礎其實(shí)就是畫(huà)點(diǎn)。只要我們能點(diǎn)亮液晶的任意一個(gè)像素點(diǎn),那么繪圖就不是什么難事了。萬(wàn)丈高樓平地起嘛,先要做的,當然是要打好基礎。

提供了用于繪圖的GDRAM(graph display RAM)。共 64×32 個(gè)字節的空間(由擴充指令設定繪圖 RAM 地址),最多可以控制 256×64點(diǎn)陣的二維繪圖緩沖空間。在它的Da

tasheet給出了GDRAM的坐標地址對照表:

點(diǎn)擊瀏覽下一頁(yè)

用坐標表示,就是這樣:
點(diǎn)擊瀏覽下一頁(yè)

它的橫坐標每一個(gè)地址都是16 位的。共16個(gè)地址,256位。
很明顯,它能控制256*64像素的液晶屏,而我們的只是128*64像素液晶屏,顯然只用到它的一部分。
我剛開(kāi)始以為它對應屏幕的繪圖RAM是這樣分布的(如紅色部分):
點(diǎn)擊瀏覽下一頁(yè)

結果栽了大根頭,后來(lái)終于弄明白,原來(lái)它對應屏幕的GDRAM是這樣分布的:

點(diǎn)擊瀏覽下一頁(yè)

只要我們清楚了它的GDRAM和屏幕上像素點(diǎn)的映射(對應)關(guān)系,點(diǎn)亮對應的像素點(diǎn)就容易多了。要點(diǎn)亮某一個(gè)像素點(diǎn),就是將這個(gè)像素點(diǎn)在GDRAM中對應的位置1,這個(gè)相信沒(méi)人會(huì )不知道吧?
我們先討論一下思路,再一步步寫(xiě)代碼。我覺(jué)得,思路要比代碼重要的多,只要你的思路通了,正確了,那么寫(xiě)出代碼肯定會(huì )很容易。
首先,給你x,y的坐標,要你點(diǎn)亮一個(gè)點(diǎn),要怎么做呢?從上面的圖我們知道,它是分為兩個(gè)半屏的,首先,我們要確定這個(gè)點(diǎn)是在上半屏還是下半屏,然后確定它是在那一行(縱坐標Y),再確定它是在哪一個(gè)字節的哪一個(gè)位(也就是確定它在那一列,即橫坐標X)。這些都確定后我們就定位到某一個(gè)具體的位上了,只就將這個(gè)位置1,就OK了。
下面我們邊寫(xiě)代碼邊討論。
因為這里僅僅是討論如何在上打點(diǎn)的,而不是給寫(xiě)一個(gè)驅動(dòng),所以對于基本的數據讀寫(xiě)函數,我們不做討論,這里假設已經(jīng)有了如下基本函數:

1voidlcd_write_cmd(unsignedchar);  //lcd 命令寫(xiě)2voidlcd_write_data(unsignedchar); //lcd 數據寫(xiě)3unsigendcharlcd_read_data(void);  //lcd 數據讀好了,就這些了。為了方便,我們定義如下宏:print?1#define  BASIC_SET   0x00          //基本指令集,后面的數字查數據手冊,下同。2#define  EXTEND_SET  0x00           //擴展指令集3#define  DRAW_ON     0x00           //繪圖顯示開(kāi)4#define  DRAW_OFF    0x00           //繪圖顯示關(guān)我們現在開(kāi)始寫(xiě)點(diǎn)亮某一個(gè)點(diǎn)的函數:print?01voidlcd_set_dot(unsignedcharx, unsignedchary)02{03unsignedcharx_byet, x_bit;       //在橫坐標的哪一個(gè)字節,哪一個(gè)位04unsignedchary_byte, y_bit;05x_byte = x / 16;                   //算出它在哪一個(gè)字節(地址)06//注意一個(gè)地址是16位的07x_bit = x % 16;                    //算出它在哪一個(gè)位08y_byte = y /32;                    //y是沒(méi)在哪個(gè)字節這個(gè)說(shuō)法09//這里只是確定它在上半屏還是下半屏10//0:上半屏 1:下半屏11y_bit = y % 32;                    //y_bit確定它是在第幾行12lcd_write_cmd(EXTEND_SET);         //擴展指令集13lcd_write_cmd(DRAW_OFF);           //繪圖顯示關(guān)閉14lcd_write_cmd(0x80 + y_bit);       //先寫(xiě)垂直地址15//具體參照數據手冊16lcd_write_cmd(0x80 + x_byte + 8 * y_byte);  //水平坐標17//下半屏的水平坐標起始地址為0x8818//(+8*y_byte)就是用來(lái)確定在上半屏還是下半屏19if(x_bit  8)                              //如果x_bit位數小于820{21lcd_write_data(0x01  (7 - x_bit));    //寫(xiě)高字節。因為坐標是從左向右的22//而GDRAM高位在左,底位在右23lcd_write_data(0x00);                   //低字節全部填024}25else26{27lcd_write_data(0x00);                   //高字節全部填028lcd_write_data(0x01  (15 - x_bit));29} 30lcd_write_cmd(DRAW_ON);                    //打開(kāi)繪圖顯示31lcd_write_cmd(BASIC_SET);                  //回到基本指令集,畢竟是以字符為主的32return;33}


基本畫(huà)點(diǎn)函數算是完成了,但是我們如果使用這個(gè)函數,就會(huì )發(fā)現問(wèn)題。你且用它沿橫坐標畫(huà)幾個(gè)連續的點(diǎn)試試,肯定不是你想要的結果。

出現問(wèn)題的原因是因為我們畫(huà)點(diǎn)時(shí)對其余的位全部填0處理了,造成對原來(lái)的信息的破壞。所以我們要讀出要寫(xiě)的那個(gè)地址原來(lái)的數據,再進(jìn)行加工,寫(xiě)回去就可以解決問(wèn)題了。


畫(huà)點(diǎn)函數到此就完成了,剩下的事情就是對函數的優(yōu)化了。例如對入口參數的檢查,對乘除法的優(yōu)化等等。



關(guān)鍵詞: 12864 ST7920 液晶繪圖

評論


相關(guān)推薦

技術(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>