孙晓玉 发表于 2025-8-12 17:05:33

乘风飞扬 发表于 2025-8-4 14:16
可以的

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

孙晓玉 发表于 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,如下代码:

孙晓玉 发表于 2025-8-14 11:26:34

OK LCM驱动液晶的问题,最终解决了,原因如下:

如图设置LCMIFCFG2的时候,选择引脚的时候,我填写的是 LCMIFCFG2 = 0x19;我误看了LCMIFCPS的位置是从B4开始的,实际上是从B5开始的,因此采用P45 P37 P76的引脚填写的应该是 0x29;
至此通过LCM驱动的LCD160160黑白点阵屏(I8080 uc1698u)就OK了。
下一步,我继续研究LCM+DMA了。
正确的代码如下:

孙晓玉 发表于 2025-8-14 16:25:17

测试用DMA测试LCM来控制显示屏,期间查询了中断号,如下图:

看到TFT彩屏 DMA 中断是58,于是我就使用了两个中断,如下图:

我已经开启LCM_DMA中断

发现只有59可以被调用,而58没有被调用,程序已经可以正常跑通,也能通过DMA的通道将数据发到P2口,可是为什么58号中断没有执行呢?

孙晓玉 发表于 6 天前

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

孙晓玉 发表于 6 天前

那么最终 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,标识初始化后啥也不干。
    如下图就是简单的配置:
   
    6)当配置和初始化都完成后,就可以启动传输了,注意DMA启动后就不需要CPU干涉了,性能就节省出来了。
   
3.DMA的DMA_LCM_Interrupt是的中断号是58,需要安装中断扩展软件,不然就得适应asm汇编,我个人不建议使用asm,因为准确的标号更有意程序的编写。
当DMA_LCM_Interrupt完成之后,我们需要手工将中断标识置0,否则DMA会一直调用DMA_LCM_Interrupt,这个不知道我说的对不对,有大神可以说说看。




好的,至此我们完成了这一课程的学习,在这里要感谢STC的各位技术大拿,支持到位。
页: 1 [2]
查看完整版本: LCM驱动单色点阵屏幕的问题