只要你有点基础-知道什么叫地址,什么叫指针,会玩流水灯,菜鸟可以在我这里学会,老司机可以在我这里瞬间学会,不用去看麻烦的手册
一般产品手册上教的是你怎么用单片机操作他们生产的模块
我的逆向思维法是告诉你他们的模块是怎么接受和识别你所发出的指令
好处有两个: 一是瞬间学会 二是了解机理后,语句上更灵活精简
。首先要了解下几个引脚的功能和两大寄存器和把数据线接对。把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);
}
|