打印
[开发工具]

LCD模块辅助软件(试用)

[复制链接]
30504|103
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
martinhu|  楼主 | 2021-2-19 17:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#申请原创#@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;





HDSC_LCD_Software.zip

93.79 KB

使用特权

评论回复
来自 2楼
martinhu|  楼主 | 2022-7-4 11:12 | 只看该作者
本帖最后由 martinhu 于 2022-7-5 18:11 编辑

附件已更新,修改最后几个LCD_RAM 地址定义的问题

HDSC_LCD_Software.zip

93.79 KB, 阅读权限: 10

使用特权

评论回复
板凳
pw32| | 2021-2-19 17:20 | 只看该作者
欢迎大家试用,提出宝贵的意见。我们一直在努力!

使用特权

评论回复
地板
fjhcpu| | 2021-2-19 19:56 | 只看该作者
pw32 发表于 2021-2-19 17:20
欢迎大家试用,提出宝贵的意见。我们一直在努力!

你们是官方的?

使用特权

评论回复
5
xyz549040622| | 2021-2-19 22:09 | 只看该作者
东西是不错,如果能够支持所有的外设那就更好了。

使用特权

评论回复
6
pw32| | 2021-2-20 09:21 | 只看该作者
fjhcpu 发表于 2021-2-19 19:56
你们是官方的?

是。

使用特权

评论回复
7
pw32| | 2021-2-20 09:23 | 只看该作者
xyz549040622 发表于 2021-2-19 22:09
东西是不错,如果能够支持所有的外设那就更好了。

实现前和我们专门做这个图形化界面同事沟通过,通过XML文件和大系统交互。类似的图形化界面软件框架还在持续开发中。

使用特权

评论回复
8
pw32| | 2021-2-20 09:26 | 只看该作者
该软件针对用户最方面的是:对于硬件工程师SEG管脚内部任意交换COM 管脚内部任意交换,极大方便了PCB layout。软件一键生成后,软件工程师只需要考虑写好业务逻辑层即可。

使用特权

评论回复
9
fjhcpu| | 2021-2-20 10:34 | 只看该作者
期待官方把软件生态做的越来越好,其他用户可以顺滑的切换到华大的平台。。

使用特权

评论回复
10
HuangHongLun| | 2021-2-20 11:21 | 只看该作者
希望这样的软件可以越来越完善,最后像ST那样可以集成到一起

使用特权

评论回复
11
zcx11| | 2021-2-20 16:53 | 只看该作者
谢谢!

使用特权

评论回复
12
天意无罪| | 2021-2-20 17:36 | 只看该作者
不错,支持一下。

使用特权

评论回复
13
勇者无惧你和我| | 2021-2-22 11:55 | 只看该作者
这个软件太赞了,不错的一个小软件。

使用特权

评论回复
14
勇敢的大白菜| | 2021-2-22 12:11 | 只看该作者
感谢楼主分享,如果要是可以在智能一些就好了。

使用特权

评论回复
15
杨寅辉| | 2021-2-22 19:47 | 只看该作者
这个软件有点偏简单,如果所有的初始化都可以配置就很美了。

使用特权

评论回复
16
勇敢的大白菜| | 2021-2-24 09:02 | 只看该作者
这个软件真心的不错,很棒的。下载玩玩。

使用特权

评论回复
17
稳稳の幸福| | 2021-2-24 21:42 | 只看该作者
学习学习,还没用过这个功能

使用特权

评论回复
18
pw32| | 2021-3-12 16:51 | 只看该作者
欢迎大家试用!提出宝贵意见!

使用特权

评论回复
19
RobinQcp| | 2021-3-15 15:22 | 只看该作者
这个软件实用性非常不错。

使用特权

评论回复
20
ZYQFBW| | 2021-4-11 19:46 | 只看该作者
最好能提供一个基于华大官方的L136开发板的完整工程。。。看看是怎么配置的。

使用特权

评论回复
21
ZYQFBW| | 2021-4-11 20:05 | 只看该作者
这红圈位置为啥还要填数据?不是应该是空的吗?

QQ截图20210411200454.png (93.53 KB )

QQ截图20210411200454.png

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

1107

帖子

8

粉丝