前面几篇完成了ILI9431的物理接口,显示逻辑接口的介绍后,基本上对ILI9341的工作模式有了比较清晰的了解。要想真正实现对ILI9341的使用和控制就必须了解它的指令系统。因此接下来就针对指令系统进行说明。由于从全英文的材料进行翻译,难免有不符合中文语言习惯的语序和专业术语,因此在本文翻译后还会在使用过程中不断进行修改,以及根据使用逻辑对文档进行总结和归纳,使译文资料更准确理解和容易使用:
《ILI9341的使用之【一】TFT-LCD原理(转载)》
《ILI9341的使用之【二】ILI9341介绍》
《ILI9341的使用之【三】ILI9341系统通信接口模式操作详解》
《ILI9341的使用之【四】RGB接口操作详解》
《ILI9341的使用之【五】命令一》
《ILI9341的使用之【六】命令二》
《ILI9341的使用之【七】实体面板案例-arduino 2.4inch TFT Touch Shield》
《ILI9341的使用之【八】ASCII字符显示及驱动分析》
《ILI9341的使用之【九】BG2312字库》
一、指令速查表
标识解释:
1、Hex是D0-D7的16进制码。对应命令码或参数码。
2、D0,D1,,,,D6,D7为字节的位码。因为ILI9341为18位总线D[17:0],但在传送命令和命令相关参数时,只有D0-D7这8位有效。D8-D17无效。
3、D/CX 、RDX、WRX这三个芯片的控制引脚。
注意
1、上面没有的定义的命令码视同NOP(00h)命令对待。
2、B0-D9 和 DE - FF 是显示厂商定义使用。在发货前,用户可以决定这些命令码是否有效或只是按NOP(00h)来对待。默认情况是等于NOP(00h)命令。
3、当ILI9341为了避免异常显示而处于Sleep OUT模式下,命令 10h, 12h, 13h, 26h, 28h, 29h, 30h, 36h (Bit B4 only), 38h 和 39h 须在V-SYNC期间进行更新。在 Sleep IN mode模式下,以上这些命令会立刻被更新。而Read status (09h)、Read display power mode (0Ah)、 Read display MADCTL (0Bh)、Read display pixel format (0Ch)、Read display image mode (0Dh)、 Read display signal mode (0Eh) 、 Read display self diagnostic result (0Fh) 这些命令则会在 Sleep IN mode 和Sleep OUT mode两种模式下被立刻更新。
二、命令详解
1、NOP(00h)
这个命令是一个空命令。运行该命令后显示模块上不会有任何显示效果。该命令可以用来终止帧内容的读(Memory Read)与写(Memory Write)操作。
2、Software Reset (01h)软重置
该命令会重置命令和参数的默认值(这些默认值可以在每个命令的描述一栏内查找)。
注意:
1、帧内存的内容不会受这个命令影响。
2、在该命令发出后需等待5毫秒后再发送新的命令。在这5毫秒内,模块加载出厂默认值到寄存器中。
3、如果在Sleep Out 模式中应用了软重置命令(应用后会进入Sleep In 模式),则再次在发送Sleep Out命令之前需需等待120毫秒。不能在Sleep Out命令 序列执行其间发送软重置命令。
3、Read display identification information (04h)读取显示识别信息
读指令发出后,读的
第一个字节无意义。
第二个字节是LCD模块厂家ID
第三个字节是模块或驱动版本号
第四个字节是LCD模块或驱动器ID
4、Read Display Status(09h) 读显示状态
5、Read Display Power Mode(0Ah)读显示电源模式
在发出该指令后,可以从D[7:0]总线读出显示状态。状态编码如下表中所描述。
6、Read Display MADCTL(0Bh)读显示内存访问控制
当发送0Bh指令后,从总线D[7:0]处可以读出显示内存访问控制状态。这些状态的含义如下表。同时这些状态的设置是由MADCTL(36h)所设置。D0,D1两位总是读到0.
7、Read Display Pixel Format(0Ch)
当发送0Ch指令后,总线D[7:0]上可以读出像素的格式设置情况。像素的格式设置由指令Pixel Format Set(3Ah)设置 。
8、. Read Display Image Format (0Dh)
返回图像格式信息。
9. Read Display Signal Mode (0Eh)
指令发送后,第二次读到的D[7:0]上的信息才是显示信号模式
10. Read Display Self-Diagnostic Result (0Fh)
11. Enter Sleep Mode (10h)
该指令会使LCD模块进入最小功耗模式。在这个模式下DC/DC变换器会停止工作,内部振荡器停止工作,面板扫描停止。但MCU接口和存储器仍在工作。存储器的内容会继续保存了。
当模块已经在sleep in模式下时,再发出Enter Sleep Mode指令是无效的。只有用Sleep Out(11h)命令后才能使模块脱离Sleep In模式。Enter Sleep IN 命令发出后5ms后才能再发下一条指令,这是为了给电压和时钟稳定留出足够时间。当处于Sleep In模式中时,在Sleep Out 指令之后 必须要等120ms才能再次发出Sleep IN 指令。
按下面的流程图:当SLeep IN指令发出后,显示器黑屏,然后LCD内的电荷被导出,DC/DC转换器停止工作,内部振荡器停止工作,进入Sleep In 模式。
12. Sleep Out (11h)
这个指令会关才睡眠模式。
在该模式下,DC/DC转换器,内部振荡器以及面板扫描都开始工作。
当模块已经处理Sleep Out模式下时,再发出Sleep Out指令是没有效果的。只有通过发出Sleep IN(10h)批令才能脱离Sleep Out模式。在Sleep Out指令发出后须等5ms才能再发出下一下指令,这是给电压和时钟电路的稳定提供足够时间。同时在这5ms中,显示模块加载所有的出厂默认值到寄存器。当显示模块已处于Sleep Out模式中,出厂默认值已加载完成,如果出厂默认值与寄存器的值相同,则显示的图像不会有任何显示异常。在这5ms中,显示模块还会自检。
当处于Sleep Out模式中,在发出Sleep In 指令后需要等待120Ms后才能再次发出Sleep Out指令。
13. Partial Mode ON (12h)
这个指令开启局部显示模式。局部显示模式由Partial Area (30h)指令定义。而Normal Display Mode On (13h)指令能使显示模式离开局部模式。
如果已处于局部显示模式中,该命令就无效。
可以参考Partial Area (30h)指令。
14. Normal Display Mode ON (13h)
该指令使显示返回一般模式。即关闭局部显示模式。离开一般模式用局部显示指令(12h)。当已处于一般显示模式时,再用这个指令就没有效果了。
15. Display Inversion OFF (20h)
与下一个命令Display Inversion On(21h)(显示倒转命令)相反,该指令关闭倒转显示。使显示正常模式。该命令不会改变帧存储的内容和其它的状态。
16. Display Inversion ON (21h)
该命令用于进入反转显示模式。
该指令不会改变帧内存的内容。也不会改变任何其它状态。当帧内存中的每个字被对应到显示屏时会被置反。
退出反转显示模式需用指令20h。
当已处于反转显示模式中时,再执行本指令就不会有任何效果。
17. Gamma Set (26h)显示伽马值的设置
该指令用来为当前的显示选择伽马曲线值。最多有四个固定的伽马曲线值可以选择。在命令参数中设置适当的位来选择伽马值。
18. Display OFF (28h)
该指令用来进入DISPLAY OFF状态。帧内存输出被禁止,显示一个空页。这个指令不支改变帧内存的内容。不会改变任何其它状态。当显示模式已经处于DISPLAY OFF模式时,该命令将无效。
19. Display ON (29h)
该指令用于反转DISPLAY OFF模式。帧内存的输出被激活。该指令不会改变帧内存的内容,不会改变其它状态。当模块已经处于DISPLAY ON 模式时,该命令无效。
20. Column Address Set (2Ah)
这个指令用于定义MCU能够访问的帧内存的区域。该指令不会改变其它驱动的状态。SC[15:0]和EC[15:0]的值是预设值。只有当RAMWR命令被执行时,这两个列起始止参数才被调用。。
应用时,SC[15:0]必须小于或等于EC[15:0]。(起始列当然要小于等于结束列)。
当正常模式下240列x320行。SC[15:0]或EC[15:0]值不能大于00EFh(00EF=240)。
横屏模式下320列 x 240行。。SC[15:0]或EC[15:0]值不能大于013Fh(013F=320)。
Column Address Set(2Ah)应与Page Address Set (2Bh)指令一起使用。见下面的流程图。
21. Page Address Set (2Bh)
该指令用来定义MCU能够访问的区域。与上一个指令Column Address Set(2Ah)对应,定义访问区域的行起始位。设置 的SP[15:0]与EP[15:0]值会在RAMWR(2Ch)指令执行时被调用。
如下图中。SP[15:0]是起始行,所以要小于等于结束行EP[15:0]。
在正常显示模式下,320行x240列。则SP[15:0]与EP[15:0]的值要小于等于013Fh (即013Fh=319)。
在横屏模式下,240行x320列。则SP[15:0]与EP[15:0]的值要小于等于00EFh (即00EFh=240)
22. Memory Write (2Ch)
该指令用于把MCU的数据传送给帧内存。这个指令不会改变其它的驱动状态。当这个命令执行时,列寄存器和行寄存器被重置成Start Column (前面两个命令的SC)与Start Page(前面两个命令中的SP)。根据MADCTL(36h)的设置,Start Column/Start Page的位置是不同的。随着列寄存器和行寄存器的递增,总线D[17:0]的数据会被存储在帧内存中。这个写入帧的操作会被任意其它的指令的执行所终止。
23. Color Set (2Dh)
这个命令是用于定义LUT(Look UP Table颜色查找表),该表用于16位到18位的色深转换。不论颜色模式如何,总共有128字节需要写入LUT表。只有在下面LUT表中所规定的值可以被引用。这个命令对其它命令,参数和帧内存的内容没有影响。可见的更改将在下一次写入帧内存时生效。
24. Memory Read (2Eh)
该指令从ILI9341的帧内存传送图形数据到主机处理器,传送的图形的像素的起始位由Column Address Set (2Ah)和 Page Address Set(2Bh)命令所指定。
Memory Access control (36h) B5=0
列和行寄存器被分别重置为开始列(SC)和开始行(SP)。像素被从帧内存中的(SC,SP)中读出。然后,列寄存器被递增并从帧内存中读取像素,直到列寄存器等于结束列(EC)值。(即,在读行时列寄存器不断递增)。然后列寄存器重置为SC,并且行寄存器递增,从帧内存中读取像素一直到行寄存器等于结束行(EP)值才结束。或者主机处理器在期间发送其它命令也会使传送过程结束。
Memory Access control (36h) B5=1
列和行寄存器分别被重置为起始列(SC)和起始行(SP)。从帧内存的(SC,SP)读出像素。然后,行寄存器递增并且从帧内存读出像素直到行寄存器等于结束行(EP)值。然后,行寄存器重置到SP,并且列寄存器递增,从帧内存读出像素直到列寄存器等于结束列(EC)值才结束。或者主机处理器发送其它命令也会使传送过程结束。
25. Partial Area (30h)
该指令定义了局部模式的显示区域。该命令有2个参数,每个参数占两个字节,共四个字节需要随指令一起传送。第一个参数是起始行(Start Row)SR以及第二个参数是结束行(End Row) ER。如下图所指示的ER和SR指向的是帧内存的行指针。
SR和ER对显示区域的指示行为受到MADCTL(36h) 指令的第四位参数B4值的影响。
本指令关联命令为PTLON(12h)-进入局部显示模式,DISPOFF(13h)-退出局部显示模式。
26. Vertical Scrolling Definition (33h)
这个指令定义了显示的垂直滚动区域。根据MADCTL(36h) B4位的取值分为如下两类:
当MADCTL B=0时
TFA:Top Fixed Area
VSA:Vertical Scrolling Area
BFA:Bottom Fixed Area
第一和第二个参数TFA[15:0]描述的顶部固定区域(Top Fixed Area)。该值为从帧内存顶部开始显示的行号。
第三和第四个参数VSA[15:0]描述的是垂直滚动区域(Vertical Scrolling Area)。该值为从垂直滚动区开始地址开始的行号。从帧存储器中读取的第一行将立即出现在顶部固定区域的最下面一行之后。
第五第六个参数BFA[15:0]描述了底部固定区域(Bottom Fixed Area)。该值为从帧内存底部开始和显示的行号。
TFA、VSA、BFA是指向帧内存的行指针。
当MADCTL B=1时
第一和第二个参数TFA[15:0]描述了顶部固定区域。与第一种情况相反,如第二图例,TFA的值为从帧 内存底部开始和显示 行号。
第三和第四个能数VSA[15:0]描述垂直滚动区域的高度。其值为从垂直起始地址开始的帧内存的行号。从帧内存读取的第一行立即显示在顶部固定区域的最高行号之后。
第五和第六个参数BFA[15:0]描述了底部固定区域 。其值为从顶部帧内存开始和显示的行号。
27. Tearing Effect Line OFF (34h)
本指令是用于关闭从TE信号引脚输出的撕裂效果。TE=LOW
28. Tearing Effect Line ON (35h)
该指令用于打开从TE信号线输出的撕裂效果。这个输出不受MADCTL指令B4位变化的影响。这个撕裂效果线打开的指令有一个参数用于描述撕裂效果输出线的模式。
当参数的M位=0时:
撕裂效果输出线只包含了V_Blanking信息。
当参数的M位=0时:
撕裂效果输出行包含v -Blanking和h -Blanking信息:
注意:在撕裂效果线开启的睡眠模式中,撕裂效果输出管脚将是电平激活
29. Memory Access Control (36h)
该命令定义了帧内存的读写描扫方向。
该命令不会改变其它驱动器状态。
注意:当BGR位被改变。这个新的设置立即被激活,不需要等在帧内存中更新。
30. Vertical Scrolling Start Address (37h)
这个指令须与指令33h(Vertical Scrolling Definition)一起使用。这两个命令描述了滚动区域 和滚动模式。这个垂直滚动起始地址命令有一个用于描述帧内存的滚动区域的行的参数。该行将写入顶部固定区域 (Top Fixed Area见指令33h)之后的第一行。
具体看下方的图示:
31. Idle Mode OFF (38h)
这个命令用于从空闲模式中恢复。在空闲模式关中,LCD可以最大显示262144种颜色。
32. Idle Mode ON (39h)
这个指令用于进入空闲模式中。
在空闲模式中,颜色的表达减少。主色和副色使用了帧内存中R,G,B,的最高有效位,共有8种颜色用于显示 。
33. COLMOD: Pixel Format Set (3Ah)
这个指令通过接口为RGB图像数据设置像素格式。指令参数DPI[2:0]是设置RGB接口的格式选择。指令参数DBI[2:0]是设置MCU接口的像素格式。
注意:如果使用RGB接口则必须选择串行接口。
34. Write_Memory_Continue (3Ch)
这个命令将图像数据从主机处理器传输到显示模块的帧内存中,从前面的write_memory_continue或write_memory_start命令之后的像素位置持续传输。
当set_address_mode 即MADCTL(36h)指令 B5 = 0,
数据被填入到write_memory_start或write_memory_continue的命令范围的像素位置。然后,列寄存器递增同时像素被写入到帧内存直到列寄存器等于结束列(EC)值。然后,列寄存器重置为起始列(SC)并且行寄存器递增。像素被写入到帧内存直到行寄存器等于结束行(EP)值,列寄存器等于EC值或者主处理器发送了另一个指令才结束 。
那些超出(EC-SC+1)*(EP-SP+1)数量的额外像素被忽略。
当set_address_mode 即MADCTL(36h)指令 B5 = 1,
数据被填入到write_memory_start或write_memory_continue的命令范围的像素位置。然后,行寄存器递增并且像素被写入帧内存直到行寄存器等于结束行EP的值。然后,行寄存器被重置成起始行SP值,并且列寄存器递增。像素被写入到帧内存中直到列寄存器等于结束列EC值 和行寄存器等于EP值,或者当主几发出另一条指令时才结束。
那些超出(EC-SC+1)*(EP-SP+1)数量的客外像素被忽略。
在命令执行过程中,如果主控发出其它命令后,帧写入会停止。
关联命令:
Interface Control(F6h)指令的参数 WEMODE=0时
如果传送的数据超出(EC-SC+1)(EP-SP+1)数量时,多余的数据会被忽略
Interface Control(F6h)指令的参数 WEMODE=1时
当传送的数据超出(EC-SC+1)(EP-SP+1)数量时,列和行寄存器将被重置,超出的数据将被写入到接下来的列和行寄存器中。
write_memory_start 应当跟在 set_column_address, set_page_address 或 set_address_mode所定义的写地址后,否则write_memory_continue指令的数据写会被写入到无效地址。
35. Read_Memory_Continue (3Eh)
该指令从显示模块的帧内存传送图像数据到主控端。命令会持续地从之前的read_memory_continue(3Eh)指令或read_memory_start(2Eh)命令紧接的位置开始传送。
当MADCTL(36h)指令的B5=0 竖屏320行*240列
像素被持续从read_memory_start或read_memory_continue指令后的像素位置读出。然后列寄存器递增并且像素被从帧内存读出,直到列寄存器等于结束列EC的值。然后列寄存器被重置为SC并且行寄存器递增。像素从帧内存志出直到行寄存器寺于结束行EP并且列寄存器等于EC值,或者主机发出另一个指令后结束。
当MADCTL(36h)指令的B5=1 横屏240行*320列
像素被持续从read_memory_start或read_memory_continue指令后的像素位置读出。然后行寄存器递增并且像素被从帧内存中读出直到行寄存器等行结束行EP的值。然后,行寄存器被重置为SP并且列寄存器递增。然后,像素从帧内存中读出直到列寄存器等于结束列EC的值并且行寄存器等于EP值,或者主控发出了另一指令后才终止。
该 指令不会改变其它的驱动器状态。
read_memory_start 应紧跟在 set_column_address, set_page_address 或 set_address_mode所定义的读位置之后。否则,read_memory_continue指令读的数据是无定义的。