本资源的原文使用英文撰写。 为方便起见,TI 提供了译文;由于翻译过程中可能使用了自动化工具,TI 不保证译文的准确性。 为确认准确性,请务必访问 ti.com 参考最新的英文版本(控制文档)。
本文档介绍了一种通过软件方法实现段式 LCD 控制器的方法。此方法可用于为不具备硬件模块(用于控制段式 LCD)的器件带来段式 LCD 功能。本文档详细说明了使用的软件方法;但是,有关段式 LCD 如何运行以及可用的不同实现的详细信息不在本文档范围内。
与本文档相关的软件可在 MSPM0 SDK 中给定 MSPM0 MCU 的“演示”文件夹下找到。
Other TMs
玻璃段式 LCD 通常由两块玻璃板连接而成,玻璃板之间有一小段缝隙。该缝隙中包含液晶液体,这些液体正常情况下是透明的。但是,如果通过电压差施加电场,分子会自行排列以与电场方向对齐,并且在清晰的背景上可以看到黑色段。电势差通过连接到显示器的分段 (SEGy) 和公共 (COMx) 线的交替和重复信号施加到段式 LCD。为了产生所述电压差,以相反的极性驱动 COMx 和 SEGy 线。施加在 COMx 和 SEGy 线之间的电压通常是交替的,以限制直流偏移电平,从而延长 LCD 的寿命。有关允许的最大直流偏移,请参阅段式 LCD 制造商的规格。
光学对比度,或者说段与背景相比有多暗,由 ON 段和 OFF 段的 RMS 电压差来控制。由于使用了重复信号,因此信号的频率对视觉也有影响。如果使用的频率太低,那么人们会感觉到屏幕“闪烁”。较快的频率不会出现这个问题,但会消耗更多的电量。大多数段式 LCD 的典型驱动频率在 30Hz 至 200Hz 之间,完全在基于软件的解决方案范围内。
在 LCD 组件内部,COMx 和 SEGy 线排列成网格图案。COM 线通常称为 LCD 的背板。该软件解决方案实现了四重背板,这意味着有四条按顺序驱动的 COMx 线。要打开特定段,通过确保相关的 COMx 和 SEGy 线相互反向驱动,然后如图 1-1 所示交替来激活特定的坐标。为了保持某段关闭,按照与当前上电的 COMx 线相同的模式驱动相应的 SEGy 线。
从 MCU 的角度来看,需要以重复模式将适当的引脚驱动为高电平、低电平或悬空,以显示图像或消息。图 1-1 显示了一个 LCD 更新周期示例。当 COMx 线处于工作状态时,它首先在更新周期内驱动为低电平,然后在接下来的周期内驱动为高电平。处于不工作状态时,该引脚被设置为悬空,从而通过节 2 中所述的外部电阻器驱动至 VDD/2。要打开 SEGy,须先将其驱动为高电平,然后在两个周期内将其驱动为低电平,并遵循与 COMx 信号相同的模式使其保持关闭状态。
对于每个 LCD,都提供了有关 LCD 映射到不同 COMx 和 SEGy 线的文档。一对分段线与四条 COMx 线组合,生成一个数字或字母(英文)字符。特殊符号被赋予特定的 COMx + SEGy 交叉,或在典型字符映射的备用交叉中使用。图 1-2 中显示了一个 LCD 映射示例。
从软件的角度来看,需要将字符从 LCD 映射转换为数字,该数字可用于确定在每个 COMx 阶段需要打开或关闭哪些段以及引脚。需要对想要显示的每个字符,以及 LCD 上的每个特殊符号进行此转换。对于此解决方案,请执行以下步骤进行转换:
图 1-3 展示了一个使用字符“4”进行此转换的示例。此转换将存储在表 3-1 中所述的查询表中。
段式 LCD 通常指的是它能够显示的段的数量,其次是段引脚对 COM 的排列。例如,96 段 LCD 可以采用 4 x 24 或 3 x 32 的排列方式,COM 引脚由段引脚排列。
从连接的角度来看,您需要将段式 LCD 模块连接到 MSPM0,如图 2-1 中所述。COMx 线需要配置为半电源分压器的外部电阻,以便在不活动时将电压偏置到“中性”状态。不同 LCD 制造商所需的确切偏置可能有所不同。
在选择用于 MSPM0 软件 LCD 实现的引脚时,需要考虑多个因素,以简化布局和软件,同时也允许与引脚进行多路复用的其他功能。
在布局方面,理想的情况是选择将 LCD 引脚按顺序组合在一起,并与 LCD 模块位于芯片的同一侧。这些因素更大限度地减少了信号交叉,并使 LCD 引脚远离用于调节或采样模拟信号的引脚。
从软件角度来看,该解决方案利用了引脚可以同时作为多达 32 个引脚的完整端口进行寻址的事实。它还要求从端口角度来看每两个段彼此相邻。例如,如果您有两条 SEGy 线 SEG0 和 SEG1,它们可以分别分配给引脚 PA2 和 PA3,但不能分配给 PA2 和 PA4,因为它们在寄存器中不相邻。该软件还假设,如果 LCD 分配的引脚跨越多个端口(例如 PAx + PBx),则端口之间有明确的 SEGy 线来划分。有关更多信息,请参阅图 2-2。从软件的角度来看,COMx 线只需要所有 COMx 线都在同一端口上。
从应用角度来看,您还必须根据器件所需的功能(例如可用的通信接口、PWM 或模拟功能)来平衡要使用的引脚。TI 的 Sysconfig 工具可帮助简化这项工作。
这些因素可能会使选择用于 SW LCD 的引脚成为 MSPM0 器件中某些封装的挑战,并且可能需要根据您的应用进行权衡。另请记住,从端口寄存器的角度来看,定义为彼此相邻的引脚(PA2 和 PA3)可能不会在封装上物理上彼此相邻。在具有多个端口的器件上,可以通过沿封装交替的端口来寻址物理上彼此相邻的引脚。
为 MSPM0 软件 LCD 控制器提供了两个不同的工程。其中一个工程专注于具有单个 GPIO 端口(“MSPM0_SW_LCD_Single_Port”)的 MSPM0 器件,另一个工程则针对支持多个 GPIO 端口(“MSPM0_SW_LCD_Multi_Port”)的 MSPM0 器件。
SysConfig 用于选择和命名软件 LCD 解决方案所需的 GPIO 引脚和计时器资源。提供的 Sysconfig 文件已经为工作解决方案提供了适当的命名。添加、删除或修改提供的引脚,以满足您的应用程序需求,同时遵守节 2中提供的建议。您还可以在 Sysconfig 中更改计时器时钟设置,从而更改 LCD 刷新率。如果需要达到特定的刷新率,请记住,节 3.2中所述的 LCD_Update_Clock 需要八个更新周期才能刷新整个 LCD 屏幕。这意味着您需要以八倍的刷新率为计时器中断提供服务。例如,如果想要 30Hz 的 LCD 刷新率,那么必须将计时器设置为以 240Hz 的速率中断器件才能满足该刷新率。
表 3-1 显示了需要修改以适合您的解决方案的代码定义和映射。这包括定制您选择的引脚和字符到 LCD 的映射,如 节 1.2中所述。这些定义位于每个工程的 principle .c 文件的开头。
类型 | 名称 | 详细信息 |
---|---|---|
#define | COM_LINE_TOTAL | 使用的 COM 线数 - 默认 4 |
#define | SEGMENT_LINE_TOTAL | 使用的线段数 |
#define | SEGMENT_LINE_LOWER_PORT_MASK | 下部端口 A 中段所用引脚的端口掩码 |
#define | SEGMENT_LINE_UPPER_PORT_MASK | 上部端口 B 中段使用的引脚的端口掩码 |
#define | SEGMENT_LINE_PORT_SPLIT | 分配了上部端口引脚的第一个段。对应于 gSegmentOffsetMap 中分配的第一个上部端口 |
uint8_t array | gNumberMap[] | 将不同字符映射到 LCD 映射图的数组。 |
uint8_t array | gSegmentOffsetMap[] | 跨端口的不同段的映射。 SEGMENT_LINE_LOWER_PORT_MASK 必须将这些段映射到端口。所有端口 A 段(下)都必须列在端口 B 段(上)之前。 |
图 3-1 显示了这个解决方案的两个主要代码段的软件流程图:LCD_WriteCharacter 函数和 LCD_Update_Clock 中断处理程序。
LCD_WriteCharacter() 接收与要在 LCD 上显示的字母数字字符相对应的字符映射数组 (gNumberMap) 的索引,以及与 LCD 上的字符位置相对应的段映射 (gSegmentOffsetMap) 的索引。该函数解析字符并将其写入适当的 LCD 存储器表(gLCD_MemoryTable_Lower 或 gLCD_MemoryTable_Upper)。由于这种结构,可以在应用程序的任何点调用 LCD_WriteCharacter(),并与 LCD 更新时钟异步更新 LCD 存储器表。
LCD_Update_Clock 中断处理程序是 SW LCD 解决方案的主要驱动程序。它包含一个复制前面的图 1-1 中所述波形的状态机,其中每种情况代表所示的一个时间实例,并将执行以下操作。
对于偶数情况:
对于奇数情况:
在应用中使用此解决方案时,此解决方案有几个关键注意事项。由于 LCD 存储器表可以异步更新,因此如果存储器表相对于 LCD 刷新率更新过于频繁,则 LCD 上可能会出现视觉异常。这些异常现象可以通过提高 LCD 刷新率,仅在更新 LCD 更新周期的开始/结束时更新 LCD 存储器表,确保字符在更改前显示最少数量的 LCD 刷新周期,或者组合使用这些做法来减少或避免。
与大多数基于软件的解决方案一样,时序对于解决方案的成功至关重要。必须注意及时为 LCD_Update_Clock 中断处理程序提供服务,以保持解决方案的稳定性。该解决方案之外的频繁或长时间中断服务例程可能会妨碍软件 LCD 解决方案的正常运行。应用可以通过使用比系统中其他中断优先级更高的计时器实例,增加所用计时器实例的中断优先级,保持其他应用中断较短或对应用中的其他中断使用软件标志循环方法来缓解这种情况。