打印
[MM32软件]

EV Board (MM32L0136C7P)测评】+SLCD外设探秘

[复制链接]
344|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 gaoyang9992006 于 2022-11-30 22:10 编辑

       说来惭愧,第一次使用LCD段码屏,无从下手,然后认真阅读了芯片手册与LCD屏模块手册,并跟多位大佬沟通学习,现在有所收获,特来分享学习成果和经验,帮助后来者,并作为自己学习的笔记,以备遗忘。

根据手册,芯片内部提供了显示数据寄存器,因此我们要显示的内容是要装填到该寄存器区域。然后片内SLCD外设会将这些数据映射到对应的管脚上。
这次开发板自带的屏幕的SEG段码引脚几本书都在如下红框区域了。共用端口4个COM0~COM3,对应LCD屏手册上的COM1~COM4,这里要注意,起始编号不同。

应注意以下关键词:SLCD 模块提供公共端(COM)引脚和段(SEG)引脚的驱动。

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

这其中的难点在于理解L0到L63是什么,需要查看数据手册4.2 引脚定义表,L0到L63为映射到IO端口上的复用LCD功能引脚。
这里可以结合库函数中的部分内容一起阅读更好理解。
本开发板上单片机与LCD引脚的对应关系为
#define BOARD_SLCD_COM0_PIN   35u /* COM0 -> L35. */
#define BOARD_SLCD_COM1_PIN   40u /* COM1 -> L40. */
#define BOARD_SLCD_COM2_PIN   0u  /* COM2 -> L0. */
#define BOARD_SLCD_COM3_PIN   1u  /* COM3 -> L1. */

#define BOARD_SLCD_SEG0_PIN   3u  /* Segment 0 -> L3. */
#define BOARD_SLCD_SEG1_PIN   7u  /* Segment 1 -> L7. */
#define BOARD_SLCD_SEG2_PIN   6u  /* Segment 2 -> L6. */
#define BOARD_SLCD_SEG3_PIN   5u  /* Segment 3 -> L5. */
#define BOARD_SLCD_SEG4_PIN   4u  /* Segment 4 -> L4. */
#define BOARD_SLCD_SEG5_PIN   58u /* Segment 5 -> L58. */
#define BOARD_SLCD_SEG6_PIN   26u /* Segment 6 -> L26. */
#define BOARD_SLCD_SEG7_PIN   27u /* Segment 7 -> L27. */
#define BOARD_SLCD_SEG8_PIN   30u /* Segment 8 -> L30. */

#define BOARD_SLCD_SEG15_PIN  8u /* Segment 15 -> L8. */
#define BOARD_SLCD_SEG16_PIN  9u /* Segment 16 -> L9. */
#define BOARD_SLCD_SEG17_PIN  10u /* Segment 17 -> L10. */
#define BOARD_SLCD_SEG18_PIN  11u /* Segment 18 -> L11. */
#define BOARD_SLCD_SEG19_PIN  15u /* Segment 19 -> L15. */
#define BOARD_SLCD_SEG20_PIN  16u /* Segment 20 -> L16. */
#define BOARD_SLCD_SEG21_PIN  17u /* Segment 21 -> L17. */

#define BOARD_SLCD_SEG23_PIN  20u /* Segment 23 -> L20. */
#define BOARD_SLCD_SEG24_PIN  19u /* Segment 24 -> L19. */
#define BOARD_SLCD_SEG25_PIN  22u /* Segment 25 -> L22. */
#define BOARD_SLCD_SEG26_PIN  21u /* Segment 26 -> L21. */
#define BOARD_SLCD_SEG27_PIN  28u /* Segment 27 -> L28. */
#define BOARD_SLCD_SEG28_PIN  29u /* Segment 28 -> L29. */
其中
Segment 0 ~Segment 28 以及COM0~COM3对应LCD屏上的1到29针脚,分布如下图所示,所以12到15针脚这里要配置成COM0到COM3,即下图中对应的COM1到COM4,这里主意编号的起始号。

另外观察上屏PIN1:PIN2如果移动2位就刚好对应3和4映射到第二个八段数码管,以此类推,我们可以定义出第一个的字码表,通过移位操作即可实现其他的八段数码管控制,前提是L0到L63也是按顺序与LCD屏幕的针脚连接的。因此如果自己设计原理图的话,可以注意一下这里的细节,目前开发板上并未按顺序连接。
于是我对照手册与头文件中已经定义好的编码做了如下定义,实现编号为1的数码管上显示0到F,以及“.”点的显示,共计17个字符,由于4个COM端口对应四组寄存器
所以定义为如下17行4列数组。
uint32_t TAB1[17][4]={
{(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),(1<<BOARD_SLCD_SEG1_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},//0
{0,(1<<BOARD_SLCD_SEG1_PIN),(1<<BOARD_SLCD_SEG1_PIN),0},                                                                                                    //1
{(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),(1<<BOARD_SLCD_SEG1_PIN)},                           //2
{(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG1_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),(1<<BOARD_SLCD_SEG1_PIN)},                           //3
{0,(1<<BOARD_SLCD_SEG1_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),(1<<BOARD_SLCD_SEG0_PIN)},                                                  //4
{(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG1_PIN),(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},                           //5
{(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},//6
{0,(1<<BOARD_SLCD_SEG1_PIN),(1<<BOARD_SLCD_SEG1_PIN),(1<<BOARD_SLCD_SEG1_PIN)},                                                                             //7
{(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},//8
{(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG1_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},//9
{0,((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},//A
{(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG0_PIN)},                               //b
{(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG0_PIN),0,((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},                                                      //C
{(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN)),0},                           //d
{(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},                               //E
{0,(1<<BOARD_SLCD_SEG0_PIN),(1<<BOARD_SLCD_SEG0_PIN),((1<<BOARD_SLCD_SEG0_PIN)|(1<<BOARD_SLCD_SEG1_PIN))},                                                      //F
{(1<<BOARD_SLCD_SEG1_PIN),0,0,0}                                                                                                                                //.
};


然后我们编写测试程序
int main(void)
{
        int i=0;
        BOARD_Init();

    app_slcd_init();
  //  app_slcd_display();
    while (1)
    {
                        for(i=0;i<17;i++)
                        {
                                // COM0
                                BOARD_SLCD_PORT->DR0 =TAB1[i][0];
                                // COM1                        
                                BOARD_SLCD_PORT->DR2 =TAB1[i][1];
                                // COM2                        
                                BOARD_SLCD_PORT->DR4 =TAB1[i][2];
                                // COM3                        
                                BOARD_SLCD_PORT->DR6 =TAB1[i][3];

                                app_delay(100u);                        
                        }
                        
    }
}
运行效果





使用特权

评论回复
沙发
coslight| | 2022-12-1 10:29 | 只看该作者
写的挺好,感觉明白点slcd的使用方法了

使用特权

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

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1896

主题

15629

帖子

198

粉丝