打印
[MM32硬件]

【EV Board (MM32L0136C7P)测评】+ 驱动LCD屏显示数据

[复制链接]
413|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 suncat0504 于 2022-12-6 13:38 编辑

#申请原创# @21小跑堂
开发板上的LCD是笔段式的LCD,MM32L0136C7P上已经利用GPIO的复用功能实现了它的驱动,这样我们不需要处理LCD的驱动处理了。实际上我一直比较头痛笔段式液晶的显示处理,因为涉及太多的知识点,自己也不愿意在这个上面花太多的时间。相比之下,点阵式液晶对于开发者而言更容易一些。手册中对于LCD的显示,有如下描述:

根据这个说明,我整理了下有关用寄存器赋值方式驱动LCD显示的资料。





根据上面四个图,只需要把各个段的数据根据位的对应信息,赋值到对应的DR(DR0~DR7)寄存器上,就可以自动实现数据的显示。我这么做的一个原因,没花时间去分析SLCD提供的例程中显示数据的处理逻辑。事实上,任何一位的数据都涉及到了8个寄存器的操作,平均每两个笔段,通过一组寄存器来显示。
按照这个处理逻辑,如果想在左上角第一位位置上显示1,需要进行如下处理:
// COM1:显示笔段D和小数点

BOARD_SLCD_PORT->DR0 = 0x00;

BOARD_SLCD_PORT->DR1 = 0x08;

// COM2:显示笔段C和E

BOARD_SLCD_PORT->DR2 = 0x80;

BOARD_SLCD_PORT->DR3 = 0x0100;

// COM3:显示笔段B和G

BOARD_SLCD_PORT->DR4 = 0x81;

BOARD_SLCD_PORT->DR5 = 0x00;

// COM4:显示笔段A和F

BOARD_SLCD_PORT->DR6 = 0x00;

BOARD_SLCD_PORT->DR7 = 0x00;

以上代码经过实测是OK的,利用SLCD显示例程,在此基础上,编写了处理数据显示用的函数。因为是笔段式的,所以可以自己组织笔段码数据,仿照以前用的数码管的那种形式来显示数据。基本思想就是根据不同的字符,找到对应的段码数据,赋值到对应的LCD_DR寄存器中,完成数据的整体显示。
显示效果如下:

处理代码只需要执行:show_row((uint8_t *)"01234-EA7C");就可以了。
在需要显示3个冒号、8个小数点以及其它可表示的符号时(实际测试,正像用户手册中说明的那样,S5~S8、W2~W4,L1~L4是不能被显示的,因为MCU没有提供电路上的支持),可以通过追加标志,利用标志位,给对应的LCD_DR寄存器的对应位进行赋值即可。
需要说明的是,各位数据的笔段显示分布,没有一致性规律。编程时一定要注意。
按照计划,完成显示处理后,追加键盘的输入处理。预想中,使用MCU中其它未被使用的GPIO口,和一个4X4键盘模块通讯,实现键盘数据的输入处理。结果实际测试不顺利啊,哪怕是最简单的LED输出控制,都没完成,原因还在调查中。
LCD的资料: GDC0689.pdf (270.94 KB)

使用特权

评论回复
沙发
chenjun89| | 2022-12-3 18:51 | 只看该作者
灵动这款MCU有段码驱动外设吗?

使用特权

评论回复
板凳
zhanzr21| | 2022-12-3 21:53 | 只看该作者
chenjun89 发表于 2022-12-3 18:51
灵动这款MCU有段码驱动外设吗?

有的, 楼主写的就是MCU直接驱动段码LCD.

使用特权

评论回复
地板
suncat0504|  楼主 | 2022-12-4 12:04 | 只看该作者
本帖最后由 suncat0504 于 2022-12-6 13:38 编辑

之前自己写了一个驱动,代码太长了。后来下载一个新的例程,就使用那个例程了。也挺好用的。 MM32L0130_LibSamples_V020_1201.zip (5.49 MB)
以下是使用它的代码,可供参考:
// 显示子字符串,包含左上角的和中间的
void show_row(uint8_t *str1) {
    uint8_t i=0;
    uint8_t j=0;
    uint8_t lcd_str[10];
    while(str1[i]!='\0') {
        if (i<10) {
            lcd_str[i] = str1[i];
        } else {
            break;
        }
        i++;
    }
   
    // 清除剩余位
    for (j=i; j<10; j++) {
        lcd_str[j]=0x00;
    }
    for (j=0; j<4; j++) {
        LCD_DisplayNumber2(j, lcd_str[j], 1);
    }
    for (j=0; j<6; j++) {
        LCD_DisplayNumber1(j, lcd_str[j], 1);
    }   
}
// 显示子字符串,包含中间的
void show_row1(uint8_t *str1) {
    uint8_t i=0;uint8_t j=0;
    uint8_t lcd_str[10];
    while(str1[i]!='\0') {
        if (i<6) {
            lcd_str[i] = str1[i];
        } else {
            break;
        }
        i++;
    }

    for (j=0; j<6; j++) {
        LCD_DisplayNumber1(j, lcd_str[j], 1);
    }   
}

// 显示子字符串,包含左上角的
void show_row2(uint8_t *str1) {
    uint8_t i=0;uint8_t j=0;
    uint8_t lcd_str[10];
    while(str1[i]!='\0') {
        if (i<4) {
            lcd_str[i] = str1[i];
        } else {
            break;
        }
        i++;
    }

    for (j=0; j<4; j++) {
        LCD_DisplayNumber2(j, lcd_str[j], 1);
    }   
}

// 显示冒号
void show_maohao(u8 col1, u8 col2, u8 col3) {
    if (col1) {
        SLCD->DR0  |= 1<<27;
    }
    if (col2) {
        SLCD->DR0  |= 1<<30;
    }
    if (col3) {
        SLCD->DR2  |= 1<<30;
    }
}
因为工程还在编写中,这不是最终结果。

使用特权

评论回复
5
suncat0504|  楼主 | 2022-12-4 12:08 | 只看该作者
本帖最后由 suncat0504 于 2022-12-4 12:18 编辑
chenjun89 发表于 2022-12-3 18:51
灵动这款MCU有段码驱动外设吗?

已经回答了,看上面回帖哈

使用特权

评论回复
6
wwppd| | 2022-12-6 12:57 | 只看该作者
MM32L0136C7P支持多大的刷新速度?

使用特权

评论回复
评论
suncat0504 2022-12-6 13:36 回复TA
板载的是SLCD,段码式。刷新速度,估计得看LCD(型号:GDC0689)。 
7
sanfuzi| | 2022-12-6 14:47 | 只看该作者
这个没有oled好用一些。              

使用特权

评论回复
评论
suncat0504 2022-12-6 14:51 回复TA
是啊,OLED可以自由输出图形、字符。这个LCD只能显示笔段 
8
bestwell| | 2022-12-9 21:51 | 只看该作者
笔段式的LCD功耗怎么样              

使用特权

评论回复
评论
suncat0504 2022-12-10 08:38 回复TA
功耗低 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:大连伊飞特信息技术有限公司软件工程师
简介:本人于1993年毕业于大连理工大学。毕业后从事单片机开发工作5年,之后转入软件开发工作至今。

87

主题

2413

帖子

4

粉丝