找回密码
 立即注册
楼主: 孙晓玉

LCM驱动单色点阵屏幕的问题

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:127
  • 最近打卡:2025-08-23 11:38:30
已绑定手机

16

主题

73

回帖

536

积分

高级会员

积分
536
发表于 2025-8-12 17:05:33 | 显示全部楼层

我程序传到10楼了,能帮我分析下原因吗
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:127
  • 最近打卡:2025-08-23 11:38:30
已绑定手机

16

主题

73

回帖

536

积分

高级会员

积分
536
发表于 2025-8-14 10:22:37 | 显示全部楼层
孙*** 发表于 2025-8-12 10:40
[我第一版没有采用LCM+DMA,想一步一步来,这版使用的是LCM驱动LCD160160显示屏。
我分别买了两套擎天柱和 ...

interrupt 13 没有触发的原因已经找到了,原因是LCM的回调触发是interrupt 59,文件里面有个asm的汇编文件,他是把59的中断推到13,因为keil5的中断最大31。
后来梁工指导我了,扩展了Keil5的中断长度,解决了LCM_interrupt 回调的问题。
但是后来发现,虽然LCM_interrupt好是了,数据也能发下去了,但是仍然不能驱动液晶屏显示,我再继续研究。
单片机这个玩意,虽然也是编程,但是需要了解的电气特性要更多,上面的的代码直接可以使用interrupt 59,如下代码:
截图202508141031184379.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:127
  • 最近打卡:2025-08-23 11:38:30
已绑定手机

16

主题

73

回帖

536

积分

高级会员

积分
536
发表于 2025-8-14 11:26:34 | 显示全部楼层
OK LCM驱动液晶的问题,最终解决了,原因如下:
截图202508141110298948.jpg
如图设置LCMIFCFG2的时候,选择引脚的时候,我填写的是 LCMIFCFG2 = 0x19;我误看了LCMIFCPS的位置是从B4开始的,实际上是从B5开始的,因此采用P45 P37 P76的引脚填写的应该是 0x29;
至此通过LCM驱动的LCD160160黑白点阵屏(I8080 uc1698u)就OK了。
下一步,我继续研究LCM+DMA了。
正确的代码如下:

LCM_Test.c

6.33 KB, 下载次数: 1

正确的源程序

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:127
  • 最近打卡:2025-08-23 11:38:30
已绑定手机

16

主题

73

回帖

536

积分

高级会员

积分
536
发表于 2025-8-14 16:25:17 | 显示全部楼层
测试用DMA测试LCM来控制显示屏,期间查询了中断号,如下图:
截图202508141620181179.jpg
看到TFT彩屏 DMA 中断是58,于是我就使用了两个中断,如下图:
截图202508141622073385.jpg
我已经开启LCM_DMA中断
截图202508141624468005.jpg
发现只有59可以被调用,而58没有被调用,程序已经可以正常跑通,也能通过DMA的通道将数据发到P2口,可是为什么58号中断没有执行呢?
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:127
  • 最近打卡:2025-08-23 11:38:30
已绑定手机

16

主题

73

回帖

536

积分

高级会员

积分
536
发表于 5 天前 | 显示全部楼层
换了另一种测试方法,发现中断58和59其实都可以调用的,只是用了printf打印中断58的日志,没有打印出来,可能驱动液晶屏的速度太快了,58和59调用频率太快导致printf函数不能正确响应导致的吧,具体机制不好说,都是在学习当中。
目前DMA_LCM是可以正常使用的,下面我结合文档中,DMA_LCM的寄存变量说明继续一步深挖.
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:127
  • 最近打卡:2025-08-23 11:38:30
已绑定手机

16

主题

73

回帖

536

积分

高级会员

积分
536
发表于 5 天前 | 显示全部楼层
那么最终 DMA + LCM的驱动 LCD160160黑白点阵屏就完成了。目前运行正常,主要步骤也不复杂,如下:
1.讲LCM和DMA分别初始化,理论上先配置好LCM,然后DMA,如程序中LCM_Config、DMA_Config
2.DMA主要有几点注意:
    1)配置读取源,就是从哪里吧液晶显示的数据读出来,都是二进制数组。
    2)配置写出源(如果只是输出到LCD,这条可以不用),这是从液晶显示屏里读取的数据,我们工控LCD显示屏自带芯片和缓存,因此可以读取液晶点阵屏的数据,但是大型的LCD,例如电脑显示器、电视等等他们是不带显存的,他们的显存在显卡或显存芯片里。
    3)将中断标识(DMA_LCM_STA)置为0,标识初始化了。
    4)配置DMA的控制信息(DMA_LCM_CFG),用于DMA_LCM如何发送
    5)配置(DMA_LCM_CR)以何种方式输出到LCD,默认为0,标识初始化后啥也不干。
    如下图就是简单的配置:
    截图202508181342213266.jpg
    6)当配置和初始化都完成后,就可以启动传输了,注意DMA启动后就不需要CPU干涉了,性能就节省出来了。
    截图202508181350267930.jpg
3.DMA的DMA_LCM_Interrupt是的中断号是58,需要安装中断扩展软件,不然就得适应asm汇编,我个人不建议使用asm,因为准确的标号更有意程序的编写。
当DMA_LCM_Interrupt完成之后,我们需要手工将中断标识置0,否则DMA会一直调用DMA_LCM_Interrupt,这个不知道我说的对不对,有大神可以说说看。

截图202508181333266328.jpg


好的,至此我们完成了这一课程的学习,在这里要感谢STC的各位技术大拿,支持到位。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-23 22:30 , Processed in 0.114565 second(s), 74 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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