用12864顯示選單時,將當前項選單反白顯示是乙個比較常見的顯示效果。然而,st7920驅動的12864模組擴充套件指令集中的反白顯示(reverse)功能,卻沒有什麼實際使用價值。因為反白第1行時,第3行也同時反白了;反白第2行時,第4行也同時反白了。
查閱網上資料,向ddram寫入文字,再向文字所在處的gdram記憶體相應位置寫入「1」,可實現反白效果。
為此,研究了一下st7920的圖形操作。
1. gdram記憶體與螢幕的對應關係
gdram空間有64×256 bit 組成。使用擴充套件指令集中的set graphic ram address指令將gdram位址新增到ac(address counter)之後,就可向gdram寫入資料了。set graphic ram address是乙個兩位元組指令,連續寫入垂直位址(第乙個位元組)和水平位址(第二個位元組)就可完成該指令。這樣就需要首先了解垂直位址、水平位址和gdram空間的關係。
可見,gdram的垂直位址有64個(0~63),水平位址有16個(0~15)。利用set graphic ram address指令時,就是使用這兩組資料。那麼,這兩組資料和螢幕的實際對應關係是怎樣的呢?
2. 如何向gdram寫入資料
使用set graphic ram address指令寫入垂直位址和水平位址之後,ac中就儲存了指定的gdram位址了,此時利用寫資料指令,就會向gdram中寫入圖形資料了。
垂直位址好理解,乙個垂直位址就是一行畫素的垂直位置。
乙個水平位址指向16個 bit 資料,代表著螢幕上16個畫素,這16位資料分別稱作 b15~b0,如上圖所示。值為1的位代表亮點,值為0的位代表暗點。因此連續寫入兩個位元組的資料,就可完成乙個水平位址的寫資料操作。根據entry mode設定的方向,寫完這兩個位元組後,ac會自動±1。接著就可直接寫下乙個水平位址包含的16位資料了。
連續寫入資料時有乙個問題需要注意,當ac中的水平位址為15時,寫入16位資料後,ac中的水平位址將會自動變成0,而垂直位址不會發生變化。也就是說,當寫滿一行後,如果不調整垂直位址,就會反覆在同一行中寫入,從而將前面寫入的資料擦除。
因此向gdram寫入資料的流程是:
將乙個全寬字元(漢字)位置對應的gdram全部寫1,就可實現這個漢字的反白效果,將一行全寬字元位置對應的gdram全部寫1,就可實現該行的反白,這樣就實現了選單的反白顯示目的。
3. 切換基本指令集和擴充套件指令集需要注意的問題
寫字操作的是ddram,畫圖操作的是gdram,相關指令分屬基本指令集和擴充套件指令集。因此,在反白顯示操作時需要在兩個指令集中切換,切換涉及的暫存器結構如下,我採用的序列通訊,所以rs、rw不用考慮,僅考慮暫存器本身的位即可,其中dl位是8、4位並行通訊格式的選擇位,我也不用考慮,直接取0,使用8位並行通訊時取1。
在基本指令集和擴充套件指令集中切換時,注意不要影響db1-g位。
LCD驅動的問題
最近遇到lcd驅動的問題,lcd可以點亮,但是畫影象的時候螢幕上只顯示各種顏色垂直的線條,不知 出了問題,不知哪位高手可以指點一下!我用的是mtk6205 st7367的dirver ic,init成功,但是畫圖就有問題了,畫全黑的過去居然顯示成彩色的條狀。每一列的顏色一樣,這個很奇怪阿,不同列的顏...
Linux的LCD驅動分析
linux的graphics子系統介紹 一 lcd介紹 liquid crystal display液晶顯示器,lcd按材料分有 stn 超扭曲陣列 tft 薄膜電晶體 ltps 低溫晶體多晶矽 oled 有機發光二極體 等。lcd的介面種類有 ttlrgb 數字rgb顏色介面 i80 又稱mcu介...
LCD驅動中pixclock的計算
在lcd驅動程式中,需要我們根據lcd datasheet來設定相應的引數,這些引數包括 pixclock,left margin,right margin,upper margin,lower margin,hsync len,vsync len,vbp,vfb,vspw,hbp,hfp,hspw...