本帖最后由 小恩GG 于 2025-6-30 15:15 编辑
在MCX C444MCU上使用段式液晶显示器(SLCD)控制器
1 引言 定制段式液晶显示器(SLCD)技术随处可见。例如: - 用于测量游泳池pH值的产品中。 - 用于测量矿井中特定气体的监测仪中。 - 用于查看儿童是否发烧的体温计中。
SLCD是最古老的显示技术之一,由于其价格最低且功耗最低,至今仍是最受欢迎的技术之一。段式LCD显示器,也称为静态显示器或纯玻璃显示器,由两块氧化铟锡(ITO)玻璃组成,中间夹有扭曲向列型流体。静态显示器是一种段式显示器,每个段都有一个引脚。段可以是任何可以独立开启和关闭的线条、点或符号。
NXP MCX C444 MCU集成了一个SLCD控制器模块,该模块具有多达8个背板和47个前板,如8×47或4×51。本文档介绍了通过启用SLCD设备S401M16KR来使用片上SLCD控制器的方法,该设备是一款四位0.17英寸七段定制LCD面板。
2 硬件 2.1 S401M16KR SLCD设备 S401M16KR SLCD设备在面板上显示四位数字。每个数字由七个段和一个点或冒号显示,如图1所示。 图1. S401M16KRSLCD 设备
S401M16KR SLCD设备包含四个COM引脚和八个DATA引脚作为控制信号。COM引脚和数据引脚控制一个矩阵,该矩阵指示在特定时间哪些段是开启的,哪些是关闭的,如表1所示。
表1. S401M16KRSLCD 设备
COM引脚按步骤逐一启用。在每个步骤中,通过各自的COM引脚激活,八个数据引脚输出控制电平信号来开启和关闭段。每个COM的段逐行开启和关闭。当四个步骤的循环快速运行时,一些段会被视为一起开启,形成一个整体的显示视图(即使它们在矩阵中不在同一行)。
将控制信号视为激活矩阵,见表2。 表2. 控制信号的激活矩阵
对于每个数字位置,不同的数字由不同的段组成。图2以直接段方式显示了0-9的数字。 图2. slcd数字
表3. slcd数字信息
如表3所示,我们可以获得在每个由指定COMx引脚激活的周期内显示不同数字的代码。源文件中有代码数组:
#define SLCD_ON_SHOW_COUNT 11u const uint8_t SLCD_NUMBER_TABLE[][SLCD_COMx_COUNT] = /* COM0, COM1, COM2, COM3 */ { 0x1, 0x3, 0x2, 0x3 }, /* 显示数字0 */ { 0x0, 0x2, 0x2, 0x0 }, /* 显示数字1 */ { 0x1, 0x1, 0x3, 0x2 }, /* 显示数字2 */ { 0x1, 0x2, 0x3, 0x2 }, /* 显示数字3 */ { 0x0, 0x2, 0x3, 0x1 }, /* 显示数字4 */ { 0x1, 0x2, 0x1, 0x3 }, /* 显示数字5 */ { 0x1, 0x3, 0x1, 0x3 }, /* 显示数字6 */ { 0x0, 0x2, 0x2, 0x2 }, /* 显示数字7 */ { 0x1, 0x3, 0x3, 0x3 }, /* 显示数字8 */ { 0x1, 0x2, 0x3, 0x3 }, /* 显示数字9 */ { 0x0, 0x0, 0x0, 0x0 }, /* 不显示 */ { 0x2, 0x0, 0x0, 0x0 }, /* 显示小数点 */ }; 注意: 每个数字仅包含两个引脚。四位并行可通过八个引脚扩展复制。以下部分介绍四位的用法。
2.2 FRDM-MCXC444开发板 在FRDM-MCXC444开发板上,SLCD设备通过引脚连接到MCU。原理图如图3所示。 图3. SLCD连接
表 4 展示了关于引脚设置的功能信息。 表4. 引脚设置的功能信息
数据信号被视为总线,由八个独立的引脚组成,命名为D0到D7。对这些信号进行编码以控制它们,每个引脚的信号通过总线被视为一个整体数据。
为了像总线一样操作所有控制信号,在源代码中,信号索引被排列成两个数组: /* 定义同步总线和数据总线。 */ #define SLCD_COMx_COUNT 4u #define SLCD_DATA_BUS_WIDTH 8u /* 定义同步总线和数据总线的引脚。 */ const uint8_t SLCD_PIN_COMx[SLCD_COMx_COUNT] = { 59, /* COM0. */ 60, /* COM1. */ 14, /* COM2. */ 15 /* COM3. */ }; const uint8_t SLCD_PIN_DATA[SLCD_DATA_BUS_WIDTH] = { 20, /* D0. */ 24, /* D1. */ 26, /* D2. */ 27, /* D3. */ 40, /* D4. */ 42, /* D5. */ 43, /* D6. */ 44 /* D7. */ };
3 基本用法 MCX C444上的SLCD控制器易于使用。启用时钟并设置引脚复用功能后,对于没有闪烁和故障检测功能的基本用法,只需一个控制寄存器,即LCD通用控制寄存器(LCD_GCR),即可初始化控制器。以下提供一组典型设置:
/* 配置SLCD控制器。 */ LCD->GCR = LCD_GCR_DUTY(3) /* 选择LCD控制器的占空比。3:4个COMx线。 */ |LCD_GCR_LCLK(2) /* 时钟源的时钟分频器。0-7。 */ |LCD_GCR_SOURCE(0) /* LCD时钟源。1:使用MCGIRCLK。0:OSC32K。 */ |LCD_GCR_LCDEN(0) /* 设置期间禁用控制器。 */ |LCD_GCR_LCDSTP(0) /* 在STOP模式下保持LCD模块运行。 */ | LCD_GCR_FFR(0) /* 选择帧速率模式。0:标准帧速率。 */ |LCD_GCR_LCDDOZE(1) /* 在DOZE模式下保持LCD模块运行。 */ |LCD_GCR_ALTSOURCE(0) /* 选择备用时钟源。使用默认时钟源时不可用。*/ |LCD_GCR_ALTDIV(0) /*备用时钟源的时钟分频器。使用默认时钟时不可用。*/ |LCD_GCR_FDCIEN(0) /* 故障检测完成时启用LCD中断事件。 */ |LCD_GCR_PADSAFE(0) /* 强制LCD焊盘控制处于安全状态,锁定所有LCD控制位。 */ |LCD_GCR_VSUPPLY(0) /* 选择电源电压。0:来自内部Vdd。 */ |LCD_GCR_LADJ(1) /* 配置SLCD以处理不同的LCD玻璃电容。 */ |LCD_GCR_CPSEL(1) /* 选择LCD控制器电荷泵或电阻网络来提供LCD电压V_LLx。 */ |LCD_GCR_RVTRIM(8) /* 调节电压微调。禁用时不可用。 */ |LCD_GCR_RVEN(0); /* 调节电压使能。禁用。 */
MCU上的引脚必须映射到SLCD控制总线的COMx信号和Dx信号。 - COMx信号的映射配置为背板引脚。 - Dx信号的映射配置为前板引脚。 - 使用的引脚通过LCD引脚使能寄存器(LCD_PEN0、LCD_PEN1)、LCD背板使能寄存器(LCD_BPEN0、LCD_BPEN1)初始化,其中LCD_PENx启用所有使用的引脚,LCD_BPENx将它们选择为前板或背板。 - LCD_WF8Bx寄存器用于每个引脚的信号时序序列。
以下描述LCD_WF8Bx寄存器的用法: - LCD_WF8Bx数组中的每个寄存器对应一个LCD信号引脚。数组的索引也对应SLCD模块的功能引脚。例如,LCD_WF8B[59]对应SLCD模块的信号引脚LCD_P59。 - LCD_WF8Bx寄存器中的每个位对应步骤1,而位的索引也对应步骤1。例如,LCD_WF8B[59]中的位2对应整个周期(包括四个步骤或八个步骤)中步骤2时LCD_P59的状态。
在软件中,控制数据信号与硬件略有不同。软件首先搜索并行引脚的数据,然后安排数据时序序列。然而,硬件首先搜索每个引脚的数据时序,然后将并行引脚组装成8位宽的总线。因此,在源代码项目中设计了一个转换函数。
/* @brief 在SLCD控制总线上设置数据 * @param com_idx 步骤(COMx)的索引,0-3。 * @param show_dat 当前步骤发送到总线的显示代码。 */ void slcd_set_bus_data(uint8_t com_idx, uint8_t show_dat) { uint8_t bit_mask =(1u << com_idx); for (uint8_t i =0u; i < SLCD_DATA_BUS_WIDTH; i++) { if (show_dat& 0x1) { LCD->WF8B[SLCD_PIN_DATA]|= bit_mask; } else { LCD->WF8B[SLCD_PIN_DATA] &= ~bit_mask; } show_dat>>= 1u; } }
创建了一个API函数,用于将段代码组装成四位的显示矩阵。有了这个API,就不需要复杂的矩阵转换。您只需告诉MCU您想显示什么数字以及想在哪个位置显示,因为软件会自动处理所有转换。
/* 在矩阵中保留不变的显示代码。 */ static uint8_t slcd_on_show_numbers[SLCD_COMx_COUNT];
/** * @brief 在SLCD设备的数字位置设置显示数字。 * @param index 数字位置的索引,0-3。 * @param number 要显示的数字值,0-10,其中10表示“无”。 * @param en_dp 启用在当前数字位置显示小数点,true或false。 */ void slcd_set_number(uint8_t index, uint8_t number, boolen_dp) { uint8_t tmp8 = 0u; for (uint8_t i =0u; i < SLCD_COMx_COUNT; i++) { tmp8 =slcd_on_show_numbers & (~(0x3 << (2 * index))); /* 清除旧的设置代码。 */ tmp8 |=(SLCD_NUMBER_TABLE[number] << (2 * index)); /* 添加新的设置代码。 */ if (en_dp) { tmp8 |=SLCD_NUMBER_TABLE[SLCD_ON_SHOW_NUMBER_DP] << (2 * index); /* 添加小数点的新设置。 */ } slcd_on_show_numbers = tmp8; slcd_set_bus_data(i,slcd_on_show_numbers); } } 在应用程序的main()函数中,在目标SLCD上显示变化数字的源代码如下:
int main(void) { bool en_dp;
/* 初始化开发板硬件。 */ BOARD_InitPins(); BOARD_BootClockRUN(); BOARD_InitDebugConsole();
PRINTF("slcd基本示例。\r\n");
/* 初始化SLCD的时钟和引脚,配置SLCD控制器。 */ slcd_init();
en_dp = false;
while (1) { for (uint8_t i= 0u; i < SLCD_ON_SHOW_COUNT; i++) { GETCHAR();
slcd_stop(); /* 在更新显示之前停止SLCD控制器。 */ slcd_set_number(0,i, en_dp); slcd_set_number(1, (i+1)%SLCD_ON_SHOW_COUNT, en_dp); slcd_set_number(2, (i+2)%SLCD_ON_SHOW_COUNT, en_dp); slcd_set_number(3, (i+3)%SLCD_ON_SHOW_COUNT, en_dp); slcd_start();
en_dp =!en_dp; } } } 下载项目并在FRDM-MCXC444开发板上运行。数字将显示在SLCD上,如图4所示。 图4.FRDM-MCXC444 SLCD
4 低功耗模式下的用法 在带有SLCD控制器的MCU上,SLCD控制器特别受到一些超低功耗STOP模式的支持。在这些模式下,几乎所有硬件都断电至相同的能量水平。SLCD控制器控制其引脚刷新SLCD设备,以使其在面板上保持显示。
除了VLLS0模式外,SLCD几乎可以在所有电源模式下工作。有关详细信息,请参阅用户手册中的电源管理章节。
表5 低功耗模式下的slcd
确保SLCD在低功耗模式下工作的关键设置是: - 时钟源:确保SLCD控制器的时钟源在目标低功耗模式下仍然有效。例如,如果SLCD控制器的时钟源是32 K OSC,则该时钟源在每个模式下都启用,即使在VLLSx模式下也是如此。 - 引脚复用:确保SLCD控制器使用的引脚配置为模拟功能(ALT0),并且其他(数字)功能的引脚在VLLSx模式下被锁定(电压电平不能改变)。只有当SLCD控制器的引脚处于活动状态时,SLCD控制器才会输出波形,SLCD面板才会保持显示数字。 - SLCD控制器的低功耗模式:通过将LCD_GCR[LCDSTP]位和LCD_GCR[LCDDOZE]位设置为0,启用SLCD控制器的低功耗支持,以确保SLCD控制器在STOP和WAIT模式下仍然工作。
完成上述参数设置后,设置SLCD控制器进行显示,然后进入低功耗STOP模式。在低功耗STOP模式下,SLCD面板上的显示处于开启状态,因为SLCD控制器仍在输出刷新波形。
在图5所示的示例项目中,在VLLS3模式下,RTC和SLCD控制器运行时,FRDM-MCX C444开发板上的测量电流低至约19 µA。 图5. SLCD 低功耗显示
5 结论 本文档介绍了MCXC444 MCU上片上SLCD控制器的基本用法,并提供了基于FRDM-MCXC444开发板的示例项目。通过在硬件上进行适当的配置,SLCD控制器可以控制SLCD设备自动在其面板上显示内容。即使在低功耗模式下,SLCD控制器仍然可以以极低的能耗工作。这表明带有片上SLCD控制器的MCX C444可以用于对能量敏感的应用领域。
6 参考链接
|