LCD控制器F-51543NFU-LW-ADN / PWB51543C-2-V0(来自磁带库)



哈伯,你好! 翻译了有关使用驱动程序管理LCD模块但没有我自己的视频RAM的文章之后,我决定翻译另一个有关同一主题的出版物。 在这里,该模块已经更加简单,单色了,但是要“复兴”它也同样有趣。

带驱动器的LCD控制,但没有控制器


作者将要使用的显示来自旧的磁带库。 控制器无法幸存,但是搜索与“ 263645-001”相关的任何信息均表明存在FPGA。 相信可以直接从Arduino等控制此类LCD模块。 不可能,您需要一个中间链接-SEDxxxxx系列控制器,它不与面包板“交朋友”,并且输入的数量超过模块本身。 但是事实并非如此。 这里有多达四个类似的项目:

在ATmega8515上
在上面
在图片上
在ESP32上

有些通常控制八位AVR VGA显示器...

通常,作者成功了, 这里是MIT许可下的软件。

静止影像


为了确保一切正常,您必须首先尝试从微控制器的闪存中输出一位光栅图像。 为了获得负电压,需要三个“ Crones”,将来自分压器的电压施加到V0引脚,该引脚用作调谐电阻。 屏幕上是Lenna:



作者仍然无法理解他如何翻转图片(看看电缆在哪一边)。 无论如何,GitHub上的项目页面上都有此示例。

文字模式


但是视频ROM几乎没有用,并且Arduino中没有9600字节用于视频RAM。 文本模式可以解决问题,其中字符生成器的ROM和视频RAM的容量比图形模式下的视频RAM小。 哈萨克斯坦共和国和“专家”的支持者可以在这方面无休止地挥舞长矛。



AVR汇编语言的简短示例:

... lpm r24, Z ;---------- (CL2 rising edge) out %[data_port], r24 ld r30, X+ swap r24; (CL2 rising edge) out %[data_port], r24 lpm r24, Z ;---------- (CL2 rising edge) out %[data_port], r24 ... 

所需的硬件




对于F-51543NFU-LW-ADN / PWB51543C-2-V0模块,作者应用了:

AVR上的Arduino,时钟频率为16 MHz(在Uno,Leonardo和类似于ProMicro的克隆上测试)。

负电压源。 对于作者而言,这是具有输入和输出隔离的不稳定DC-DC转换器A0524S-1W。 MC34063的转换器也很合适(该芯片很容易找到-只需拆开点烟器的最便宜的USB充电器即可)或MAX749。 不需要稳定,此处使用的模块在此输入的允许电压范围很宽。 标称值为负24 V,相对于公共线,最大值为负30,Vdd和Vee之间的最大值为35。 电流消耗为6 mA。

两个具有逻辑电平控制的N沟道MOS晶体管。 作者使用了IRL530n,库存当然很大,但肯定不会耗尽。 一个晶体管控制背光,另一个晶体管控制负电压。

250kΩ调整电阻,用于向输入V0供电。 可动触点上的温度设置为在+25°C时为-16.8V。 这来自数据表,因此,当然不需要这种准确性。

几个10公斤下拉电阻。

布局和跳线。

您现在要做什么? QR手表? 询问kote:



Kote提供了使用控制器对某些常见LCD进行仿真的功能。 因此可以将仅适用于HD44780的另一种“想法”连接到此Arduino。

字体-也在RAM中


我们以EGA和VGA为例-在那里,以文本模式工作时就做到了。 仅在这里总共有64个字符,但是与图形模式不同,至少所有字符都进入了RAM。 没错,事件的主要周期已经放慢了,但是您可以尝试平铺图形:



图形模式和半色调


在AVR上的Arduino中,没有太多RAM,这就是重点。 即使在兆丰。 320x240,甚至每个像素只有一位-它已经是9600字节。 仅四个半色调将需要两倍。 使用外部RAM(例如,处于SQI模式的23LC512),您可以尝试实现与DMA类似的功能,但是在ESP32上重新制作所有内容(其中有更多的静态RAM和DMA会更容易)更简单,更有利可图。

如果您只想通过USB将这样的显示器连接到PC,则可以尝试使用ATmega32u4-即使亮度等级也将有足够的资源(使用FRC,这在我之前的翻译中已有介绍)。 但不是使用“ mega”作为接口转换器,而是使用PC本身以5.4 Mbps的速度实时扫描LCD。

当模块仍停留在磁带库中时,就有一个GUI和亮度等级-一切都在那里。

更新将。 同时...



这不是照片蒙太奇,而是PC控制的结果。 我们将从Hackaday.io切换到GitHub-README.md中还有很多有趣的事情。

用于控制此类模块的信号


FLM-第一行标记-第一行标记,也可以称为FRAME,VSYNC等。
也可以调用CL1-行锁存脉冲-写字符串脉冲。 LOAD,HSYNC等
也可以调用CL2-像素移位时钟-像素改变脉冲。 CP(更改像素)等
M-交流信号(由于其像素受交流电压控制)也可以称为BIAS(偏移)等。

D0-D3是四位并行数据总线。

普通线,背光电源(例如VLED±),模块电源(VEE和V0)的引线

不要忽略数据表。 该模块可能需要另一个负电压,或者可能变成正电压,或者转换器可能是内置的。 逻辑可能会有所不同,例如,CL1上的单元对CL2没有反应。 背光可能不同(CCFL(小心地,逆变器是“叮咬”)而不是LED),或者板上没有管脚,那么如果没有数据手册,您将不会知道。 您不能随意连接任何东西。

该怎么办


以四位为单位发送字符串,并在CL2行的下降沿上进行记录。 通过该行之后,将其写到CL1线上的凹进处(是的,毕竟,模块中的一点RAM位于一行上)。 下一行将被自动选择。 传输完整个帧后,使用FLM信号返回到开头。 在LC79401的数据表中有一个示例。 以足够的速度记录,将脉冲均匀地施加到CL1。 控制器犹豫了一下-屏幕闪烁丑陋。

在每一帧之后,将输入M的逻辑电平更改为相反的电平,以便通过交流电压控制像素。 否则,显示会变差:


您不能相信微控制器的这种操作,而是要触发一个可数的触发器。 进入FLM,退出至M-通常是可以理解的。

在此存储库中,从闪存输出图像的示例(请参阅本文的开头)称为clglcd_simple。

如前所述,在AVR上使用Arduino中的RAM不可能做同样的事情-这还不够,因此...

再次-文字模式


根据数据表,您可以在四位总线和“拉” CL2上以高达6 MHz的频率传输数据。 因此,您可以快速地传输线,然后微控制器稍微解决其他任务,并且随着计时器“告诉”它,它“拉” CL1并重复循环。

当生成水平分辨率为320像素的字符时,所有这些操作都可以在20μs内完成(320像素/ 4位= 80脉冲,CL2以4 MHz的频率“拉”)。 对于其余任务,仍保留39.5μs。 CL1每59.5μs发生一次“抖动”,并获得70 Hz的帧频。 嗯,将会有更多的程序来处理中断等等,通常,微控制器将忙于控制显示器的时间达45%。 “整体” 45还是“整体” 45? 可能第二个:覆盖视频RAM中的数据可能足够快。

您是否希望微控制器花费更少的时间来管理指示器,而将更多的时间用于其他任务? 您可以将帧频降低到50 Hz,也可以将微控制器超频到20 MHz。 使用这些方法中的任何一种,中断例程之间都会发生更多的时钟周期。

输出比较定时器每四个时钟脉冲以50%的占空比切换CL2线。 同时,数据以连接到模块的四位数据总线的PORTB端口的输出进入,从而使它们在电平上升到CL2时改变,而在下降时保持不变。 当然,没有汇编程序就无法做到这一点:

 ... lpm r24, Z ;---------- (CL2 rising edge) out %[data_port], r24 ld r30, X+ swap r24; (CL2 rising edge) out %[data_port], r24 lpm r24, Z ;---------- (CL2 rising edge) out %[data_port], r24 ... 

8个周期-并发送四个半字节。 确切传输的内容取决于相应的视频RAM单元中的哪个符号,应从字符发生器ROM传输与该符号相对应的哪些像素以及存储在此ROM的相应单元中的内容。

这里最不方便的是需要在精确的80个脉冲后停止计时器。 某些计时器(例如32u4中的Timer4)不能。

为了获得提供给CL1线的信号,作者应用了微控制器的不同输出,该输出既用于定时器又用于快速PWM。 这在这里应用哪一个是可以理解的。 每952个小节切换一次。 或者,如果您将时钟分频器除以8,则每119个脉冲产生一次。 此时,中断处理程序开始运行,并迫使微控制器将新数据提交到控制线,这是在向CL1发送下一个脉冲期间所需的。 好吧,M线上的电平以一半的频率变化。 并且LCD不会劣化。 所有信号一起看起来像这样:



字符生成器由256个字符组成-足以容纳866,KOI-8R或1251。视频RAM中放置了40xN个字符,其中N是取决于字符高度的行数。 符号的宽度始终为8个像素,高度可以为6、8、10、12、15、16。它越小,字符生成器所需的ROM越少,而视频RAM越多。 使用8x8字体(每30行40个字符),您需要1200字节的RAM和2048字节的ROM。 使用8x16字体(在此模块上看起来最好),RAM需要600字节,并且ROM4096。从转换器中:您可以以8x8的形式存储字体,并通过软件垂直缩放两次,并且需要600字节的RAM和2048 ROM。 要将几种字体存储在ROM中,您需要保持字体起始地址不是恒定不变,而是保持在变量中,但是一次不能以多种字体打印文本将不起作用,除非,当然,除非您直接在将像素传输到显示器的过程中通过中断处理过程即时更改此地址。

字体的存储方式是这样的:首先是所有256个字符的第一行,然后是下一行,依此类推。 存储库的misc文件夹中有一个Python脚本,该脚本会自动将TTF字体转换为带有所需格式的PROGMEM数组的clglcd_font.h头文件。 可以在此处找到CC-BY-SA 4.0的经典像素字体。

再说一遍-以EGA和VGA为例


但是这次有细节。 如上所述,RAM中的字符生成器最多可容纳64个字符,它们可以由0到n或255-n到255的数字标识。它们以相同的方式存储:所有字符的首行,然后是下一行,依此类推。 考虑到字符不是256,而是64的事实,仅对齐了所有这些字符。对于8x16像素大小的字符,需要16 * 64 = 1024字节。 该存储库提供了一个使用RAM中的字符生成器的示例。

如果同时使用两个字符生成器-ROM中的256个字符和RAM中的64个字符,则您将不得不接受的是,不仅RAM会减少,而且模块中各行的数据传输速度也会降低-而不是8个时钟周期,两个半字节需要12个半字节也就是说,不是20微秒,而是30,而不是LCD控制的时间的45%,而是60。

半色调图形模式


如上所述,在这种情况下,微控制器仅充当接口转换器。 您将需要ATmega32u4,并且在此处介绍了操作 。 请注意,由于PC上的程序冻结,模块可能会损坏。

那么,这四线制回路是什么—从电阻传感器中得出来。


连接地点


如上所述,需要一个负电压,在第一个实验中可以将其从三个“ Crone”上移除,然后将其组装在例如MAX749上。 电源控制信号以及DISPOFF信号(这是一个反向信号,该模块处于打开状态)将下拉电阻器。 在刷新和复位微控制器期间,那里的逻辑单元的外观是不可接受的。

在控制线上已经存在数据时,在电压+ 5V之后施加负电压,并向DISPOFF线施加逻辑单元:数据总线上至少一个单元,CL1上的单元。 否则,模块可能会发生故障。

输入D0-D3可以连接到微控制器同一端口的输出,例如Px4-Px7,而输出Px0-Px3不能用作GPIO。 您可以为其分配其他功能,例如,将它们用作计时器,串行接口等的输出。 如果将它们用作输入,请当心:如果未禁用内置上拉电阻(PUD-上拉禁用),则它们可以任意切换。

输入M-比较定时器或PWM的输出。

输入CL1-到同一计时器的另一个输出。

输入CL2-到另一个比较定时器的输出。

FLM-到任何数字输出。

DISPOFF-至任何其他数字输出。

其余的取决于您如何打开模块电源。 作者倾向于分别控制背光和Vee。

如何使用固件


将clglcd.h和clglcd.cpp文件放入草图中

制作clglcd_config.h文件的备份副本,并在考虑到所连接的对象以及所需的功能后对其进行编辑:RAM中的字符生成器等。 请注意,该代码并不表示Arduino引脚的名称,而是根据数据表表示的微控制器引脚的名称。 比较驯服器的输出名称按以下方式解密:例如,2,B是OC2B,在Arduino Uno上对应于PD3。 这些示例显示了作者获得的连接选项。

使用misc文件夹中的Python脚本生成字体文件clglcd_font.h(请参见上文)。

在示例中查看如何初始化,打开和关闭显示器。 将要显示的文本放入屏幕阵列以进行验证。

编译并填充草图。 用逻辑分析仪检查是否有正确的信号传到显示屏,用电压表检查所有电源电压是否正常。 然后才连接显示器。

将代码添加到草图,该代码将执行某些操作,例如,在串行端口上接收文本并显示它。

显示中断


显示需要不断更新,这是中断处理过程所要做的。 如果中断停止的时间超过30微秒,则显示屏将闪烁;如果FLM线上的设备的中断时间超过60微秒,则可能会失败。 如果您需要长时间停止中断,请首先使用DISPOFF信号关闭显示器(我重复说,这是一个反向信号,模块已打开一个)。 当然,如果每次需要处理来自湿度和温度传感器的数据时关闭电源两秒钟,几乎没人会喜欢它,但这比破坏模块更好。 更好的是,将其余的充电到一个单独的微控制器。 由同一微控制器与以1-wire协议运行的设备和地址LED进行的信息交换尤其不可接受。 Arduino Pro Micro克隆足够便宜,可以购买两个。

沟通交流


但是硬件实现的接口可以完美地工作:串行端口,I 2 C总线,主模式下的SPI。 在从站中-仅当主站允许从站周期性“滚降” 25-35μs时。 当然,这仍然取决于连接显示器后剩下多少“腿”。

如果您不经常询问管理端点,则32u4上的USB可以很好地工作(缓慢的中断例程代码)。 CDC驱动程序及其API足够快。

然后在GitHub上的README.md文件中,重复类似项目的列表,与Hackaday.io上的项目页面相同

感谢您的关注!

Source: https://habr.com/ru/post/zh-CN444912/


All Articles