#申请原创#@21小跑堂@21小跑堂@21小跑堂
近日,有人做了一款LCD模块的辅助配置软件,软件配置之后,可以自动生成LCD模块的代码,
用户调用生成的代码即可,欢迎大家试用,并提出自己的意见。
1 LCD模块辅助软件特点 LCD 模块设置图形化选择,易于理解LCD模块设置相关参数 针对段式LCD 液晶屏显示8字段和米字段选择设置 使用XML格式配置文件方便保存和修改,便于二次扩展 针对LCD段式液晶屏只需要设置相关SEG和COM 和RAM区域,即可生成相应代码 生成代码易于阅读和理解,包含了演示代码 真正实现一键生成LCD相关代码,便于前期评估和开发 该软件适合现有华大所有带LCD显示的MCU,便于添加后续带有LCD/LED 显示MCU。 2 LCD模块辅助软件功能介绍针对华大LCD模块,开发了LCD模块辅助软件。软件如图所示。 图 1 LCD模块辅助软件 该软件分为五大区域。 1. 华大LCD模块配置区域 该区域主要配置LCD 的时钟、LCD模式需要的COM 数、LCD模式需要的SEG 数、LCD驱动方式选择、内部电阻驱动方式对比度调整、LCD偏置设置、LCD电荷泵时钟选择、LCD 扫描频率设置。 通过该区域设置基本可以完成LCD模块的初始化。 2. LCD模块驱动电路区域 该区域通过LCD模块设置,可以显示外部驱动电路的实际接法,以及对该种驱动电路进行说明。方便用户对该种驱动方式进行了解,选择适合的驱动方式。 针对外部电阻驱动方式,可以通过MCU的电源电压,Rx 和R 电阻来计算出LCD的电压以及该种电路消耗的电流。用户可以方便调整Rx 和R 电阻大小。 3. 8字和米字配置设置区域 该区域主要针对段式LCD屏主要显示数字常出现8字和米字配置为主进行了取点设置, 并设置LCD屏出现数字个数,用于代码生成使用。 4. LCD模块RAM区域显示 该区域主要根据用户的LCD屏来填充相应的显示部分。显示8字和米字的段时按照数字在前段点在后原则设置。例如2号F段 填充2F ,不能设置为F2。特殊字段比如小数点等,例如2号数字小数点 P ,可以设置为P2。 字段数段时,数字在前段在后。特殊字段时,段在前数字在后。 COM 和SEG 依据原理图来通过下拉选项选择。 5. LCD模块操作软件。 当已有设置好的配置文件,可以通过读出XML按钮,读出相关配置。 当设置好后,需要保存相关配置文件,可以点击保存XML按钮。 当设置好后,需要生成代码,点击生成代码按钮,即可生成相应代码。 3 LCD模块辅助软件XML配置文件介绍 以STK 中的LCD为例,相关配置文件如下: <?xmlversion="1.0" encoding="utf-8"?> <Config> <字8配置>True</字8配置> <米字配置>False</米字配置> <LCD模块COM选择>3</LCD模块COM选择> <LCD模块SEG设置>8</LCD模块SEG设置> <LCD驱动方式选择>1</LCD驱动方式选择> <内部电阻驱动对比度调节>0</内部电阻驱动对比度调节> <LCD偏置bias设置>0</LCD偏置bias设置> <LCD电荷泵时钟频率设置>0</LCD电荷泵时钟频率设置> <LCD扫描频率设置>1</LCD扫描频率设置> <VDD电压mV>3300</VDD电压mV> <RX电阻Ω>30000</RX电阻Ω> <R电阻Ω>100000</R电阻Ω> <COM配置表>COM0,COM1,COM2,COM3,</COM配置表> <SEG配置表>SEG0,SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,</SEG配置表> <点阵表>1F,1A,2F,2A,3F,3A,4F,4A, 1G,1B,2G,2B,3G,3B,4G,4B, 1E,1C,2E,2C,3E,3C,4E,4C, P1,1D,P2,2D,P3,3D,P4,4D,</点阵表> <数字个数>4</数字个数> <字配置表>0,1,2,3,4,5,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,</字配置表> <LCD模块时钟选择>1</LCD模块时钟选择> </Config> 通过XML配置文件,可以看出是将相关配置以XML文件方式保存下来,便于下次加载和修改。 4 LCD模块辅助软件生成文件介绍 通过该软件生成.c文件。该文件有以下几部分组成: //HDSC MCU LCD模块中SEG和IO 与 段式LCD屏的引脚对应关系图 //COM 对应关系 //COM0 ========== COM0 //COM1 ========== COM1 //COM2 ========== COM2 //COM3 ========== COM3 //SEG 对应关系 //SEG0 ========== SEG0 //SEG1 ========== SEG1 //SEG2 ========== SEG2 //SEG3 ========== SEG3 //SEG4 ========== SEG4 //SEG5 ========== SEG5 //SEG6 ========== SEG6 //SEG7 ========== SEG7 //点阵符号宏定义 #define Fill_1F LCDSEG0 |= 0x1 #define Fill_1A LCDSEG1 |= 0x1 #define Fill_2F LCDSEG2 |= 0x1 #define Fill_2A LCDSEG3 |= 0x1 #define Fill_3F LCDSEG4 |= 0x1 #define Fill_3A LCDSEG5 |= 0x1 #define Fill_4F LCDSEG6 |= 0x1 #define Fill_4A LCDSEG7 |= 0x1 #define Fill_1G LCDSEG0 |= 0x2 #define Fill_1B LCDSEG1 |= 0x2 #define Fill_2G LCDSEG2 |= 0x2 #define Fill_2B LCDSEG3 |= 0x2 #define Fill_3G LCDSEG4 |= 0x2 #define Fill_3B LCDSEG5 |= 0x2 #define Fill_4G LCDSEG6 |= 0x2 #define Fill_4B LCDSEG7 |= 0x2 #define Fill_1E LCDSEG0 |= 0x4 #define Fill_1C LCDSEG1 |= 0x4 #define Fill_2E LCDSEG2 |= 0x4 #define Fill_2C LCDSEG3 |= 0x4 #define Fill_3E LCDSEG4 |= 0x4 #define Fill_3C LCDSEG5 |= 0x4 #define Fill_4E LCDSEG6 |= 0x4 #define Fill_4C LCDSEG7 |= 0x4 #define Fill_P1 LCDSEG0 |= 0x8 #define Fill_1D LCDSEG1 |= 0x8 #define Fill_P2 LCDSEG2 |= 0x8 #define Fill_2D LCDSEG3 |= 0x8 #define Fill_P3 LCDSEG4 |= 0x8 #define Fill_3D LCDSEG5 |= 0x8 #define Fill_P4 LCDSEG6 |= 0x8 #define Fill_4D LCDSEG7 |= 0x8 ///*============================================*/// ///* Function: voidInitial_LCDDriver(void) ///* Description: HDSC LCD 初始化代码 ///*============================================*/// void Initial_LCDDriver(void) … … 该部分包括LCD时钟初始化、LCD模块初始化配置、LCD相关IO配置。 /******************************************************************************* 功能描述: 显示全屏和清除显示 *******************************************************************************/ void Disp_Full_Clear(uint8_t temp) 该部分实现LCD 显示全显和清除显示。
//=============================================== //数字显示函数 //=============================================== void LCD_Digit_1(uint8_t V_Data) … … 该部分实现LCD 数字从1~n 显示 0~9 数字。 如果选择米字显示LCD 数字从1~n 显示 0~9 数字 以及A~Z 字母。 void Disp_OneDigit(uint8_t V_DataNum,uint8_t V_Data) 该函数实现选择第几个字,以及显示的内容。 ///*****************************************************************************/// ///*Function:Disp_DigitS ///*Description:底层数字转换 ///*****************************************************************************/// void Disp_DigitS(uint8_t *P_Data,uint8_t V_StartNum,uint8_t V_Num) 该函数实现大部分显示8个字时,开始的位到结束的位置。8个数字由指针P_Data获得。 ///***************************************************************************/// ///*Function:Test_Display LCD 显示测试程序 ///*************************************************************************/// void Test_Display(void) 该函数是测试使用,进行LCD初始化、全显示、依次显示每一个数字从0~9或者0~36、显示所有数字从0~9或者0~36、全清除、显示特殊字段直到显示特殊字段显示完成。
5 LCD模块辅助软件注意事项5.1 LCD模块时钟选择该软件默认只能选择内部RCL的时钟,建议使用RCL时钟给LCD模块。LCD模块选择RCL时钟具有较好的ESD性能,以及节省外部XTL时钟,减少BOM成本。 5.2 LCD模块RAM显示 根据软件固定设置选择了模式0方式。 5.3 LCD模块配置 LCD模块配置中,没有使用DMA显示、以及LCD显示中断配置。该功能极少使用,该软件并不支持。如果有需求需要进行增加修改初始化配置函数。 5.4 华大带有LCD模块系列支持该模块以HC32F/L176和HC32F/L196 为主进行配置,由于配置关系使用直接操作寄存器,HC32F/L072 同样无缝支持。 HC32L136 系列由于寄存器名字不一致操作导致和生成的.c文件有冲突,冲突处在Initial_LCDDriver 函数内。请修改头文件中LCD部分的配置。 1. 修改时钟寄存器: M0P_SYSCTRL->PERI_CLKEN0_f.GPIO = 1; //打开GPIO模块时钟 M0P_SYSCTRL->PERI_CLKEN0_f.LCD =1; //打开LCD模块时钟 改为: M0P_SYSCTRL->PERI_CLKEN_f.GPIO = 1; //打开GPIO模块时钟 M0P_SYSCTRL->PERI_CLKEN_f.LCD =1; //打开LCD模块时钟 2. HC32L/F 136.h 头文件修改: 主要包括:SEGIO0、SEGIO1、CR0 三个寄存器定义以及内部的位定义。 union { __IO uint32_t SEGIO0; stc_lcd_segio0_field_tSEGIO0_f; }; union { __IO uint32_t SEGIO1; stc_lcd_segio1_field_tSEGIO1_f; }; 改为 union { __IO uint32_t POEN0; stc_lcd_poen0_field_tPOEN0_f; }; union { __IO uint32_t POEN1; stc_lcd_poen1_field_tPOEN1_f; }; typedef struct { __IO uint32_t SEG0 : 1; __IO uint32_t SEG1 : 1; __IO uint32_t SEG2 : 1; __IO uint32_t SEG3 : 1; __IO uint32_t SEG4 : 1; __IO uint32_t SEG5 : 1; __IO uint32_t SEG6 : 1; __IO uint32_t SEG7 : 1; __IO uint32_t SEG8 : 1; __IO uint32_t SEG9 : 1; __IO uint32_t SEG10 : 1; __IO uint32_t SEG11 : 1; __IO uint32_t SEG12 : 1; __IO uint32_t SEG13 : 1; __IO uint32_t SEG14 : 1; __IO uint32_t SEG15 : 1; __IO uint32_t SEG16 : 1; __IO uint32_t SEG17 : 1; __IO uint32_t SEG18 : 1; __IO uint32_t SEG19 : 1; __IO uint32_t SEG20 : 1; __IO uint32_t SEG21 : 1; __IO uint32_t SEG22 : 1; __IO uint32_t SEG23 : 1; __IO uint32_t SEG24 : 1; __IO uint32_t SEG25 : 1; __IO uint32_t SEG26 : 1; __IO uint32_t SEG27 : 1; __IO uint32_t SEG28 : 1; __IO uint32_t SEG29 : 1; __IO uint32_t SEG30 : 1; __IO uint32_t SEG31 : 1; } stc_lcd_segio0_field_t;
typedef struct { __IO uint32_t SEG32 : 1; __IO uint32_t SEG33 : 1; __IO uint32_t SEG34 : 1; __IO uint32_t SEG35 : 1; __IO uint32_t SEG36COM7 : 1; __IO uint32_t SEG37COM6 : 1; __IO uint32_t SEG38COM5 : 1; __IO uint32_t SEG39COM4 : 1; __IO uint32_t COM0 : 1; __IO uint32_t COM1 : 1; __IO uint32_t COM2 : 1; __IO uint32_t COM3 : 1; __IO uint32_t MUX : 1; } stc_lcd_segio1_field_t; 改为: typedef struct { __IO uint32_t S0 : 1; __IO uint32_t S1 : 1; __IO uint32_t S2 : 1; __IO uint32_t S3 : 1; __IO uint32_t S4 : 1; __IO uint32_t S5 : 1; __IO uint32_t S6 : 1; __IO uint32_t S7 : 1; __IO uint32_t S8 : 1; __IO uint32_t S9 : 1; __IO uint32_t S10 : 1; __IO uint32_t S11 : 1; __IO uint32_t S12 : 1; __IO uint32_t S13 : 1; __IO uint32_t S14 : 1; __IO uint32_t S15 : 1; __IO uint32_t S16 : 1; __IO uint32_t S17 : 1; __IO uint32_t S18 : 1; __IO uint32_t S19 : 1; __IO uint32_t S20 : 1; __IO uint32_t S21 : 1; __IO uint32_t S22 : 1; __IO uint32_t S23 : 1; __IO uint32_t S24 : 1; __IO uint32_t S25 : 1; __IO uint32_t S26 : 1; __IO uint32_t S27 : 1; __IO uint32_t S28 : 1; __IO uint32_t S29 : 1; __IO uint32_t S30 : 1; __IO uint32_t S31 : 1; } stc_lcd_poen0_field_t;
typedef struct { __IO uint32_t S32 : 1; __IO uint32_t S33 : 1; __IO uint32_t S34 : 1; __IO uint32_t S35 : 1; __IO uint32_t S36C7 : 1; __IO uint32_t S37C6 : 1; __IO uint32_t S38C5 : 1; __IO uint32_t S39C4 : 1; __IO uint32_t C0 : 1; __IO uint32_t C1 : 1; __IO uint32_t C2 : 1; __IO uint32_t C3 : 1; __IO uint32_t MUX : 1; } stc_lcd_poen1_field_t;
typedef struct { __IO uint32_t EN : 1; __IO uint32_t SCANCLK : 2; __IO uint32_t CPCLK : 2; __IO uint32_t BIASMODE : 1; __IO uint32_t DUTY : 3; __IO uint32_t BIASSRC : 3; __IO uint32_t CONTRAST : 4; } stc_lcd_cr0_field_t; 改为: typedef struct { __IO uint32_t EN : 1; __IO uint32_t LCDCLK : 2; __IO uint32_t CPCLK : 2; __IO uint32_t BIAS : 1; __IO uint32_t DUTY : 3; __IO uint32_t BSEL : 3; __IO uint32_t CONTRAST : 4; uint32_t RESERVED16 :15; __IO uint32_t RSV : 1; } stc_lcd_cr0_field_t;
|