使用C51单片机+ILI9341彩屏进行Proteus仿真并画出一只坤坤

好久好久没有更新了, 今天更新一个最近在搞的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行

下面给出几个比较重要的寄存器简介:

  1. 模式设置寄存器(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  
  1. 行寄存器设置(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]);
    }

确实东西很多不好一一讲出,所以开源在网盘链接里面, 其余的部分就看上面网盘链接吧, 最后附上一张结果图片:
在这里插入图片描述
以及电路的连接方法如下:
在这里插入图片描述

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序菜鸟一只

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值