0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用MM32L0130 SLCD驱动LCD显示

灵动MM32MCU 来源:灵动MM32MCU 作者:灵动MM32MCU 2022-10-21 10:54 次阅读

灵动股份推出的MM32L0130系列MCU具有片上SLCD液晶显示控制器,SLCD 驱动器是用于单色无源液晶显示器(SLCD)的数字驱动器,具有多达 8 个公共端和多达 63 个分段端, SLCD 引脚最多为 64 个,因此最多可驱动 240(60x4)或 448(56x8)个段码。驱动段码的最终数量由产品规格书中设备引脚的数目决定。

1SLCD介绍

1.1 SLCD功能框图

SLCD 驱动模块包括以下几个基本的子模块,如下图所示。

显示数据寄存器

SLCD 输出驱动引脚

时钟产生单元,包括时钟预分频器、帧时钟分频器、电荷泵时钟分频器和闪烁时钟分频器

闪烁控制器

内置升压电荷泵和偏置电压生成单元

时序控制和波形发生器

109444cc-5056-11ed-a3b6-dac502259ad0.png    

1.2 SLCD主要特征

显示帧率灵活控制

兼容 APB 接口

支持静态、 1/2、 1/3、 1/4、 1/6 和 1/8 占空比

支持 1/2、 1/3 和 1/4 偏置电压设置

为了存储显示数据,内置了 16*32bit 显示数据寄存器

通过软件来调整 SLCD 输出电压,来调节对比度

外围电路简单,不需要模拟器件支持

1)内嵌电容升压器来得到比电源电压更高而且不受其影响的 SLCD 驱动电压。升压器产生的 SLCD驱动电压范围可调,可以匹配支持 3V 或者 5V 的 LCD 屏幕

2)SLCD 驱动电源可以通过软件来选择内部电源或外部电源。

3)可以选择使用内嵌电容分压器对 SLCD 驱动电压进行分压,得到驱动电压的中间值(VLCDrail1,VLCDrail2, VLCDrail3, VLCDrail4)

两种调整显示对比度的方法

1)当采用内部升压器来提供 VLCD 电源时,可以通过软件调节 VLCD 输出电压

2)其它情况下可以在每帧显示之间插入死区时间

支持以下低功耗模式:低功耗运行模式,睡眠模式,低功耗睡眠模式,停止模式,深度停止模式,待机模式;在不需要显示的时候,可以完全关闭 SLCD 驱动以达到降低功耗的目的

支持相位反转模式,降低功耗和 EMI

每一帧显示开始的时候,通过中断信号与软件同步,更新显示数据

闪烁功能

1)可以从所有段码中任意选择 1 到 8 个段码闪烁显示,也可以闪烁显示全部段码

2)在静态、 1/2、 1/3、 1/4 占空比模式下可以闪烁显示任意段码

3)软件选择闪烁频率,支持闪烁频率 0.5Hz, 1Hz, 2Hz 或 4Hz

灵活的引脚复用功能,可以配置任意 LCD 驱动引脚成为 COM 或者 SEG 功能;SLCD 的驱动引脚在没有被配置成 SLCD 功能的时候,可以作为 GPIO 引脚来使用

SLCD 驱动电平(VLCDrail1, VLCDrail2, VLCDrail3, VLCDrail4)的去耦合功能

支持低功耗驱动波形

支持 DMA 传输

支持中断

2功能概述

2.1 显示数据寄存器

为了存储显示数据, SLCD 驱动模块内置了 16 个 32 比特显示数据寄存器。显示数据寄存器中的比特位与 LCD 显示屏上的段码一一对应, 如果要点亮 LCD 显示屏上的某个段码, 则需要把显示数据寄存器中的相对应的比特写为‘1’;反之如果要熄灭某个段码, 则需要把对应的比特写为‘0’, 如下图所示。

112334a2-5056-11ed-a3b6-dac502259ad0.png

在 static, 1/2, 1/3 和1/4 duty模式下,显示数据寄存器被划分为主显示数据寄存器片区(SLCD_DR[7:0])和辅助显示数据寄存器片区( SLCD_DR[15:8]);在 1/6 和 1/8 duty 模式下,显示数据寄存器(SLCD_DR[15:0])全部作为主显示数据寄存器片区使用,没有辅助显示数据寄存器片区的分划。显示数据寄存器的具体结构和详细的片区划分情况见下图:

1170a70a-5056-11ed-a3b6-dac502259ad0.png    

2.2 主/辅助显示数据寄存器

在 static,1/2,1/3和1/4 duty 模式下,可以通过 SLCD 帧控制寄存器(SLCD_FCR)中的DRSEL比特选择控制将主显示数据寄存器片区(SLCD_DR[7:0])或者辅助显示数据寄存器片区(SLCD_DR[15:8])的数据显示到 LCD 屏幕上,如果DRSEL为‘0’, 显示主显示数据寄存器片区的数据;如果 DRSEL 为‘1’,显示辅助显示数据寄存器片区的数据。SLCD 状态寄存器(SLCD_SR)中的 DRSS 比特可以指示出显示数据当前使用的显示数据寄存器片区, 如果当前使用的是主显示数据寄存器片区的数据, 则 DRSS 比特为‘0’;如果当前使用的是辅助显示数据寄存器片区的数据,则 DRSS 比特为‘1’。将 SLCD 帧控制寄存器(SLCD_FCR)中的 DRLC 比特置‘1’可以清除主显示数据寄存器片区的数据;将 DRHC 比特置‘1’可以清除辅助显示数据寄存器片区的数据。

2.3 COM 和 SEG 引脚配置

SLCD 模块提供公共端(COM)引脚和段(SEG)引脚的驱动。

2.4 SLCD 引脚配置

SLCD 的 SEG 和 COM 引脚是同通用功能 I/O 复用的。在不作为 SLCD 引脚使用时,这些引脚可以配置成通用功能 I/O 引脚。具体配置请参考通用功能 I/O 章节。

2.5 COM 和 SEG 引脚重映射

当作为 SLCD 引脚使用时,每一个 SLCD 引脚都可以被重映射为 COM 或者 SEG 引脚,以简化电路板上的布局布线。SLCD 模块支持从 L0 到 L63 最多 64 个 SLCD 引脚(SLCD 引脚的最终数量由产品规格书中设备引脚的数目决定),每一个引脚可以通过相应的 SLCD_CFGR0 和 SLCD_CFGR1 寄存器来配置,重映射其作为 COM 或者 SEG 功能。

2.6 时钟产生

时钟产生模块为波形发生模块和电荷泵模块提供各自所需的时钟,其结构如下:

11ab2b8c-5056-11ed-a3b6-dac502259ad0.png

时钟产生模块结构图

3实验

3.1 硬件设计

本次实验使用MM32L0130片上SLCD驱动LCD液晶屏显示。硬件使用灵动股份设计的EVB-L0136开发板,板载LCD接口可以适配GDC0689液晶屏,GDC0689具有半透和反射两种模式,6位8字、6点视角、宽温,适用于工业设备等产品。GDC0689液晶屏全显效果图如下:

11d2da42-5056-11ed-a3b6-dac502259ad0.png

EVB-L0136开发板LCD模块原理图如下:

12098f92-5056-11ed-a3b6-dac502259ad0.png

原理图1(LCD部分)

12538246-5056-11ed-a3b6-dac502259ad0.png

原理图2(MM32F0130部分)

3.2 程序设计

例程主要用到GDC0689液晶屏的数码管部分进行计数显示,以最右边的数码管作为小数部分,其余数码管作为整数部分,从最低位开始累加计数,满十就向前一位进1。

灵动股份设计了MM32F0130 SLCD相关的库函数以及API函数,容易理解和使用,代码较多,这里不再进行赘述,仅对部分主要程序进行分析。

3.21 SLCD测试函数

voidslcd_test(void)
{
slcd_init();
while(1){
LCD_DisplayDataUpdate();
DELAY_Ms(100);
}
}

3.22 SLCD初始化函数

void slcd_init()函数主要代码:

使能PWR、BKP时钟

RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1ENR_BKP,ENABLE);

使能SLCD时钟,软件复位SLCD

RCC_SLCD_ClockCmd(SLCD,ENABLE);
SLCD_DeInit();

SLCD的时钟源选择LSI,配置LSI时钟频率为40KHZ。


RCC_LSICLKConfig(RCC_LSICLKSource_40KHz);
RCC_LSICmd(ENABLE);
RCC_SLCDCLKConfig(RCC_SLCDCLKSource_LSI);

LSI作为SLCD时钟源,对应时钟预分频系数为4,分频系数为16

elseif(slcd_clk_source_freq<= LSI_VALUE) {
        pre_value = SLCD_Prescaler_4;
        div_value = SLCD_Divider_16;
    }

初始化SLCD结构体,配置1/4偏置、1/3占空比,VDD作为SLCD电源使能

slcd_struct.SLCD_Divider=div_value;
slcd_struct.SLCD_Duty=SLCD_Duty_1_4;
slcd_struct.SLCD_Bias=SLCD_Bias_1_3;
slcd_struct.SLCD_VoltageSource=SLCD_VoltSrcCapCharggDownVdd;
SLCD_Init(&slcd_struct);

SLCD pin对应的GPIO配置为SEG或COM,并使能

SLCD_IO_Config(&(SEGorCOM[0]));
//mustcallafterSLCD_init

配合SLCD COM索引寄存器

SLCD_COM_IndexInit(&(SCLD_COM_Index[0]));

配置电荷泵时钟分频为1024

SLCD_ChargePumpClockDivConfig(SLCD_ChargePumpClock_Div1024);

正常驱动波形

SLCD_LowPowerDriveCmd(DISABLE);

配置无死区插入,当在两帧之间插入死区时,SEG和COM信号电压为零

SLCD_DeadTimeConfig(SLCD_DeadTime_0);

清除显示数据寄存器

LCD_Clear();

关闭SLCD闪烁模式,闪烁时钟分频系数为512

SLCD_BlinkConfig(SLCD_BlinkMode_Off,SLCD_BlinkFrequency_Div512);

配置SLCD闪烁索引

SLCD_BLINK_IndexInit(SCLD_BLINK_Index);

3.23 LCD更新显示数据函数

LCD_DisplayDataUpdate()函数主要代码:

Number1=(Number1+1)%1000000;

if(Number1< 10) {
        LCD_DisplayNumber1(0, ' ', 0);
        LCD_DisplayNumber1(1, ' ', 0);
        LCD_DisplayNumber1(2, ' ', 0);
        LCD_DisplayNumber1(3, ' ', 0);
        LCD_DisplayNumber1(4, '0', 1);
        LCD_DisplayNumber1(5, '0' + Number1, 0);
    }
    else if(Number1 < 100) {
        LCD_DisplayNumber1(0, ' ', 0);
        LCD_DisplayNumber1(1, ' ', 0);
        LCD_DisplayNumber1(2, ' ', 0);
        LCD_DisplayNumber1(3, ' ', 0);
        LCD_DisplayNumber1(4, '0' + ((Number1 / 10) % 10), 1);
        LCD_DisplayNumber1(5, '0' + ((Number1 / 1 ) % 10), 0);
    }
    ......(省略余下代码)

其中LCD显示函数 void LCD_DisplayNumber1(u8 Index, char ch, u8 Point)用于配置数码管显示,函数的3个形参含义如下:

Index表示选中的数码管索引,对应6个数码管,可选值为0,1,2,3,4,5

ch表示要显示的数字,为char类型

Point表示该数码管是否显示Dp字段,显示则为1,否则为0

举例:代码中LCD_DisplayNumber1(5, '0' + Number1, 0)表示选中第5个数码管(最右),显示内容是Number的值,不显示Dp字段。

3.24 LCD显示函数

LCD_DisplayNumber1()函数主要代码:

voidLCD_DisplayNumber1(u8Index,charch,u8Point)
{
u8i;
charTAB[6][8][4]={//(1)
{"5A","5B","5C","5D","5E","5F","5G","DP5"},
{"6A","6B","6C","6D","6E","6F","6G","DP6"},
{"7A","7B","7C","7D","7E","7F","7G","DP7"},
{"8A","8B","8C","8D","8E","8F","8G","DP8"},
{"9A","9B","9C","9D","9E","9F","9G","DP9"},
{"10A","10B","10C","10D","10E","10F","10G",""},
};

u8COMn=0xFF,SEGn=0xFF;

u8Code=LCD_SearchCode(ch);//(2)

if(Code!=0xFF){
for(i=0;i< 7; i++) {
            LCD_SearchName(TAB[Index][i], &COMn, &SEGn);   // (3)

            if((COMn != 0xFF) && (SEGn != 0xFF)) {
                LCD_WriteBit(COMn, LCD_SEG_Table[SEGn][0], LCD_SEG_Table[SEGn][1], (Code >>i)&0x01);//(4)
}
}

LCD_SearchName(TAB[Index][7],&COMn,&SEGn);//(5)

if((COMn!=0xFF)&&(SEGn!=0xFF)){
LCD_WriteBit(COMn,LCD_SEG_Table[SEGn][0],LCD_SEG_Table[SEGn][1],Point);//(6)
}
}
}

1定义三维字符数组TAB[6][8][4],其中[6]对应6位“8”字,[8]对应“8”字的8段(含DP段),[4]表示元素的长度,对应各段的名称。

2形参ch表示要显示的数字,为char类型,LCD_SearchCode(char ch)函数用来遍历LCD_CODE_Table[38],如果传入的参数ch和LCD_CODE_Table[i].ch相等,则返回LCD_CODE_Table[i].Data,即该数字对应的段选信号。

3LCD_SearchName(TAB[Index][i], &COMn, &SEGn)函数遍历所有COM口(4)和SEG口(22),如果TAB[Index][i]和LCD_NAME_Table[i][j]相等,则获取COMn和SEGn的值,然后返回。

4获取COMn对应的显示数据寄存器索引,根据段选信号,给显示数据寄存器赋值。

5获取Dp段对应的COMn和SEGn的值,然后返回。

6获取COMn对应的显示数据寄存器索引,根据Dp段选信号,给显示数据寄存器赋值。

3.3 实验演示

下载程序运行,观察GDC0689液晶屏显示。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15235

    浏览量

    171207
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117741
  • lcd
    lcd
    +关注

    关注

    34

    文章

    4278

    浏览量

    164122
  • SLCD
    +关注

    关注

    0

    文章

    5

    浏览量

    9259
  • MM32
    +关注

    关注

    1

    文章

    105

    浏览量

    573

原文标题:灵动微课堂 (第232讲) | 使用MM32L0130 SLCD驱动LCD显示

文章出处:【微信号:MindMotion-MMCU,微信公众号:灵动MM32MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    转:SLCD驱动LCD寄存器操作简介

    LCD驱动LCD不像LED,加上电压就可长期显示了。LCD驱动必须使用交流电压
    发表于 06-07 11:38

    使用MM32L0130 IRM实现红外发码

    1、使用MM32L0130 IRM实现红外发码  红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易于实现等显著优点,被诸多电子设备包括消费电子、家用电器、安防
    发表于 10-21 14:22

    基于MM32L0130的低功耗电子时钟设计方案相关资料分享

    1、基于MM32L0130的低功耗电子时钟设计  MM32L0130作为灵动微电子推出的一款低功耗芯片,内置多种省电工作模式保证低功耗应用的要求。前面章节分别对MM32L0130片上外设SLC
    发表于 11-09 16:00

    请问有人使用IAR进行过MM32L0130的开发吗?

    我在使用IAR8.30进行MM32L0130开发板试用时遇到了一个棘手的问题,其例程能够下载到开发板(至少在IAR中任何报错,也可以在线调试),可是就是一直开在时钟配置阶段,一直没有配置成功,有人遇到过这样的问题吗?或者在调试其他单片机时是否有类似现象?麻烦指导一下解决办法
    发表于 12-18 21:48

    使用MM32L0130片上IRM模块实现红外发码

    灵动股份推出的MM32L0130系列MCU具有片上IRM红外调制器,该模块使用片上的定时器和串口,实现数据的 FSK/ASK 调制,以满足红外发码的需求。
    的头像 发表于 10-13 17:03 943次阅读

    MM32L0130 RTC日历和闹钟

    RTC 模块是用于提供时间(时、分、秒、亚秒)和日期(年、月、日)功能的定时计数器,日历以 BCD码的格式显示。内部包含周期性的唤醒单元,用于唤醒低功耗模式。支持夏令时补偿,支持数字校准补偿晶振精度的偏差。灵动微电子推出的MM32L0130系列MCU片上RTC外设具有以下
    的头像 发表于 10-28 10:37 954次阅读

    基于MM32L0130的低功耗电子时钟设计

    LCD显示、RTC日历和闹钟,其实SLCD与RTC都支持在特定的低功耗模式下运行,结合这两个外设特性,在前面实验的基础上,使用EVB_L0136开发板可以轻松实现一个低功耗电子时钟设计。本次微课堂通过讲述
    的头像 发表于 11-04 10:12 1089次阅读

    SLCD驱动的低功耗单片机MM32L0130

    SLCDLCD的一个高档衍生品种,采用世界最先进的工业级的液晶面板,使用寿命长达6万小时。SLCD是一个完整的拼接显示单元,既能单独作为显示
    的头像 发表于 11-21 17:10 760次阅读

    灵动微电子低功耗单片机MM32L0130开发板申请

    低功耗单片机MM32L0130采用的是M0+内核的32位MCU,工作频率高达48兆赫兹,内置64KB Flash,8KBSRAM的高速存储器,内置段码式液晶驱动SLCD,可驱动8x36
    的头像 发表于 11-21 17:15 609次阅读
    灵动微电子低功耗单片机<b class='flag-5'>MM32L0130</b>开发板申请

    集成段码LCD驱动低功耗系列MM32L0130

    灵动微集成段码LCD驱动低功耗系列MM32L0130搭载了最高主频为48MHz的Arm Cortex-M0+处理器;提供至多64KB的Flash存储空间和8KB的SRAM空间。   灵活易用
    发表于 01-31 15:50 263次阅读

    MM32L0130 产品手册(中文版)

    MM32L0130 产品手册(中文版)
    发表于 02-27 18:24 0次下载
    <b class='flag-5'>MM32L0130</b> 产品手册(中文版)

    MM32L0130 产品手册(英文版)

    MM32L0130 产品手册(英文版)
    发表于 02-27 18:25 0次下载
    <b class='flag-5'>MM32L0130</b> 产品手册(英文版)

    MM32L0130 用户手册(中文版)

    MM32L0130 用户手册(中文版)
    发表于 02-27 18:26 0次下载
    <b class='flag-5'>MM32L0130</b> 用户手册(中文版)

    MM32L0130 用户手册(英文版)

    MM32L0130 用户手册(英文版)
    发表于 02-27 18:26 0次下载
    <b class='flag-5'>MM32L0130</b> 用户手册(英文版)

    使用MM32L0130和HYS1254的电子秤方案验证

    NPI提了需求,需要验证使用友商SDADC芯片和MM32L0130微控制器集成的一个系统应用方案。
    的头像 发表于 10-17 17:16 325次阅读
    使用<b class='flag-5'>MM32L0130</b>和HYS1254的电子秤方案验证