LCD模块辅助软件(试用)
#申请原创#@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_tV_DataNum,uint8_tV_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_DisplayLCD 显示测试程序///*************************************************************************///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;
本帖最后由 martinhu 于 2022-7-5 18:11 编辑
附件已更新,修改最后几个LCD_RAM 地址定义的问题
欢迎大家试用,提出宝贵的意见。我们一直在努力!{:handshake:}{:handshake:} pw32 发表于 2021-2-19 17:20
欢迎大家试用,提出宝贵的意见。我们一直在努力!
你们是官方的? 东西是不错,如果能够支持所有的外设那就更好了。 fjhcpu 发表于 2021-2-19 19:56
你们是官方的?
是。 xyz549040622 发表于 2021-2-19 22:09
东西是不错,如果能够支持所有的外设那就更好了。
实现前和我们专门做这个图形化界面同事沟通过,通过XML文件和大系统交互。类似的图形化界面软件框架还在持续开发中。 该软件针对用户最方面的是:对于硬件工程师SEG管脚内部任意交换COM 管脚内部任意交换,极大方便了PCB layout。软件一键生成后,软件工程师只需要考虑写好业务逻辑层即可。 期待官方把软件生态做的越来越好,其他用户可以顺滑的切换到华大的平台。。 希望这样的软件可以越来越完善,最后像ST那样可以集成到一起 谢谢! 不错,支持一下。 这个软件太赞了,不错的一个小软件。
感谢楼主分享,如果要是可以在智能一些就好了。 这个软件有点偏简单,如果所有的初始化都可以配置就很美了。 这个软件真心的不错,很棒的。下载玩玩。
学习学习,还没用过这个功能 欢迎大家试用!提出宝贵意见! 这个软件实用性非常不错。 最好能提供一个基于华大官方的L136开发板的完整工程。。。看看是怎么配置的。 这红圈位置为啥还要填数据?不是应该是空的吗?