找回密码
 立即注册
查看: 347|回复: 10

求助,2.4寸tft屏幕显示异常 | 颜色经过修改后对了

[复制链接]
已绑定手机

14

主题

83

回帖

700

积分

高级会员

积分
700
发表于 2026-8-19 20:29:37 | 显示全部楼层 |阅读模式
买了一个spi屏幕,2.4寸,ili9341v驱动,写了软件spi初始化,测试代码,但只显示几行,其余花屏,求解决办法
  1. #include<AI8051U.h>
  2. sbit SCLK=P1^0;
  3. sbit MOSI=P1^1;
  4. sbit MISO=P1^2;
  5. sbit CS=P1^3;
  6. sbit RES=P1^4;
  7. sbit DC=P1^5;
  8. void Delay(unsigned long int t) { while(--t){_nop_();} }
  9. void Gpio_init(void)
  10. {
  11. P0M0=0x00;P0M1=0x00;
  12. P1M0=0xff;P1M1=0x00;
  13. P2M0=0x00;P2M1=0x00;
  14. P3M0=0x00;P3M1=0x00;
  15. P4M0=0x00;P4M1=0x00;
  16. P5M0=0x00;P5M1=0x00;
  17. }
  18. void SpiSendBit(bit dat)
  19. {
  20.     MOSI = dat;
  21.     SCLK = 1;
  22.     _nop_(); _nop_(); _nop_();
  23.     SCLK = 0;
  24. }
  25. void SpiSendByte(unsigned char dat)
  26. {
  27.     unsigned char j;
  28.     for(j=0x80; j; j>>=1)
  29.           {
  30.         SpiSendBit(dat & j);
  31.           }
  32. }
  33. void Lcd_Cmd(unsigned char cmd)
  34. {
  35.     CS = 0;
  36.     DC = 0;
  37.     SpiSendByte(cmd);
  38.     CS = 1;
  39. }
  40. void Lcd_Cmd_Ncs(unsigned char cmd)
  41. {
  42.     DC = 0;
  43.     SpiSendByte(cmd);
  44. }
  45. void Lcd_Data(unsigned char dat)
  46. {
  47.     CS = 0;
  48.     DC = 1;
  49.     SpiSendByte(dat);
  50.     CS = 1;
  51. }
  52. void Lcd_Data_Ncs(unsigned char dat)
  53. {
  54.     DC = 1;
  55.     SpiSendByte(dat);
  56. }
  57. void Lcd_Init(void)
  58. {
  59.           RES = 0;
  60.                 Delay(50000);
  61.                 RES = 1;
  62.                 Delay(1000000);
  63.     /* ---- 1. 软件复位 ---- */
  64.     Lcd_Cmd(0x01);      // Software Reset
  65.     Delay(70000);      // 复位后延时等待
  66.     /* ---- 2. 电源控制 ---- */
  67.     Lcd_Cmd(0xC0);      // Power Control 1
  68.     Lcd_Data(0x21);     // VRH[5:0] = 21h(参考命令表默认)
  69.     Lcd_Cmd(0xC1);      // Power Control 2
  70.     Lcd_Data(0x10);     // BT[2:0] = 0(命令表默认 10h)
  71.     Lcd_Cmd(0xC5);      // VCOM Control 1
  72.     Lcd_Data(0x31);     // VMH[6:0] = 31h
  73.     Lcd_Data(0x3C);     // VML[6:0] = 3Ch
  74.     Lcd_Cmd(0xC7);      // VCOM Control 2
  75.     Lcd_Data(0xC0);     // nVM=1, VMF 参考命令表
  76.     /* ---- 3. 时序 / 帧率控制 ---- */
  77.     Lcd_Cmd(0xB1);      // Frame Control (Normal Mode)
  78.     Lcd_Data(0x00);     // DIVA[1:0] = 00
  79.     Lcd_Data(0x1B);     // RTNA[4:0] = 1Bh
  80.     Lcd_Cmd(0xB6);      // Display Function Control
  81.     Lcd_Data(0x0A);     // PTG[1:0]=00, PT[1:0]=10
  82.     Lcd_Data(0x82);     // REV=1, GS=0, SS=0, SM=0, ISC=0010
  83.     Lcd_Data(0x27);     // NL[5:0] = 27h(240行)
  84.     Lcd_Data(0x04);     // PCDIV[5:0] = 04
  85.     /* ---- 4. 像素格式设定 ---- */
  86.     Lcd_Cmd(0x3A);      // Pixel Format Set
  87.     Lcd_Data(0x55);     // DPI=110(16bit), DBI=110(16bit) -> RGB565
  88.     /* ---- 5. 内存访问控制(显示方向 / RGB顺序)---- */
  89.     Lcd_Cmd(0x36);      // Memory Access Control
  90.     Lcd_Data(0x00);     // MY=0,MX=0,MV=0,ML=0,BGR=0,MH=0
  91.                         // 如需调整方向或 BGR 顺序,改此字节即可
  92.     /* ---- 6. 正负伽马校正 ---- */
  93.     // Positive Gamma Correction
  94.     Lcd_Cmd(0xE0);
  95.     Lcd_Data(0x0F); Lcd_Data(0x16); Lcd_Data(0x14);
  96.     Lcd_Data(0x0A); Lcd_Data(0x0D); Lcd_Data(0x06);
  97.     Lcd_Data(0x43); Lcd_Data(0x75); Lcd_Data(0x33);
  98.     Lcd_Data(0x06); Lcd_Data(0x0E); Lcd_Data(0x00);
  99.     Lcd_Data(0x0C); Lcd_Data(0x09); Lcd_Data(0x08);
  100.     // Negative Gamma Correction
  101.     Lcd_Cmd(0xE1);
  102.     Lcd_Data(0x08); Lcd_Data(0x2B); Lcd_Data(0x2D);
  103.     Lcd_Data(0x04); Lcd_Data(0x10); Lcd_Data(0x04);
  104.     Lcd_Data(0x3E); Lcd_Data(0x24); Lcd_Data(0x4E);
  105.     Lcd_Data(0x04); Lcd_Data(0x0F); Lcd_Data(0x0E);
  106.     Lcd_Data(0x35); Lcd_Data(0x38); Lcd_Data(0x0F);
  107.     /* ---- 7. 退出睡眠,开启显示 ---- */
  108.     Lcd_Cmd(0x11);      // Sleep OUT
  109.     Delay(1000000);      // 退出睡眠后需延时
  110.     Lcd_Cmd(0x29);      // Display ON
  111. }
  112. /* 全屏显示 RGB565 图片(240x320),高字节在前,一维数组 */
  113. void Display(const unsigned char img[])
  114. {
  115.     unsigned long i;
  116.     /* 设置全屏写入窗口 */
  117.     Lcd_Cmd(0x2A);              /* Column Address Set */
  118.     Lcd_Data(0x00); Lcd_Data(0x00);   /* SC = 0 */
  119.     Lcd_Data(0x00); Lcd_Data(0xEF);   /* EC = 239 */
  120.     Lcd_Cmd(0x2B);              /* Page Address Set */
  121.     Lcd_Data(0x00); Lcd_Data(0x00);   /* SP = 0 */
  122.     Lcd_Data(0x01); Lcd_Data(0x3F);   /* EP = 319 */
  123.                 CS=0;
  124.     Lcd_Cmd_Ncs(0x2C);              /* Memory Write */
  125.                
  126.     for (i = 0; i < 240 * 320; i++)
  127.     {
  128.         Lcd_Data_Ncs(img[i * 2]);       /* 高字节 */
  129.         Lcd_Data_Ncs(img[i * 2 + 1]);   /* 低字节 */
  130.     }
  131.                 CS=1;
  132. }
  133. void Test(void)
  134. {
  135.     unsigned long i;
  136.     /* 设置全屏写入窗口 */
  137.     Lcd_Cmd(0x2A);              /* Column Address Set */
  138.     Lcd_Data(0x00); Lcd_Data(0x00);   /* SC = 0 */
  139.     Lcd_Data(0x00); Lcd_Data(0xEF);   /* EC = 239 */
  140.     Lcd_Cmd(0x2B);              /* Page Address Set */
  141.     Lcd_Data(0x00); Lcd_Data(0x00);   /* SP = 0 */
  142.     Lcd_Data(0x01); Lcd_Data(0x3F);   /* EP = 319 */
  143.                 CS=0;
  144.     Lcd_Cmd_Ncs(0x2C);              /* Memory Write */
  145.    
  146.     for (i = 0; i < 240 * 320 * 2; i++)
  147.     {
  148.                         if(i<240*320)
  149.                         {
  150.                         Lcd_Data_Ncs(0xff);
  151.                         }
  152.                         else
  153.                         {
  154.                         Lcd_Data_Ncs(0x00);
  155.                         }
  156.     }
  157.                 CS=1;
  158. }
  159. void main()
  160. {
  161. WDT_CONTR = 0x00;
  162. Gpio_init();
  163. Lcd_Init();
  164. Test();
  165. while(1);
  166. }
复制代码


回复

使用道具 举报 送花

已绑定手机

14

主题

83

回帖

700

积分

高级会员

积分
700
 楼主| 发表于 2026-8-19 20:48:57 | 显示全部楼层
回复

使用道具 举报 送花

已绑定手机

14

主题

83

回帖

700

积分

高级会员

积分
700
 楼主| 发表于 2026-8-19 20:51:49 | 显示全部楼层
故障现象

IMG_2006.MOV

9.35 MB, 下载次数: 139

回复

使用道具 举报 送花

已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25440
发表于 2026-8-19 21:36:59 | 显示全部楼层
截图202608192136484357.jpg
回复

使用道具 举报 送花

已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25440
发表于 2026-8-19 21:37:24 | 显示全部楼层

我已经收集了充足的信息。现在我可以给出一个完整的、基于手册和论坛依据的回答。


2.4寸 ILI9341 SPI TFT 屏幕显示异常 — 分析与排查建议

楼主您好,我是 STC 的 FAE 工程师。针对您 AI8051U 用软件 SPI 驱动 2.4 寸 ILI9341V 屏幕"只显示几行、其余花屏" 的问题,结合 Ai8051U 手册及 STC 论坛同类案例,为您做如下系统分析。


一、先说明一个关键点:您用的是"软件 SPI + ILI9341",与手册 TFT 彩屏接口是两回事

需要澄清:Ai8051U 手册「33 TFT彩屏接口接口(8/16位i8080/M6800接口)」章节介绍的是片内集成的 LCM 硬件接口控制器,用于驱动 i8080/M6800 并口彩屏(数据脚 P2[7:0]/P0[7:0],控制脚 RS/RD/WR 等),并不包含 SPI 接口的 ILI9341 驱动方法。您用的是软件模拟 SPI(P1.0~P1.5 逐位翻转),这不是走片内 LCM 硬件接口,而是纯 I/O 模拟时序——因此手册 TFT 章节对您的场景不直接适用,您的驱动逻辑需要靠自己保证 SPI 时序正确。

这一点可从手册 TFT 章节确认:Ai8051U 的 LCM 接口支持 i8080 和 M6800,数据宽度 8/16 位,控制脚可按 LCMIFCPS[1:0] 选择 P4.x 或 P3.x——没有提供 SPI 模式。您走软件 SPI 是正确的做法,但需要自己确保时序。


二、"只显示几行、其余花屏"的常见原因分析

这种现象在 ILI9341 驱动中,通常指向初始化序列不完整或显示区域/像素格式配置错误。结合您贴出的初始化代码(被截断),重点排查以下几处:

原因 1:初始化命令序列不完整(最可能)

ILI9341 初始化有严格的命令顺序,遗漏关键命令会导致花屏或局部显示。您贴出的代码已包含:

  • 软件复位 0x01
  • 电源控制 C0/C1/C5/C7
  • 帧率/时序控制 B1/B6
  • (后续 0x3A、0x36、0x29 等命令被截断)

最关键的几处容易遗漏:

  • 0x3A(像素格式 Pixel Format Set):必须设置为 0x55(16位色)。若未设置或设为其他值(如 12/18 位),颜色数据解析错乱会导致花屏。
  • 0x20(Display Inversion OFF)/ 0x21(ON):ILI9341 部分屏默认反白,需正确设置反色指令。
  • 0x29(Display ON,开显示):初始化末尾必须开显示,否则只显示空白。
  • 0x11(Sleep Out,退出睡眠):软件复位后必须发 0x11 并延时,再继续后续初始化。
  • 0x2A / 0x2B(Column/Page Address Set):设置显示窗口范围。

建议:对照 STC 官方 ILI9341 例程的完整初始化序列逐条核对。Ai8051U DEMO-CODE 中有「37.1-2.4寸ILI9341驱动TFT显示屏实验程序」(见 F2T33 相关,论坛 Thread-21691),是官方实屏验证过的。先用官方例程把屏点亮,再做您自己的软件 SPI 改造,是最稳妥的路径。

辩证提醒:您的初始化序列可能是从网上通用代码抄的,但不同批次/厂家的 ILI9341 屏对命令敏感度略有差异。务必以官方例程为准。

原因 2:显示窗口(Column/Page Address)范围设置不当

"只显示局部几行"常见于 0x2A/0x2B 的窗口坐标范围设置错误或扫描方向不对。ILI9341 是 240×320,需确认:

  • 0x2A 设为 X=0~239(0x00,0x00,0x00,0xEF)
  • 0x2B 设为 Y=0~319(0x00,0x00,0x01,0x3F)

若起始偏移不对,就会出现只有部分区域显示、其余花屏/空白。

原因 3:扫描方向 MADCTL(0x36)配置

论坛 Thread-86「ILI9341_扫描顺序」正是讨论 0x36(Memory Access Control)对显示方向的影响。0x36 的 MY/MX/MV/ML/BGR 位设置错误会导致显示错位、颠倒、局部正常。

原因 4:软件 SPI 时序问题(需检查)

您的软件 SPI 是高位在前(for(j=0x80; j; j>>=1)),逻辑正确。但要注意:

  • SCLK 空闲电平与采样边沿:ILI9341 通常要求 **CPOL=0(空闲低)、CPHA=0(第一个边沿采样)**。您的代码 SCLK 空闲为 0,先设 MOSI 再拉高 SCLK,符合模式 0,基本正确。
  • CS(片选)时序:注意 Lcd_Cmd/Lcd_Data 中 CS 每次拉低又拉高。若在"命令+数据"连续传输中 CS 被拉高,会打断传输。ILI9341 的命令写通常要求 CS 全程保持低直到命令+参数写完。
  • DC(数据/命令)切换时机:DC 必须在数据建立前稳定,且 CS 拉低期间不能切换错。

原因 5:I/O 口模式配置(手册依据)

根据 Ai8051U 手册「14 I/O口」章节,PnM0/PnM1 四种模式中,**推挽输出(PnM0=1, PnM1=0)适合作为 SPI 信号输出,驱动能力强**。您 Gpio_init 里 P1M0=0xff, P1M1=0x00 把 P1 全部配成推挽输出,这是**正确**的(论坛 Thread-11892 也强调硬件 SPI 输出要设推挽)。

不过要留意:P1.2(MISO)若是只读不用的,推挽输出无碍,但若屏的 MISO 是输入到单片机的,应配成高阻输入。您的 SPI 是单向写屏,可不用 MISO。

原因 6:延时函数依赖时钟频率,可能不准确

您的 Delay(unsigned long t) 用 _nop_ 空循环,强烈依赖 CPU 主频。ILI9341 初始化里有多处对时序敏感的延时(复位后延时、0x11 后延时等)。若主频与网上样例不一致,延时不足会导致某些屏初始化失败、花屏。建议改用定时器做精确延时,或先确认主频与样例一致。


三、给楼主的落地排查步骤

步骤 操作 针对问题
1 先用官方 AI8051U ILI9341 例程把屏点亮(确认硬件接线正确) 隔离"屏/接线"问题
2 核对初始化序列,补全 0x11、0x3A(0x55)、0x20/0x21、0x29 花屏主因
3 核对0x2A/0x2B 窗口范围=240×320 及起始偏移 只显示局部
4 核对0x36 MADCTL 扫描方向 显示错位
5 检查CS 时序:命令+数据全程保持 CS 拉低 传输中断
6 确认P1 推挽输出已配置(您已做对) 信号驱动
7 用定时器精确延时替代 _nop_ 粗略延时 时序敏感

四、信息来源说明

  • 帖子内容:STC 论坛 Thread-25338(楼主 1324***),描述"只显示几行、其余花屏"并附视频;当前帖子内容因过长被截断,我只读到初始化序列的前半部分(复位、电源控制、帧率控制)。
  • 手册依据:
    • Ai8051U 手册「33 TFT彩屏接口接口(8/16位i8080/M6800接口)」——确认 Ai8051U 片内 LCM 接口为 i8080/M6800 并口,无 SPI 模式;
    • Ai8051U 手册「14 I/O口」——PnM0/PnM1 四种模式配置,推挽输出适用于 SPI 信号。
  • 论坛参考(据论坛用户反馈):
    • Thread-21691「AI8051U 试验箱 2.4寸ILI9341 例程点不亮」——官方例程路径及供电排查;
    • Thread-11936「320×240 ILI9341 屏驱动不成功」——并口移植需按手册切换功能脚、不能随意改引脚;
    • Thread-11892「ST7735S 软件SPI正常、硬件SPI花屏」——SPI 输出设推挽、速度过快等因素。
  • 需说明:关于"0x3A 像素格式、0x36 扫描方向、0x11/0x29 等具体初始化命令及 CS 时序"的分析,是基于 ILI9341 驱动芯片通用初始化规范及论坛同类案例的通用排查方向;Ai8051U 手册中并未列出 ILI9341 的每一条初始化命令细节(手册 TFT 章节只介绍 i8080/M6800 并口硬件接口)。具体初始化序列请以 **STC 官方 ILI9341 例程(AI8051U DEMO-CODE)**或 ILI9341 芯片 datasheet 为准。

如果您愿意把完整的 Lcd_Init 函数贴出来(当前帖子内容被截断,我看不到 0xB6 之后到结尾的全部命令),或者告诉我您用的是官方例程还是完全自写的初始化序列,我可以帮您逐条核对,判断具体是哪一条命令缺失或错误导致花屏。需要的话请补充完整代码。


🔍 搜索 "https://www.stcaimcu.com/thread-25338-1-1.html"

⏱️ 查找用时 22.2s | 总回答用时 42.1s

回复

使用道具 举报 送花

已绑定手机

14

主题

83

回帖

700

积分

高级会员

积分
700
 楼主| 发表于 2026-8-20 14:05:36 | 显示全部楼层
照AI的建议改了一下代码,但故障依旧
  1. #include<AI8051U.h>
  2. sbit SCLK=P1^0;
  3. sbit MOSI=P1^1;
  4. sbit MISO=P1^2;
  5. sbit CS=P1^3;
  6. sbit RES=P1^4;
  7. sbit DC=P1^5;
  8. void Delay(unsigned long int t) { while(--t){_nop_();} }
  9. void Gpio_init(void)
  10. {
  11. P0M0=0x00;P0M1=0x00;
  12. P1M0=0xff;P1M1=0x00;
  13. P2M0=0x00;P2M1=0x00;
  14. P3M0=0x00;P3M1=0x00;
  15. P4M0=0x00;P4M1=0x00;
  16. P5M0=0x00;P5M1=0x00;
  17. }
  18. void SpiSendBit(bit dat)
  19. {
  20.     MOSI = dat;
  21.     SCLK = 1;
  22.     _nop_(); _nop_(); _nop_();
  23.     SCLK = 0;
  24. }
  25. void SpiSendByte(unsigned char dat)
  26. {
  27.     unsigned char j;
  28.     for(j=0x80; j; j>>=1)
  29.           {
  30.         SpiSendBit(dat & j);
  31.           }
  32. }
  33. void Lcd_Cmd(unsigned char cmd)
  34. {
  35.     CS = 0;
  36.     DC = 0;
  37.     SpiSendByte(cmd);
  38.     CS = 1;
  39. }
  40. void Lcd_Cmd_Ncs(unsigned char cmd)
  41. {
  42.     DC = 0;
  43.     SpiSendByte(cmd);
  44. }
  45. void Lcd_Data(unsigned char dat)
  46. {
  47.     CS = 0;
  48.     DC = 1;
  49.     SpiSendByte(dat);
  50.     CS = 1;
  51. }
  52. void Lcd_Data_Ncs(unsigned char dat)
  53. {
  54.     DC = 1;
  55.     SpiSendByte(dat);
  56. }
  57. void Lcd_Init(void)
  58. {
  59.           RES = 0;
  60.                 Delay(50000);
  61.                 RES = 1;
  62.                 Delay(1000000);
  63.     /* ---- 1. 软件复位 ---- */
  64.     Lcd_Cmd(0x01);      // Software Reset
  65.     Delay(70000);      // 复位后延时等待
  66.     /* ---- 2. 电源控制 ---- */
  67.     Lcd_Cmd(0xC0);      // Power Control 1
  68.     Lcd_Data(0x21);     // VRH[5:0] = 21h(参考命令表默认)
  69.     Lcd_Cmd(0xC1);      // Power Control 2
  70.     Lcd_Data(0x10);     // BT[2:0] = 0(命令表默认 10h)
  71.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  72.                 CS=0;
  73.     Lcd_Cmd_Ncs(0xC5);      // VCOM Control 1
  74.     Lcd_Data_Ncs(0x31);     // VMH[6:0] = 31h
  75.     Lcd_Data_Ncs(0x3C);     // VML[6:0] = 3Ch
  76.                 CS=1;
  77.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  78.     Lcd_Cmd(0xC7);      // VCOM Control 2
  79.     Lcd_Data(0xC0);     // nVM=1, VMF 参考命令表
  80.     /* ---- 3. 时序 / 帧率控制 ---- */
  81.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  82.                 CS=0;
  83.     Lcd_Cmd_Ncs(0xB1);      // Frame Control (Normal Mode)
  84.     Lcd_Data_Ncs(0x00);     // DIVA[1:0] = 00
  85.     Lcd_Data_Ncs(0x1B);                // RTNA[4:0] = 1Bh
  86.                 CS=1;
  87.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  88.     CS=0;
  89.     Lcd_Cmd_Ncs(0xB6);      // Display Function Control
  90.     Lcd_Data_Ncs(0x0A);     // PTG[1:0]=00, PT[1:0]=10
  91.     Lcd_Data_Ncs(0x82);     // REV=1, GS=0, SS=0, SM=0, ISC=0010
  92.     Lcd_Data_Ncs(0x27);     // NL[5:0] = 27h(240行)
  93.     Lcd_Data_Ncs(0x04);     // PCDIV[5:0] = 04
  94.                 CS=1;
  95.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  96.     /* ---- 4. 像素格式设定 ---- */
  97.     Lcd_Cmd(0x3A);      // Pixel Format Set
  98.     Lcd_Data(0x55);     // DPI=110(16bit), DBI=110(16bit) -> RGB565
  99.     /* ---- 5. 内存访问控制(显示方向 / RGB顺序)---- */
  100.     Lcd_Cmd(0x36);      // Memory Access Control
  101.     Lcd_Data(0x00);     // MY=0,MX=0,MV=0,ML=0,BGR=0,MH=0
  102.                         // 如需调整方向或 BGR 顺序,改此字节即可
  103.     /* ---- 6. 正负伽马校正 ---- */
  104.     // Positive Gamma Correction
  105.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  106.                 CS=0;
  107.     Lcd_Cmd_Ncs(0xE0);
  108.     Lcd_Data_Ncs(0x0F); Lcd_Data_Ncs(0x16); Lcd_Data_Ncs(0x14);
  109.     Lcd_Data_Ncs(0x0A); Lcd_Data_Ncs(0x0D); Lcd_Data_Ncs(0x06);
  110.     Lcd_Data_Ncs(0x43); Lcd_Data_Ncs(0x75); Lcd_Data_Ncs(0x33);
  111.     Lcd_Data_Ncs(0x06); Lcd_Data_Ncs(0x0E); Lcd_Data_Ncs(0x00);
  112.     Lcd_Data_Ncs(0x0C); Lcd_Data_Ncs(0x09); Lcd_Data_Ncs(0x08);
  113.                 CS=1;
  114.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  115.                 CS=0;
  116.     // Negative Gamma Correction
  117.     Lcd_Cmd_Ncs(0xE1);
  118.     Lcd_Data_Ncs(0x08); Lcd_Data_Ncs(0x2B); Lcd_Data_Ncs(0x2D);
  119.     Lcd_Data_Ncs(0x04); Lcd_Data_Ncs(0x10); Lcd_Data_Ncs(0x04);
  120.     Lcd_Data_Ncs(0x3E); Lcd_Data_Ncs(0x24); Lcd_Data_Ncs(0x4E);
  121.     Lcd_Data_Ncs(0x04); Lcd_Data_Ncs(0x0F); Lcd_Data_Ncs(0x0E);
  122.     Lcd_Data_Ncs(0x35); Lcd_Data_Ncs(0x38); Lcd_Data_Ncs(0x0F);
  123.                 CS=1;
  124.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  125.     /* ---- 7. 退出睡眠,开启显示 ---- */
  126.     Lcd_Cmd(0x11);      // Sleep OUT
  127.     Delay(1000000);      // 退出睡眠后需延时
  128.     Lcd_Cmd(0x29);      // Display ON
  129. }
  130. /* 全屏显示 RGB565 图片(240x320),高字节在前,一维数组 */
  131. void Display(const unsigned char img[])
  132. {
  133.     unsigned long i;
  134.     /* 设置全屏写入窗口 */
  135.           CS=0;
  136.     Lcd_Cmd_Ncs(0x2A);              /* Column Address Set */
  137.     Lcd_Data_Ncs(0x00); Lcd_Data_Ncs(0x00);   /* SC = 0 */
  138.     Lcd_Data_Ncs(0x00); Lcd_Data_Ncs(0xEF);   /* EC = 239 */
  139.                 CS=1;
  140.           _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  141.           CS=0;
  142.     Lcd_Cmd_Ncs(0x2B);              /* Page Address Set */
  143.     Lcd_Data_Ncs(0x00); Lcd_Data_Ncs(0x00);   /* SP = 0 */
  144.     Lcd_Data_Ncs(0x01); Lcd_Data_Ncs(0x3F);   /* EP = 319 */
  145.                 CS=1;
  146.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  147.                 CS=0;
  148.     Lcd_Cmd_Ncs(0x2C);              /* Memory Write */
  149.                
  150.     for (i = 0; i < 240 * 320; i++)
  151.     {
  152.         Lcd_Data_Ncs(img[i * 2]);       /* 高字节 */
  153.         Lcd_Data_Ncs(img[i * 2 + 1]);   /* 低字节 */
  154.     }
  155.                 CS=1;
  156. }
  157. void Test(void)
  158. {
  159.     unsigned long i;
  160.     /* 设置全屏写入窗口 */
  161.           CS=0;
  162.     Lcd_Cmd_Ncs(0x2A);              /* Column Address Set */
  163.     Lcd_Data_Ncs(0x00); Lcd_Data_Ncs(0x00);   /* SC = 0 */
  164.     Lcd_Data_Ncs(0x00); Lcd_Data_Ncs(0xEF);   /* EC = 239 */
  165.                 CS=1;
  166.           _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  167.           CS=0;
  168.     Lcd_Cmd_Ncs(0x2B);              /* Page Address Set */
  169.     Lcd_Data_Ncs(0x00); Lcd_Data_Ncs(0x00);   /* SP = 0 */
  170.     Lcd_Data_Ncs(0x01); Lcd_Data_Ncs(0x3F);   /* EP = 319 */
  171.                 CS=1;
  172.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  173.                 CS=0;
  174.     Lcd_Cmd_Ncs(0x2C);              /* Memory Write */
  175.    
  176.     for (i = 0; i < 240 * 320 * 2; i++)
  177.     {
  178.                         if(i<240*320)
  179.                         {
  180.                         Lcd_Data_Ncs(0xff);
  181.                         }
  182.                         else
  183.                         {
  184.                         Lcd_Data_Ncs(0x00);
  185.                         }
  186.     }
  187.                 CS=1;
  188. }
  189. void main()
  190. {
  191. WDT_CONTR = 0x00;
  192. Gpio_init();
  193. Lcd_Init();
  194. Test();
  195. while(1);
  196. }
复制代码
回复

使用道具 举报 送花

已绑定手机

14

主题

83

回帖

700

积分

高级会员

积分
700
 楼主| 发表于 2026-8-20 14:07:01 | 显示全部楼层
1324*** 发表于 2026-8-20 14:05
照AI的建议改了一下代码,但故障依旧

我把cs在传数据时始终拉低,但是故障还是没有解决
回复

使用道具 举报 送花

已绑定手机

14

主题

83

回帖

700

积分

高级会员

积分
700
 楼主| 发表于 2026-8-20 14:36:30 | 显示全部楼层
纯色测试:
  1. #include<AI8051U.h>
  2. sbit SCLK=P1^0;
  3. sbit MOSI=P1^1;
  4. sbit MISO=P1^2;
  5. sbit CS=P1^3;
  6. sbit RES=P1^4;
  7. sbit DC=P1^5;
  8. void Delay(unsigned long int t) { while(--t){_nop_();} }
  9. void Gpio_init(void)
  10. {
  11. P0M0=0x00;P0M1=0x00;
  12. P1M0=0xff;P1M1=0x00;
  13. P2M0=0x00;P2M1=0x00;
  14. P3M0=0x00;P3M1=0x00;
  15. P4M0=0x00;P4M1=0x00;
  16. P5M0=0x00;P5M1=0x00;
  17. }
  18. void SpiSendBit(bit dat)
  19. {
  20.     MOSI = dat;
  21.     SCLK = 1;
  22.     _nop_(); _nop_(); _nop_();
  23.     SCLK = 0;
  24. }
  25. void SpiSendByte(unsigned char dat)
  26. {
  27.     unsigned char j;
  28.     for(j=0x80; j; j>>=1)
  29.           {
  30.         SpiSendBit(dat & j);
  31.           }
  32. }
  33. void Lcd_Cmd(unsigned char cmd)
  34. {
  35.     CS = 0;
  36.     DC = 0;
  37.     SpiSendByte(cmd);
  38.     CS = 1;
  39. }
  40. void Lcd_Cmd_Ncs(unsigned char cmd)
  41. {
  42.     DC = 0;
  43.     SpiSendByte(cmd);
  44. }
  45. void Lcd_Data(unsigned char dat)
  46. {
  47.     CS = 0;
  48.     DC = 1;
  49.     SpiSendByte(dat);
  50.     CS = 1;
  51. }
  52. void Lcd_Data_Ncs(unsigned char dat)
  53. {
  54.     DC = 1;
  55.     SpiSendByte(dat);
  56. }
  57. void Lcd_Init(void)
  58. {
  59.           RES = 0;
  60.                 Delay(50000);
  61.                 RES = 1;
  62.                 Delay(1000000);
  63.     /* ---- 1. 软件复位 ---- */
  64.     Lcd_Cmd(0x01);      // Software Reset
  65.     Delay(70000);      // 复位后延时等待
  66.                
  67.           /* ---- 7. 退出睡眠,开启显示 ---- */
  68.     Lcd_Cmd(0x11);      // Sleep OUT
  69.     Delay(1000000);      // 退出睡眠后需延时
  70.     /* ---- 2. 电源控制 ---- */
  71.     Lcd_Cmd(0xC0);      // Power Control 1
  72.     Lcd_Data(0x21);     // VRH[5:0] = 21h(参考命令表默认)
  73.     Lcd_Cmd(0xC1);      // Power Control 2
  74.     Lcd_Data(0x10);     // BT[2:0] = 0(命令表默认 10h)
  75.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  76.                 CS=0;
  77.     Lcd_Cmd_Ncs(0xC5);      // VCOM Control 1
  78.     Lcd_Data_Ncs(0x31);     // VMH[6:0] = 31h
  79.     Lcd_Data_Ncs(0x3C);     // VML[6:0] = 3Ch
  80.                 CS=1;
  81.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  82.     Lcd_Cmd(0xC7);      // VCOM Control 2
  83.     Lcd_Data(0xC0);     // nVM=1, VMF 参考命令表
  84.     /* ---- 3. 时序 / 帧率控制 ---- */
  85.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  86.                 CS=0;
  87.     Lcd_Cmd_Ncs(0xB1);      // Frame Control (Normal Mode)
  88.     Lcd_Data_Ncs(0x00);     // DIVA[1:0] = 00
  89.     Lcd_Data_Ncs(0x1B);                // RTNA[4:0] = 1Bh
  90.                 CS=1;
  91.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  92.     CS=0;
  93.     Lcd_Cmd_Ncs(0xB6);      // Display Function Control
  94.     Lcd_Data_Ncs(0x0A);     // PTG[1:0]=00, PT[1:0]=10
  95.     Lcd_Data_Ncs(0x82);     // REV=1, GS=0, SS=0, SM=0, ISC=0010
  96.     Lcd_Data_Ncs(0x27);     // NL[5:0] = 27h(240行)
  97.     Lcd_Data_Ncs(0x04);     // PCDIV[5:0] = 04
  98.                 CS=1;
  99.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  100.     /* ---- 4. 像素格式设定 ---- */
  101.     Lcd_Cmd(0x3A);      // Pixel Format Set
  102.     Lcd_Data(0x55);     // DPI=110(16bit), DBI=110(16bit) -> RGB565
  103.     /* ---- 5. 内存访问控制(显示方向 / RGB顺序)---- */
  104.     Lcd_Cmd(0x36);      // Memory Access Control
  105.     Lcd_Data(0x00);     // MY=0,MX=0,MV=0,ML=0,BGR=0,MH=0
  106.                         // 如需调整方向或 BGR 顺序,改此字节即可
  107.     /* ---- 6. 正负伽马校正 ---- */
  108.     // Positive Gamma Correction
  109.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  110.                 CS=0;
  111.     Lcd_Cmd_Ncs(0xE0);
  112.     Lcd_Data_Ncs(0x0F); Lcd_Data_Ncs(0x16); Lcd_Data_Ncs(0x14);
  113.     Lcd_Data_Ncs(0x0A); Lcd_Data_Ncs(0x0D); Lcd_Data_Ncs(0x06);
  114.     Lcd_Data_Ncs(0x43); Lcd_Data_Ncs(0x75); Lcd_Data_Ncs(0x33);
  115.     Lcd_Data_Ncs(0x06); Lcd_Data_Ncs(0x0E); Lcd_Data_Ncs(0x00);
  116.     Lcd_Data_Ncs(0x0C); Lcd_Data_Ncs(0x09); Lcd_Data_Ncs(0x08);
  117.                 CS=1;
  118.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  119.                 CS=0;
  120.     // Negative Gamma Correction
  121.     Lcd_Cmd_Ncs(0xE1);
  122.     Lcd_Data_Ncs(0x08); Lcd_Data_Ncs(0x2B); Lcd_Data_Ncs(0x2D);
  123.     Lcd_Data_Ncs(0x04); Lcd_Data_Ncs(0x10); Lcd_Data_Ncs(0x04);
  124.     Lcd_Data_Ncs(0x3E); Lcd_Data_Ncs(0x24); Lcd_Data_Ncs(0x4E);
  125.     Lcd_Data_Ncs(0x04); Lcd_Data_Ncs(0x0F); Lcd_Data_Ncs(0x0E);
  126.     Lcd_Data_Ncs(0x35); Lcd_Data_Ncs(0x38); Lcd_Data_Ncs(0x0F);
  127.                 CS=1;
  128.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  129.     Lcd_Cmd(0x29);      // Display ON
  130. }
  131. /* 全屏显示 RGB565 图片(240x320),高字节在前,一维数组 */
  132. void Display(const unsigned char img[])
  133. {
  134.     unsigned long i;
  135.     /* 设置全屏写入窗口 */
  136.           CS=0;
  137.     Lcd_Cmd_Ncs(0x2A);              /* Column Address Set */
  138.     Lcd_Data_Ncs(0x00); Lcd_Data_Ncs(0x00);   /* SC = 0 */
  139.     Lcd_Data_Ncs(0x00); Lcd_Data_Ncs(0xEF);   /* EC = 239 */
  140.                 CS=1;
  141.           _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  142.           CS=0;
  143.     Lcd_Cmd_Ncs(0x2B);              /* Page Address Set */
  144.     Lcd_Data_Ncs(0x00); Lcd_Data_Ncs(0x00);   /* SP = 0 */
  145.     Lcd_Data_Ncs(0x01); Lcd_Data_Ncs(0x3F);   /* EP = 319 */
  146.                 CS=1;
  147.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  148.                 CS=0;
  149.     Lcd_Cmd_Ncs(0x2C);              /* Memory Write */
  150.                
  151.     for (i = 0; i < 240 * 320; i++)
  152.     {
  153.         Lcd_Data_Ncs(img[i * 2]);       /* 高字节 */
  154.         Lcd_Data_Ncs(img[i * 2 + 1]);   /* 低字节 */
  155.     }
  156.                 CS=1;
  157. }
  158. void Test(void)
  159. {
  160.     unsigned long i;
  161.     /* 设置全屏写入窗口 */
  162.           CS=0;
  163.     Lcd_Cmd_Ncs(0x2A);              /* Column Address Set */
  164.     Lcd_Data_Ncs(0x00); Lcd_Data_Ncs(0x00);   /* SC = 0 */
  165.     Lcd_Data_Ncs(0x00); Lcd_Data_Ncs(0xEF);   /* EC = 239 */
  166.                 CS=1;
  167.           _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  168.           CS=0;
  169.     Lcd_Cmd_Ncs(0x2B);              /* Page Address Set */
  170.     Lcd_Data_Ncs(0x00); Lcd_Data_Ncs(0x00);   /* SP = 0 */
  171.     Lcd_Data_Ncs(0x01); Lcd_Data_Ncs(0x3F);   /* EP = 319 */
  172.                 CS=1;
  173.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  174.                 CS=0;
  175.     Lcd_Cmd_Ncs(0x2C);              /* Memory Write */
  176.    
  177.     for (i = 0; i < 240 * 320; i++)
  178.     {
  179.                 Lcd_Data_Ncs(0xf8);
  180.                 Lcd_Data_Ncs(0x00);
  181.     }
  182.                 CS=1;
  183. }
  184. void main()
  185. {
  186. WDT_CONTR = 0x00;
  187. Gpio_init();
  188. Lcd_Init();
  189. Test();
  190. while(1);
  191. }
复制代码
回复

使用道具 举报 送花

已绑定手机

14

主题

83

回帖

700

积分

高级会员

积分
700
 楼主| 发表于 2026-8-20 14:41:53 | 显示全部楼层

[url=]1787207976494.jpg[/url]
1787207976494.jpg
回复

使用道具 举报 送花

已绑定手机

14

主题

83

回帖

700

积分

高级会员

积分
700
 楼主| 发表于 2026-8-20 14:44:26 | 显示全部楼层

屏幕下半边是白色,看起来蓝是相机问题,也是只能显示一条,且颜色不对
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-9 04:33 , Processed in 0.079380 second(s), 85 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表