找回密码
 立即注册
楼主: 浦江一水

基于AI8051U_V1.2实验箱_学习实验之驱动TFT彩屏显示全屏图片(QSPI_DMA_P2P)(已优化)

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:202
  • 最近打卡:2026-07-04 17:28:31
已绑定手机

25

主题

2662

回帖

3411

积分

论坛元老

积分
3411
发表于 2026-6-13 12:03:56 | 显示全部楼层
还有个地方:

键盘这样定义:

//键端口定义
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit KEY3 = P2^6;
sbit KEY4 = P2^7;


显示函数中这样调用:

void BrowPICs(void)
{ BYTE loop=1,disp=1;
  nIndex = 0;           //图片索引: 从第一幅图片开始显示
  BrowMode=0;
  while (loop)
  {
   
        
        QSPI2TFT_Start();   //显示一幅图片
        
    k=0;k=GETCH();
    switch(k)
    { case K1S: case K1L: nIndex=nIndex>0?nIndex-1:Fat.dwCount-1;  break;
      case K2S: case K2L: nIndex=nIndex<Fat.dwCount-1?nIndex+1:0;  break;
      case K4S: case K4L: if(k!=0){ loop=0; LCD_CS_PIN=1; } break;
    }
  }
  W25Q_WriteSR2_31(0x02);  //恢复状态字
}


我发现按K1图片刷完还是原来那张(还是原来那张),本来按K3应该没反应的,但K3竟然好像顶替了K1? K4 功能正常?

nIndex = nIndex - 1;        如果当前索引大于0,直接减1?向前移不是+1么?


改成 case K1S: case K1L: nIndex=nIndex>0?nIndex+1:Fat.dwCount-1;  break; 妥否?理论不对,因为


case K2S: case K2L: nIndex=nIndex<Fat.dwCount-1?nIndex+1:0;  break;
     
这里nIndex+1,所以K1应该是nIndex - 1


但为什么刷新后图片没往后1张走?逻辑上是K2往前1张,K1往后1张,我现在是借用P24---P27,也可能AI8051U试验箱P24---P27引脚还和其他部分公用?

点评

这位同学你好! 很抱歉,还没有来得及回复你,又有了新的信息. 由于我暂时没有这接口和规格的显示屏,所以还没能实物运行调试,只是看了看代码.不过为此,已下淘单,不日便到. 这个实验, 要移植到ST7789来显示运行,估计面  详情 回复 发表于 2026-6-14 19:03
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:887
  • 最近打卡:2026-07-05 07:21:25

31

主题

428

回帖

4672

积分

荣誉版主

积分
4672
发表于 2026-6-14 19:03:24 | 显示全部楼层
wuzhe*** 发表于 2026-6-13 12:03
还有个地方:

键盘这样定义:

这位同学你好!
很抱歉,还没有来得及回复你,又有了新的信息.
由于我暂时没有这接口和规格的显示屏,所以还没能实物运行调试,只是看了看代码.不过为此,已下淘单,不日便到.

这个实验, 要移植到ST7789来显示运行,估计面临几个问题:
1, ST7789是SPI串口屏,原官方程序是针对并口屏的. 从理论上说显示速度应该减慢, 若移植成功,不知显示效果是否会打折扣.
2, 实验箱的SPI串口屏接口与独立键接口定义冲突,看到你用P2.4/5/6/7代替,应该还需要外接跳线等,别人就不方便实验了,建议你转向用实验箱上已有的4*2矩阵键盘来操作,方便别人实验.
3, 程序使用AiCube代码库,打量宏定义有较大的不同,要有一个熟悉的过程,代码量较大些.

最新得悉,你的程序已经实现浏览和动画显示,很好呀,祝贺你移植实验成功. 方便的话,拍一个视频,看看效果如何.
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:202
  • 最近打卡:2026-07-04 17:28:31
已绑定手机

25

主题

2662

回帖

3411

积分

论坛元老

积分
3411
发表于 2026-6-15 12:26:36 | 显示全部楼层
好的好的,我把视频放上来:

说明一下键盘:

20---P27  我们这样用: P20---P23 外接3个LED ,调试时候用, P04---P07 定义为按键  (我手头买了几块4个开关的独立按键模块)


#ifndef _KEY4_IO_H_
#define _KEY4_IO_H_

//键端口定义
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit KEY3 = P2^6;
sbit KEY4 = P2^7;

我一直没有上传过视频,我发现传递完视频文件,好像点击播放有问题.............




动画.mp4

84.01 MB, 下载次数: 4

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:202
  • 最近打卡:2026-07-04 17:28:31
已绑定手机

25

主题

2662

回帖

3411

积分

论坛元老

积分
3411
发表于 2026-6-15 12:36:22 | 显示全部楼层
2个文件分开放:


还有很多问题,应该是读取数据或者传输数据的过程有问题

起码时序调整有问题,这个实验本身难度较大,很多底层的东西我没有搞懂,所以把控不住

经常出现稍微调整一下,整个系统就不启动,黑屏..................

当然本身就是新技术,还靠浦江老师带领我们慢慢学习..............再一次感谢浦江一水老师的无私奉献。

浏览.mp4

102.37 MB, 下载次数: 6

点评

这位同学你好! 你太客气了,多次以"老师"相称呼,其实我是个AI8051单片机新手,实在不敢当的. 视频看到了,也有了进一步的了解,在此聊聊我的感觉: 首先是你选用的彩屏,这是一个7针的ST7789屏,而实验箱接口是8针的,看似兼  详情 回复 发表于 2026-6-15 19:22
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:887
  • 最近打卡:2026-07-05 07:21:25

31

主题

428

回帖

4672

积分

荣誉版主

积分
4672
发表于 2026-6-15 19:22:00 | 显示全部楼层
wuzhe*** 发表于 2026-6-15 12:36
2个文件分开放:

这位同学你好!
你太客气了,多次以"老师"相称呼,其实我是个AI8051单片机新手,实在不敢当的.
视频看到了,也有了进一步的了解,在此聊聊我的感觉:
首先是你选用的彩屏,这是一个7针的ST7789屏,而实验箱接口是8针的,看似兼容,其实不然.
实验箱接口定义第7脚是CS(片选), 现用屏的第7脚是BL(背光),是一种无CS脚常选通的屏.
看你的源程序,并没有为此做特别处理,所以引发黑屏现象估计是原因之一.
程序中CS的常态是高电平,正好给屏提供了背光电源, 所以屏是能点亮的.
而在程序的某些地方,当CS为低电平时,就失去背光供电电源,那就黑屏了.
因此说,这个屏虽然能点亮,但不是完全匹配这个例程的要求.
原程序中是以CS=1来切断对屏的控制, 避免外界杂波对屏的干扰.
故而我也因此特地去淘了一块8针的ST7789屏,来做这个实验.8针屏的第7脚是CS(片选),第8脚是BL(背光),实验箱此接口第8脚是SYS_VCC,就是常供电的,CS也是对应有用的.
如果你暂时还用这7针的屏来实验. 那么在程序中可稍加修改,将P3.5定义为LCD_BL_PIN,让它始终LCD_BL_PIN=1,常供电.并注释掉所有原
LCD_CS_PIN=0或=1的语句, 你再试试看,是否有所改变? 常选通的屏,很难确保不被干扰,特别是DMA_P2P这样有自动在背后传输的例程.

这个例程改用SPI的串口屏.从理论上讲,动画效果是不及原并口屏的. 若追求显示动画效果,这个移植改变意义并不大.
但是,对于这个例程中的多个知识点,QSPI读写Flash、CDC通讯、学习AI8051U单片机的DMA_P2P的编程技术, 是非常有意义的.

上下键翻页, 若觉得跳页, 等待按键GETCH()后要适当加延时,试试看.
(源程序Menu_Calls中第162行,K2S键处理行后漏了一个break)

再次回车进入死机,多半原因是,QSPI存储器状态寄存器发生变化,读取数据时死等待.可在再次进入前,先检查一下状态字看,(系统维护中显示的三字节)。

尚存其它问题(如显示色彩失控等),慢慢再聊……。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:202
  • 最近打卡:2026-07-04 17:28:31
已绑定手机

25

主题

2662

回帖

3411

积分

论坛元老

积分
3411
发表于 2026-6-16 17:24:07 | 显示全部楼层
感谢浦江老师:



我选用的彩屏,的确是一个7针的ST7789屏,而实验箱接口是8针的,我根本就没仔细研究这点,觉得是无法少个8脚背光,前面7个脚兼容,原来:
“实验箱接口定义第7脚是CS(片选), 现用屏的第7脚是BL(背光),是一种无CS脚常选通的屏”,这个信息就很震撼,CS脚不给QSPI控制,自然问题多多..........
看你的源程序,并没有为此做特别处理,所以引发黑屏现象估计是原因之一.
程序中CS的常态是高电平,正好给屏提供了背光电源, 所以屏是能点亮的.
而在程序的某些地方,当CS为低电平时,就失去背光供电电源,那就黑屏了.
因此说,这个屏虽然能点亮,但不是完全匹配这个例程的要求.
原程序中是以CS=1来切断对屏的控制, 避免外界杂波对屏的干扰.

那么为了真正搞懂,我也要去淘了一块8针的ST7789屏,来做这个实验.8针屏的第7脚是CS(片选),第8脚是BL(背光),实验箱此接口第8脚是SYS_VCC,就是常供电的,CS也是对应有用的.把8脚的屏买回来,慢慢研究!搞通了8脚的,再看看---这7针的屏来是怎么在程序中

“可稍加修改-------恐怕也是在真理解的基础上才能做到!,将P3.5定义为LCD_BL_PIN,让它始终LCD_BL_PIN=1,常供电.并注释掉所有原LCD_CS_PIN=0或=1的语句, 你再试试看,是否有所改变? 常选通的屏,很难确保不被干扰,特别是DMA_P2P这样有自动在背后传输的原来,真的想搞明白,就要这样慢慢死磕......................

刚才查了一下CS,原来:


/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{
    P_LCD_CS = 0;
    LCD_SendByte(dat);
    P_LCD_CS = 1;
}

好像设置QSPI 的时候,CS还是SS是要交给硬件控制才能成功P2P 桥接 的,反正没有CS脚的屏,应该是够呛............

这个错误反应出我学习过程还是不求甚解,很粗...程序这样都能跑起来,纯粹是老天眷顾,要反省!!!

难得遇到浦江老师这样热心、耐心的指导,在一次感谢!!!


其实您这个程序,就是原来LCM并口的,是个非常值得仔细学习的范例,STC的芯片,能做到这个水平,也是让很多人掉眼镜的,特别是我们这些业余选手,看到显示效果,开始蛮佩服的!

点评

这位同学你好! 你的谦虚和务实钻研精神是要向你学习的。 此前我做这个实验时,没考虑改用SPI串口屏来实现DMA_P2P动画显示,是你先行了一步。 为了学习和可与你交流这方面知识点,特地淘了一个8脚的ST7789屏,这几天  详情 回复 发表于 2026-6-19 11:05
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:887
  • 最近打卡:2026-07-05 07:21:25

31

主题

428

回帖

4672

积分

荣誉版主

积分
4672
发表于 2026-6-19 11:05:22 | 显示全部楼层

这位同学你好!
你的谦虚和务实钻研精神是要向你学习的。

此前我做这个实验时,没考虑改用SPI串口屏来实现DMA_P2P动画显示,是你先行了一步。
为了学习和可与你交流这方面知识点,特地淘了一个8脚的ST7789屏,这几天初步体验了一下。

我考虑是分三步走的:
第一步:建立基本的ST7789驱动,实现一些常用基本的显示功能。
        这次实验启用了实验箱4*2矩阵键盘,避免屏接口与原独立键的复用冲突。
        这第一步很重要,也是很实用(以便做其它实验),是必须做的。
第二步:实现DMA_P2P功能,从QSPI_Flash读取数据到ST7789显示屏,实验单幅和动画显示。
第三步:加入USB_CDC通讯,实现不断电切换刷新图片的功能。(这一功能本身是有些问题的,以后再谈论)

分布走的好处是可避免当多个问题同时出现,难以分析调试。尤其是不进行仿真的情况下,往往是无从下手的。


微信图片_20260619105721.jpg

微信图片_20260619105730.jpg

微信图片_20260619105751.jpg

发上实验工程源代吗,供你参考、指正。
QSPI-TFT_DMA_P2P_ST7798_CDC.rar (1.18 MB, 下载次数: 12)
祝你实验顺利愉快。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:202
  • 最近打卡:2026-07-04 17:28:31
已绑定手机

25

主题

2662

回帖

3411

积分

论坛元老

积分
3411
发表于 2026-6-19 14:21:09 | 显示全部楼层
浦江*** 发表于 2026-6-19 11:05
这位同学你好!
你的谦虚和务实钻研精神是要向你学习的。

感激您,浦江一水老师!

   首先佩服您头脑清晰,有把复杂问题简单化的能力,确实,饭要一口一口的吃!

我的8个脚的7789屛也到啦,焊接好之后,马上实验一下,首先是小亮点问题消失!

好像运行的也顺利了点,我再慢慢尝试一下,感觉比7脚的屛清晰很多.............

最麻烦的画面质感问题和闪动竟然消失,细小亮点也消失,TFT彩屏的正常感觉回来了,这一切都源于浦江老师的慧眼,一眼看出我的屛根本没有CS脚..........
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:202
  • 最近打卡:2026-07-04 17:28:31
已绑定手机

25

主题

2662

回帖

3411

积分

论坛元老

积分
3411
发表于 2026-6-19 15:03:42 | 显示全部楼层
接着看了浦江老师您的键盘:



// 键盘映射 4行x2列
const unsigned char keymap[4][2] = {
    {'0', '4', },
    {'1', '5', },
    {'2', '6', },
    {'3', '7', },  
};


确实,利用已经有的试验箱硬件资源,并且可以复习一下矩阵键盘的使用,高招!佩服!

经典的4x4矩阵键盘扫描算法(行扫描法),

P0=0xF0;  // 假设P0的低4位是行线,高4位是列线。0xF0即 1111 0000

if((Row0)&&(Row1)) return 0;  // 无键按下直接返回0



switch(row)    //设置当前行为低
    { case 0: Row0=0;Row1=1;Row2=1;Row3=1; break;
      case 1: Row0=1;Row1=0;Row2=1;Row3=1; break;
      case 2: Row0=1;Row1=1;Row2=0;Row3=1; break;
      case 3: Row0=1;Row1=1;Row2=1;Row3=0; break;
    }
    KeyYS(100); //短暂稳定
        // 检测列线状态,如果列为0,说明该行该列交叉点的按键被按下
    if(Col0==0)KeyCh = keymap[row][0];
    if(Col1==0)KeyCh = keymap[row][1];



循环4次,每次只选中一行(将其置为0)。
匹配:当某一行被置为0时,如果这一行上的某个按键被按下,那么与该按键相连的列线就会被拉低(变成0)。
查表:代码通过 if(Col0==0) 等语句检测哪一列变成了0,一旦检测到,就从预定义的二维数组 keymap[row][col] 中查出对应的键值(如数字'1'、'7'等),并赋值给 KeyCh,自然返回对应按键值!


代码逻辑清晰,很适合刚学习的同好使用!赞一个!

虽然我们的本实验只要2 上翻  3 下翻  7确定  但是这样的程序保证了我们可以随时使用这8个键,不用专门外接键盘,方便很多!!!





回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:202
  • 最近打卡:2026-07-04 17:28:31
已绑定手机

25

主题

2662

回帖

3411

积分

论坛元老

积分
3411
发表于 2026-6-19 17:27:00 | 显示全部楼层
我之前已经用USB_CDC 串口方式把13幅图片文件写入W25Q128 中


然后我检查一下用 Uart 来读取ID 状态字、空检测

功能都正常,不过读取数据,感觉速度不对,也太慢啦:


截图202606191657258729.jpg
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-5 08:03 , Processed in 0.090906 second(s), 86 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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