好久好久没有更新了, 今天更新一个最近在搞的51单片机的东西
全部的资源, 包括源程序和 proteus仿真, 都公开在下面的链接可以下载:
链接:https://pan.baidu.com/s/1lyHluo5zFTgwfsp7RuwFrg?pwd=7m2g
提取码:7m2g
参考的 ILI9341的数据手册如下
https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf
在程序以及仿真中, 使用的是8-bit方法进行通信(本来想使用16bit的方法, 但是后来因为颜色传输问题又改成了8bit)
对于ILI9341彩屏而言, 由于彩屏的分辨率是240x320, (240列 x 320行), 其中240列是使用两个16进制数表示的(unsigned char), 即从 0x00到0xFE共有240个单元 , 而320行是使用三个16进制数(实际上使用unsigned int), 即0x000 -> 0x13F共有320行
下面给出几个比较重要的寄存器简介:
- 模式设置寄存器(MADCTL (Memory Access Control)) 在模式设置寄存器里面的D5位是设置长宽交换的, 如果想要横屏从左到右从上到下刷新, 则需要将D5设置为1(行列交换), 设置完MADCTL之后将行列寄存器, 在我的代码里面初始化之后即为横屏显示(我还多余加了一次)。设置完MADCTL之后需要重置行列寄存器(如果横屏, D5是1则列数寄存器(2a)设置为320(0x013F)) 和行数(page)寄存器(横屏时240, (0x00EF)) , 竖屏刚好相反。
// 竖屏显示的部分代码
ILI9341_Write_Cmd(0x36); // MADCTL settings
ILI9341_Write_Data(0x48); // set to horizontal screen
ILI9341_Write_Cmd(0x2a); // column address set
ILI9341_Write_Data(0x00);
ILI9341_Write_Data(0x00);
ILI9341_Write_Data(0x00);
ILI9341_Write_Data(0xEF); // 0000H to 00EFH
ILI9341_Write_Cmd(0x2b); // page address set
ILI9341_Write_Data(0x00);
ILI9341_Write_Data(0x00);
ILI9341_Write_Data(0x01);
ILI9341_Write_Data(0x3F); // 0000H to 013FH
// 横屏的显示代码
ILI9341_Write_Cmd(0x36); // MADCTL settings
ILI9341_Write_Data(0x28); // set to horizontal screen
ILI9341_Write_Cmd(0x2a); // column address set
ILI9341_Write_Data(0x00);
ILI9341_Write_Data(0x00);
ILI9341_Write_Data(0x01);
ILI9341_Write_Data(0x3F); // 0000H to 00EF
ILI9341_Write_Cmd(0x2b); // page address set
ILI9341_Write_Data(0x00);
ILI9341_Write_Data(0x00);
ILI9341_Write_Data(0x00);
ILI9341_Write_Data(0xEF); // 0000H to 013FH
- 行寄存器设置(2Ah)和列寄存器设置(2Bh):
对于2Ah(列column寄存器)和2Bh(行page寄存器)寄存器,在触发命令之后有4个参数,
其中前两个参数为Start (SC[15-0]), 后两个为End(EC[15:0]), 而显示的原理是先设置好范围和光标移动方向(自动移位),然后使用for循环将所有内容依次输入即可, 寄存器中的内容会自动显示在彩屏上。
另外需要说明, 对于Image2LCD是从第7位开始显示的, 同时需要严格控制显示图像的宽度, 否则会出现颜色错误和图片渲染位置乱的问题。
for (i = 7; i < 2 * width * height + 8; i++){ // jump first 2 byte
ILI9341_Write_Data(pic[i]);
}
确实东西很多不好一一讲出,所以开源在网盘链接里面, 其余的部分就看上面网盘链接吧, 最后附上一张结果图片:
以及电路的连接方法如下: