一、简介
Renesas RA4L1 微控制器(MCU)内置 Segment LCD Controller (SLCDC),可直接驱动 静态、1/2、1/3、1/4 Bias 的段式 LCD 显示屏,无需额外的 LCD 驱动芯片。
二、LCD显示器
LCD引脚图


三、LCD硬件电路
板子上LCD驱动部分硬件电路图

四、配置
4.1、配置slcd驱动参数

4.2、配置引脚
根据slcd硬件电路,选择对应的驱动引脚

五、程序部分
5.1、fun_slcd.c
#include "hal_data.h"
const uint8_t slcd_m[][2] =
{
0x0D,0x07,
0x00,0x06,
0x0e,0x03,
0x0a,0x07,
0x03,0x06,
0x0B,0x05,
0x0F,0x05,
0x00,0x07,
0x0F,0x07,
0x0B,0x07,
0x00,0x00,
0x0c,0x04,
};
void init_slcd(void)
{
fsp_err_t err;
err = R_SLCDC_Open(&g_slcdc0_ctrl, &g_slcdc0_cfg);
assert(FSP_SUCCESS == err);
R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MILLISECONDS);
err = R_SLCDC_Start(&g_slcdc0_ctrl);
assert(FSP_SUCCESS == err);
}
void lcd_disp_adv(uint16_t adv)
{
uint8_t adv_h=0;
uint8_t adv_l1=0;
uint8_t adv_l2=0;
adv_h = adv/100;
adv_l1 = (adv%100)/10;
adv_l2 = (adv%100)%10;
R_SLCDC_Modify(&g_slcdc0_ctrl, 3, slcd_m[10][0], 0xF);
R_SLCDC_Modify(&g_slcdc0_ctrl, 11,slcd_m[10][1], 0xF);
R_SLCDC_Modify(&g_slcdc0_ctrl, 15, slcd_m[10][0], 0xF);
R_SLCDC_Modify(&g_slcdc0_ctrl, 16, slcd_m[10][1], 0xF);
R_SLCDC_Modify(&g_slcdc0_ctrl, 22, slcd_m[10][0], 0xF);
R_SLCDC_Modify(&g_slcdc0_ctrl, 23, slcd_m[10][1], 0xF);
R_SLCDC_Modify(&g_slcdc0_ctrl, 24, slcd_m[adv_h][0], 0xF);
R_SLCDC_Modify(&g_slcdc0_ctrl, 29, slcd_m[adv_h][1]|0x08, 0xF);
R_SLCDC_Modify(&g_slcdc0_ctrl, 30, slcd_m[adv_l1][0], 0xF);
R_SLCDC_Modify(&g_slcdc0_ctrl, 39, slcd_m[adv_l1][1], 0xF);
R_SLCDC_Modify(&g_slcdc0_ctrl, 40, slcd_m[adv_l2][0], 0xF);
R_SLCDC_Modify(&g_slcdc0_ctrl, 41, slcd_m[adv_l2][1], 0xF);
}
5.2、fun_slcd.h
#ifndef FUN_SLCD_H_
#define FUN_SLCD_H_
void init_slcd(void);
void lcd_disp_adv(uint16_t adv);
#endif
5.3、hal_entry.c
void hal_entry(void)
{
init_uart9();
init_adc();
init_slcd();
while(1)
{
test_adc();
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_01, BSP_IO_LEVEL_HIGH);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_10, BSP_IO_LEVEL_HIGH);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_09, BSP_IO_LEVEL_HIGH);
R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_01, BSP_IO_LEVEL_LOW);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_10, BSP_IO_LEVEL_LOW);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_09, BSP_IO_LEVEL_LOW);
R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);
}
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}
5.4、fun_adc.c
void test_adc(void)
{
fsp_err_t err;
uint16_t adc_data25=0;
double a25;
uint16_t adv=0;
(void) R_ADC_ScanStart(&g_adc0_ctrl);
scan_complete_flag = false;
while (!scan_complete_flag)
{
}
err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_25, &adc_data25);
a25=(double)(adc_data25/4095.0)*3.3;
adv=(uint8_t)(a25*100);
printf("P510(AN25)=%d,voltage=%f adv=%d\\\\r\\\\n",adc_data25,a25,adv);
lcd_disp_adv(adv);
}
六、运行结果
程序运行后,调整电位器改变ADC采样的电压,SLCD显示电压值。