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)
|
|||
|
******************************************************************************/
|
|||
|
|