gaoyang9992006 发表于 2022-12-6 19:18

EV Board (MM32L0136C7P)测评】+SLCD外设的深度研究

其他片上外设我都用过了,就这个SLCD我没用过,如果让我设计电路,我一定让MCU与管脚的搭配有规律可寻,而本次活动的开发板规律不明显,那么如何对任意连接方式实现方便的驱动呢?思路参考我上一个贴子:

https://bbs.21ic.com/icview-3269640-1-1.html

上贴中我用Excel实现了该应用的快速求对应图形的8个显示寄存器值。本次项目我将通过C语言来实现快速求对应图形的显示寄存器值。
思路不再多说,参考上贴,本次仅公告C语言的循环实现等效的操作。该贴也可作为**后遗忘之时回头再参考的内容。希望大家也养成这个好习惯,将感悟和收获发帖分享,交流。
#include<stdio.h>
int main(void)
{
    int SEG={3,7,6,5,4,58,26,27,30,-1,-1,35,40,0,1,8,9,10,11,15,16,17,-1,20,19,22,21,28,29};
        int COM ={35,40,0,1};
        int Pxy;
        int x=0,y=0,i=0;
        unsigned int DR;
        /*SEG段码对应线设置,该板子为4个COM加2个SEG表示一组显示内容*/
        int segch1=4,segch2=5;

        for(i=0;i<8;i++) DR=0;

        for(x=0;x<4;x++)
                for(y=0;y<29;y++)
                        Pxy=0;

/*下面为显示矩阵,填写1的表示被选中*/
    Pxy=1; Pxy=1;
    Pxy=1; Pxy=1;
    Pxy=1; Pxy=1;
    Pxy=1; Pxy=1;


for(x=0;x<4;x++)
{
        for(y=segch1;y<segch2+1;y++)
      {
            if(Pxy==1)
                {
                  {
                        if(COM>=32)   DR[(2*x)+1] |= (1<<(COM-32));
                        else if(COM>=0) DR|=(1<<COM);
                        else printf("COM is error!");
                  }

                  {
                        if(SEG>=32)   DR |= (1<<(SEG-32));
                        else if(SEG>=0) DR|=(1<<SEG);
                        else printf("SEG is error!");

                  }
                }


            }

}
/*输出对应的显示寄存器值*/
for(i=0;i<8;i++)
          printf("DR[%d]=%d\n",i,DR);

return 0;
}

这与我Excel工具计算的结果是一致的。

接下来利用单片机来显示一个计数的方法,由于我们可以全部点亮所有的段,因此可以实现静态点亮LCD数码管,这比循环点亮的LED段码管好用多了。
/*
* Copyright 2022 MindMotion Microelectronics Co., Ltd.
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/

#include "board_init.h"
#include "lcd.h"
/*
* Macros.
*/
#define APP_SLCD_SEG_BITS_BUFF_LEN 2u

/*
* Variables.
*/
volatile uint32_t app_slcd_seg_bits;
const uint32_t app_slcd_com_pin_buff = {BOARD_SLCD_COM_PIN_BUFF};
const uint32_t app_slcd_seg_pin_buff = {BOARD_SLCD_SEG_PIN_BUFF};

/*
* Declerations.
*/
void app_delay(uint32_t delay);
void app_slcd_init(void);


/*
* Functions.
*/
int main(void)
{
        int i=0,j=0,x1,x2,x3,x4;
        int ch={0};
        BOARD_Init();

    app_slcd_init();

        uint32_t BOARD_SLCD_COM={BOARD_SLCD_COM_PIN_BUFF};
        uint32_t BOARD_SLCD_SEG={BOARD_SLCD_SEG_PIN_BUFF};       

        x1=0;
        x2=1;
        x3=2;
        x4=3;

    while (1)
    {
                        for(i=0;i<1999;i++)
                        {
                                ch=i/1000;
                                ch=(i%1000)/100;
                                ch=(i%100)/10;
                                ch=i%10;
                               
                                // COM0
                                BOARD_SLCD_PORT->DR0 =TAB]|TAB]|TAB]|TAB];
                                BOARD_SLCD_PORT->DR1 =TAB]|TAB]|TAB]|TAB];
                                // COM1                       
                                BOARD_SLCD_PORT->DR2 =TAB]|TAB]|TAB]|TAB];
                                BOARD_SLCD_PORT->DR3 =TAB]|TAB]|TAB]|TAB];               
                                // COM2                       
                                BOARD_SLCD_PORT->DR4 =TAB]|TAB]|TAB]|TAB];
                                BOARD_SLCD_PORT->DR5 =TAB]|TAB]|TAB]|TAB];
                                // COM3                       
                                BOARD_SLCD_PORT->DR6 =TAB]|TAB]|TAB]|TAB];               
                                BOARD_SLCD_PORT->DR7 =TAB]|TAB]|TAB]|TAB];       
                                app_delay(20u);
                               
                        }

    }
}

void app_slcd_init(void)
{
    /* Setup the SLCD engine. */
    SLCD_Init_Type slcd_init;
    slcd_init.ClockDiv0 = BOARD_SLCD_DIV0;
    slcd_init.ClockDiv1 = BOARD_SLCD_DIV1;
    slcd_init.ChargePumpClockDiv = BOARD_SLCD_CHARGEPUMPDIV;
    slcd_init.DutyCycle = BOARD_SLCD_DUTYCYCLE;
    slcd_init.BiasMode = BOARD_SLCD_BIASMODE;
    slcd_init.PowerSource = SLCD_PowerSource_Internal;
    slcd_init.ChargePumpMode = SLCD_ChargePumpMode_Boost;
    slcd_init.Brightness = BOARD_SLCD_BRIGHTNESS;
    slcd_init.EnableLowPowerMode = false;
    SLCD_Init(BOARD_SLCD_PORT, &slcd_init);

    /* Set common pin. */
    for (uint32_t com_x = 0; com_x < BOARD_SLCD_COM_NUM; com_x++)
    {
      SLCD_SetCOMxPinMux(BOARD_SLCD_PORT, com_x, app_slcd_com_pin_buff);
    }

    /* Set segment pin. */
    for (uint32_t seg_y = 0; seg_y < BOARD_SLCD_SEG_NUM; seg_y++)
    {
      SLCD_SetSegBitPinMux(BOARD_SLCD_PORT, app_slcd_seg_pin_buff);
    }

    /* Enable SLCD. */
    SLCD_Enable(BOARD_SLCD_PORT, true);
}


void app_delay(uint32_t delay)
{
    for (uint32_t i = 0u; i < delay; i++)
    {
      for (uint32_t j = 0u; j < BOARD_DELAY_COUNT; j++)
      {
            __NOP();
      }
    }
}

/* EOF. */
需要多少个就按位或多少个即可。非常好用。


显示对比度修改

#define BOARD_SLCD_BRIGHTNESS    10u
官方提供的扫线测试程序默认为5u,我这里修改成10u显示效果非常好。

weifeng90 发表于 2022-12-6 19:21

SLCD就是段码LCD

gaoyang9992006 发表于 2022-12-6 19:25

weifeng90 发表于 2022-12-6 19:21
SLCD就是段码LCD

是的,不过这个跟LED那种还不同,那个LED的通常是一个8段数码管共阴极共阳极连接,这个是阵列式连接。

xu@xupt 发表于 2022-12-10 13:23

感谢分享
页: [1]
查看完整版本: EV Board (MM32L0136C7P)测评】+SLCD外设的深度研究