本帖最后由 ds444 于 2018-4-2 17:25 編輯
只要你有點基礎-知道什么叫地址,什么叫指針,會玩流水燈,菜鳥可以在我這里學會,老司機可以在我這里瞬間學會,不用去看麻煩的手冊
一般產品手冊上教的是你怎么用單片機操作他們生產的模塊
我的逆向思維法是告訴你他們的模塊是怎么接受和識別你所發出的指令
好處有兩個: 一是瞬間學會 二是了解機理后,語句上更靈活精簡
好了,開始說正題。首先要了解下幾個引腳的功能和兩大寄存器和把數據線接對。把IO口置為推挽方式
一.指令寄存器(從GRAM跳轉到這里的方法是RS=0)
RESET 這個是復位,不需要我解釋了吧
CS :片選它的作用是除了字面上的意思外,還有個和SPI總線的NSS腳一樣的作用:重新定義數據頭,如果通訊
中出現數據錯位的話這個腳就起到作用了
RS :數據 or 地址(低電平就把你賦到數據口上的值當做地址來操作地址指針。 高電平時寫的數據被放進相
應寄存器里)
RD :讀(下降沿生效)
WR :寫(上升沿生效)
DB0-DB17 :數據腳
二。GRAM--是個矩陣,每個點對應屏幕上的一個點(從指令寄存器跳轉到這里的方法是將指令寄存器的地址寫
0X0022(這里是指令寄存器的出口))
1.底層協議和基本函數(后面我具體講)
2.操作寄存器 來實現初始化 其代碼比較復雜上網或者找朋友要份代碼抄一下,想深入研究的朋友可以找份中文
的寄存器說明看下。只要屏來做顯示用的朋友沒有必要看了
3。劃定具體顯示區域,默認是地址每寫一位會自動加1超過分界回自動循環(一般是 X為 0-239 ,Y為 0-319。
當然也可以定義更小的區域) 這個在寄存器0X0050,0X0051,0X0052,0X0053里操作。
4.把GRAM指針移動到指定位置,類似1602液晶光標的作用,它不會顯示出來。指令是行坐標是操作 0x0020寄存
器 列坐標是操作 0x0021寄存器
5。會了上面這些接著就簡單了 初始化--劃顯示區域--移動GRAM坐標到想要的起始位置--寫0X0022把指針移動到
GRAM--對數據端口賦值,WR每個上升沿9325會把該值寫進GRAM并顯示出來(保證RS為高)
6.至于還有個8位總線,硬件是接DB10-DB17。軟件操作和16位總線是一樣的,就是一個 16位指令分兩次來寫而
已。不管是數據還是地址都先寫高8位就行
7.基本協議也就是時序,其實有了上面的解釋很容易自己寫出時序了。我簡單講下吧。先CS=0; RS = 0; P1 =0;
(命令地址高8位都是0) 然后給個上升沿WR = 0;WR = 1; 指令寄存器的地址操作就完成了。光寫地址是完全沒用
的,后面肯定要跟個數據(0X0022是出口它特殊)寫數據的時序和上面一樣,就是要保證WR上升沿的時候RS為高
電平。
8.知道了這些不必傻乎乎的每寫一個指令或者數據就去操作一次CS,也不必每刷一幀屏都去操作一次起始坐標。
因為它會循環的。顯示區域設定在寄存器0050-0053里面,你不去修改它是不會變的,不用反復劃定他。
9.讀數據,讀和寫基本一樣。就是RD下降沿生效和WR上升沿生效的區別,友情提醒一下,讀數據要等待數據穩定
,速度比寫慢一點,具體請看手冊。
本帖旨在拋磚引玉,希望更多高手能把更多模塊的使用方法用這種方式寫出來。充分理解IC的工作方式 一是學的
快 二是可以自己靈活運用
希望高手不要吝嗇!我在等OV7670的驅動,如果沒有人寫的話,我會再近期寫上來。(等我筆記本修好了)
void ILI9325_init(void)
{
ILI9325_Reset(); RD=1; CS=1;
W_com_data(0x00e7,0x0010);
W_com_data(0x0000,0x0001); //start internal osc
W_com_data(0x0001,0x0100);
W_com_data(0x0002,0x0700); //power on sequence
W_com_data(0x0003,(1<<12)|(1<<5)|(1<<4) ); //65K
W_com_data(0x0004,0x0000);
W_com_data(0x0008,0x0207);
W_com_data(0x0009,0x0000);
W_com_data(0x000a,0x0000); //display setting
W_com_data(0x000c,0x0001); //display setting
W_com_data(0x000d,0x0000); //0f3c
W_com_data(0x000f,0x0000);
W_com_data(0x0010,0x0000);
W_com_data(0x0011,0x0007);
W_com_data(0x0012,0x0000);
W_com_data(0x0013,0x0000);
ms(200);
W_com_data(0x0010,0x1590);
W_com_data(0x0011,0x0227);
ms(50);
W_com_data(0x0012,0x009c);
ms(50);
W_com_data(0x0013,0x1900);
W_com_data(0x0029,0x0023);
W_com_data(0x002b,0x000e);
ms(50);
W_com_data(0x0020,0x0000);
W_com_data(0x0021,0x0000);
ms(50);
W_com_data(0x0030,0x0007);
W_com_data(0x0031,0x0707);
W_com_data(0x0032,0x0006);
W_com_data(0x0035,0x0704);
W_com_data(0x0036,0x1f04);
W_com_data(0x0037,0x0004);
W_com_data(0x0038,0x0000);
W_com_data(0x0039,0x0706);
W_com_data(0x003c,0x0701);
W_com_data(0x003d,0x000f);
ms(50);
W_com_data(0x0050,0x0000);
W_com_data(0x0051,0x00ef);
W_com_data(0x0052,0x0000);
W_com_data(0x0053,0x013f);
W_com_data(0x0060,0xa700);
W_com_data(0x0061,0x0001);
W_com_data(0x006a,0x0000);
W_com_data(0x0080,0x0000);
W_com_data(0x0081,0x0000);
W_com_data(0x0082,0x0000);
W_com_data(0x0083,0x0000);
W_com_data(0x0084,0x0000);
W_com_data(0x0085,0x0000);
W_com_data(0x0090,0x0010);
W_com_data(0x0092,0x0000);
W_com_data(0x0093,0x0003);
W_com_data(0x0095,0x0110);
W_com_data(0x0097,0x0000);
W_com_data(0x0098,0x0000);
W_com_data(0x0007,0x0133);
W_com_data(0x0020,0x0000);
W_com_data(0x0021,0x0000);
}
最后補充個花絮:這是我從某論壇轉載的。但是雖然是轉載,不過原帖也是我本人寫的
|