290 lines
10 KiB
C
290 lines
10 KiB
C
/******************************************************************************
|
||
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
|
||
*
|
||
* This software is owned and published by:
|
||
* Huada Semiconductor Co.,Ltd ("HDSC").
|
||
*
|
||
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
|
||
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
|
||
*
|
||
* This software contains source code for use with HDSC
|
||
* components. This software is licensed by HDSC to be adapted only
|
||
* for use in systems utilizing HDSC components. HDSC shall not be
|
||
* responsible for misuse or illegal use of this software for devices not
|
||
* supported herein. HDSC is providing this software "AS IS" and will
|
||
* not be responsible for issues arising from incorrect user implementation
|
||
* of the software.
|
||
*
|
||
* Disclaimer:
|
||
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
|
||
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
|
||
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
|
||
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
|
||
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
|
||
* WARRANTY OF NONINFRINGEMENT.
|
||
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
|
||
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
|
||
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
|
||
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
|
||
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
|
||
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
|
||
* SAVINGS OR PROFITS,
|
||
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
|
||
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
|
||
* FROM, THE SOFTWARE.
|
||
*
|
||
* This software may be replicated in part or whole for the licensed use,
|
||
* with the restriction that this Disclaimer and Copyright notice must be
|
||
* included with each copy of this software, whether used in part or whole,
|
||
* at all times.
|
||
*/
|
||
/******************************************************************************/
|
||
/** \file lcd.c
|
||
**
|
||
** lcd driver API.
|
||
**
|
||
** - 2019-04-02 First Version
|
||
**
|
||
******************************************************************************/
|
||
|
||
/******************************************************************************
|
||
* Include files
|
||
******************************************************************************/
|
||
#include "hc32l196_lcd.h"
|
||
|
||
|
||
/**
|
||
******************************************************************************
|
||
** \addtogroup AdcGroup
|
||
******************************************************************************/
|
||
//@{
|
||
|
||
/******************************************************************************
|
||
* Local pre-processor symbols/macros ('#define')
|
||
******************************************************************************/
|
||
|
||
/******************************************************************************
|
||
* Global variable definitions (declared in header file with 'extern')
|
||
******************************************************************************/
|
||
|
||
/******************************************************************************
|
||
* Local type definitions ('typedef')
|
||
******************************************************************************/
|
||
|
||
/******************************************************************************
|
||
* Local function prototypes ('static')
|
||
******************************************************************************/
|
||
|
||
/******************************************************************************
|
||
* Local variable definitions ('static')
|
||
******************************************************************************/
|
||
|
||
/*****************************************************************************
|
||
* Function implementation - global ('extern') and local ('static')
|
||
*****************************************************************************/
|
||
|
||
/**
|
||
******************************************************************************
|
||
** \brief 获取LCD中断标志位INTF
|
||
**
|
||
** @param 无
|
||
** \retval 无
|
||
**
|
||
******************************************************************************/
|
||
boolean_t Lcd_GetItStatus(void)
|
||
{
|
||
return (((M0P_LCD->CR1)>>11)&0x01)? TRUE : FALSE;
|
||
}
|
||
|
||
/**
|
||
******************************************************************************
|
||
** \brief 清除中断标志位INTF
|
||
**
|
||
** @param 无
|
||
** \retval 无
|
||
**
|
||
******************************************************************************/
|
||
void Lcd_ClearItPendingBit(void)
|
||
{
|
||
SetBit((uint32_t)(&(M0P_LCD->INTCLR)), 10, 0);
|
||
}
|
||
|
||
/**
|
||
******************************************************************************
|
||
** \brief 根据LCD显示模式获取端口配置
|
||
**
|
||
** \param pstcSegComPara:显示方式, stcSegCom获取端口参数
|
||
**
|
||
** \retval enRet 成功或失败
|
||
**
|
||
******************************************************************************/
|
||
en_result_t Lcd_GetSegCom(stc_lcd_segcompara_t *pstcSegComPara,stc_lcd_segcom_t *pstcSegCom)
|
||
{
|
||
en_result_t enRet = Error;
|
||
pstcSegCom->stc_seg32_51_com0_8_t.seg32_51_com0_8 = 0xffffffffu;
|
||
pstcSegCom->u32Seg0_31 = 0xffffffffu;
|
||
if(pstcSegComPara->u8MaxSeg>51)
|
||
{
|
||
return ErrorInvalidParameter;
|
||
}
|
||
switch(pstcSegComPara->LcdBiasSrc)
|
||
{
|
||
case LcdInResHighPower:
|
||
case LcdInResLowPower:
|
||
case LcdInResMidPower:
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Mux = 1;
|
||
break;
|
||
case LcdExtCap:
|
||
case LcdExtRes:
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Mux = 0;
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg32_35 = 0;
|
||
break;
|
||
default:
|
||
return ErrorInvalidParameter;
|
||
}
|
||
switch(pstcSegComPara->LcdDuty)
|
||
{
|
||
case LcdStatic:
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = (~1u)&0x0fu;
|
||
break;
|
||
case LcdDuty2:
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = (~3u)&0x0fu;
|
||
break;
|
||
case LcdDuty3:
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = (~7u)&0x0fu;
|
||
break;
|
||
case LcdDuty4:
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = (~15u)&0x0fu;
|
||
break;
|
||
case LcdDuty6:
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = 0;
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg39Com4 = 0;
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg38Com5 = 0;
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg37Com6 = 1;
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg36Com7 = 1;
|
||
break;
|
||
case LcdDuty8:
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = 0;
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg39Com4 = 0;
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg38Com5 = 0;
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg37Com6 = 0;
|
||
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg36Com7 = 0;
|
||
break;
|
||
default:
|
||
return ErrorInvalidParameter;
|
||
}
|
||
enRet = Ok;
|
||
return enRet;
|
||
}
|
||
|
||
/**
|
||
******************************************************************************
|
||
** \brief LCD COMSEG端口配置,使用该函数之前需要先使能相应的Seg
|
||
**
|
||
** \param [in] pstcSegCom端口配置结构体
|
||
**
|
||
** \retval enRet 成功或失败
|
||
**
|
||
******************************************************************************/
|
||
void Lcd_SetSegCom(stc_lcd_segcom_t *pstcSegCom)
|
||
{
|
||
M0P_LCD->POEN0 = pstcSegCom->u32Seg0_31;
|
||
M0P_LCD->POEN1 = pstcSegCom->stc_seg32_51_com0_8_t.seg32_51_com0_8;
|
||
}
|
||
|
||
/**
|
||
******************************************************************************
|
||
** \brief LCD模块初始化函数
|
||
**
|
||
** \param stcLcdCfg配置初始化结构体
|
||
**
|
||
** \retval 无
|
||
**
|
||
******************************************************************************/
|
||
void Lcd_Init(stc_lcd_cfg_t *pstcLcdCfg)
|
||
{
|
||
M0P_LCD->CR0_f.BSEL = pstcLcdCfg->LcdBiasSrc;
|
||
M0P_LCD->CR0_f.DUTY = pstcLcdCfg->LcdDuty;
|
||
M0P_LCD->CR0_f.BIAS = pstcLcdCfg->LcdBias;
|
||
M0P_LCD->CR0_f.CPCLK = pstcLcdCfg->LcdCpClk;
|
||
M0P_LCD->CR0_f.LCDCLK = pstcLcdCfg->LcdScanClk;
|
||
M0P_LCD->CR1_f.MODE = pstcLcdCfg->LcdMode;
|
||
M0P_LCD->CR1_f.CLKSRC = pstcLcdCfg->LcdClkSrc;
|
||
M0P_LCD->CR0_f.EN = pstcLcdCfg->LcdEn;
|
||
}
|
||
|
||
/**
|
||
******************************************************************************
|
||
** \brief 液晶全显
|
||
**
|
||
** \param 无
|
||
**
|
||
** \retval 无
|
||
**
|
||
******************************************************************************/
|
||
void Lcd_FullDisp(void)
|
||
{
|
||
uint8_t tmp;
|
||
volatile uint32_t *ram = NULL;
|
||
ram = &M0P_LCD->RAM0;
|
||
for(tmp=0;tmp<16;tmp++)
|
||
{
|
||
*ram = 0xffffffffu;
|
||
ram++;
|
||
}
|
||
}
|
||
|
||
/**
|
||
******************************************************************************
|
||
** \brief 清屏
|
||
**
|
||
** \param 无
|
||
**
|
||
** \retval 无
|
||
**
|
||
******************************************************************************/
|
||
void Lcd_ClearDisp(void)
|
||
{
|
||
uint8_t tmp;
|
||
volatile uint32_t *ram = NULL;
|
||
ram = &M0P_LCD->RAM0;
|
||
for(tmp=0;tmp<16;tmp++)
|
||
{
|
||
*ram = 0;
|
||
ram++;
|
||
}
|
||
}
|
||
|
||
/**
|
||
******************************************************************************
|
||
** \brief LCD RAM 0-f寄存器设置函数
|
||
**
|
||
** \param u8Row RAM地址索引,范围:0-15,u8Data写入寄存器数值
|
||
**
|
||
** \retval enRet 成功或失败
|
||
**
|
||
******************************************************************************/
|
||
en_result_t Lcd_WriteRam(uint8_t u8Row,uint32_t u32Data)
|
||
{
|
||
en_result_t enRet = Error;
|
||
volatile uint32_t *ram = NULL;
|
||
ram = (volatile uint32_t*)&M0P_LCD->RAM0;
|
||
|
||
if (u8Row > 15)
|
||
{
|
||
enRet = ErrorInvalidParameter;
|
||
return enRet;
|
||
}
|
||
|
||
ram += u8Row;
|
||
*ram = u32Data;
|
||
enRet = Ok;
|
||
return enRet;
|
||
}
|
||
|
||
/******************************************************************************
|
||
* EOF (not truncated)
|
||
******************************************************************************/
|
||
|