/******************************************************************************
;  *   	@MCU				 : MC51F003A4
;  *   	@Create Date         : 2021.10.11
;  *   	@Author/Corporation  : Martin/SinoMCU
;  *   	@晟矽微技术支持QQ 	 : 2048615934
;  *    @晟矽微官网		     : http://www.sinomcu.com/
;  *   	@Copyright           : 2020 SINOMCU Corporation,All Rights Reserved.
;  *----------------------Abstract Description---------------------------------
;  *			          AD库，调用函数使用，正常情况下不需要修改                                		
******************************************************************************/
#include "ADC_LIB.h"

/************************************************
;  *    @Function Name       : ADC_Init
;  *    @Description         : 
;  *    @IN_Parameter      	 :  ADCx AD配置参数
;  *    @Return parameter    :
;  ***********************************************/
void ADC_Init(ADC_InitTypeDef *ADCx)
{
    ADCCR0 = REG_CLR;
    ADCCR1 = REG_CLR;
    ADRIOS0 = REG_CLR;
    ADRIOS1 = REG_CLR; //寄存器清0

    if (ADCx->ADC_vref == ADC_VREF_EXT_VREF) //选择外部参考电压
    {
        ADRIOS1 |= DEF_SET_BIT5; //选择外部参考电压
        //Vref(P20)引脚输入有效,且ADC模块强制将Vref电压作为AD的参考电压使用,
        //这时无视ADC参考电压选择位（VRS[1:0]）的值。
    }
    ADCCR0 |= (ADCx->ADC_chx | ADCx->ADC_vref);                                     //设置通道/参考电压
    ADCCR1 |= (ADCx->ADC_data_sel | ADCx->ADC_clock_division | ADCx->ADC_sam_time); //设置数据格式/AD时钟/采样时间
    ADRIOS0 |= ADCx->ADC_IOx & 0x00ff;
    ADRIOS1 |= ADCx->ADC_IOx >> 8;     //设置IO口
    if (ADCx->ADC_interrupt == ENABLE) //使能ADC中断
    {
        IP &= ~ADC_INT_PRI_ADDR;
        IPH &= ~ADC_INT_PRI_ADDR;    //中断优先级低
        ADCIE = ADCx->ADC_interrupt; //ADC中断
        if (ADCx->ADC_interrupt_priority == HIGH)
        {
            IP |= ADC_INT_PRI_ADDR; //中断优先级高
        }
    }
    else
    {
        ADCIE = ADCx->ADC_interrupt; //ADC中断
        IP &= ~ADC_INT_PRI_ADDR;
        IPH &= ~ADC_INT_PRI_ADDR; //中断优先级低
    }
}
/************************************************
;  *    @Function Name       : ADC_Cmd
;  *    @Description         : AD 使能位
;  *    @IN_Parameter      	 :
;  *    @Return parameter    :
;  ***********************************************/
void ADC_Cmd(uint8_t newstate)
{
    if (newstate == ENABLE)
        SET_ADEN(); //使能ADC模块
    else
        CLR_ADEN(); //关闭ADC模块
}
/************************************************
;  *    @Function Name       : ADC_IO_Configure
;  *    @Description         : AD IO配置
;  *    @IN_Parameter      	 :
;  *    @Return parameter    :
;  ***********************************************/
void ADC_IOConfigure(uint16_t IOX)
{
    ADRIOS0 = REG_CLR;                         //清除
    ADRIOS1 &= ~(DEF_SET_BIT1 | DEF_SET_BIT0); //清除
    ADRIOS0 |= IOX & 0xff;                     //设置IO
    ADRIOS1 |= IOX >> 8;                       //设置IO
}
/************************************************
;  *    @Function Name       : ADC_Channel_Configure
;  *    @Description         : AD 通道设置
;  *    @IN_Parameter      	 :
;  *    @Return parameter    :
;  ***********************************************/
void ADC_Channel_Configure(uint8_t CH)
{
    ADCCR0 &= ~ADC_CHX_ADDR;
    ADCCR0 |= CH;
}
/************************************************
;  *    @Function Name       : ADC_Value_4H_8L
;  *    @Description         : 读取ADC的值 
;  *    @IN_Parameter      	 :
;  *    @Return parameter    :
;  ***********************************************/
uint16_t ADC_Value_4H_8L(void)
{
    uint16_t temp = 0;
    temp = ADRH << 8;
    temp += ADRL;
    return temp;
}
/************************************************
;  *    @Function Name       : ADC_Value_8H_4L
;  *    @Description         : 读取ADC的值 
;  *    @IN_Parameter      	 :
;  *    @Return parameter    :
;  ***********************************************/
uint16_t ADC_Value_8H_4L(void)
{
    uint16_t temp = 0;
    temp = ADRH << 4;
    temp = temp + ADRL;
    return temp;
}
/************************************************
;  *    @Function Name       : ADC_StartOneConversion
;  *    @Description         : 启动一次转换 
;  *    @IN_Parameter      	 :
;  *    @Return parameter    :
;  ***********************************************/
void ADC_Start_One_Conversion(void)
{
    CLR_ADEOC(); //启动转换
}
/************************************************
;  *    @Function Name       : ADC_GetFlagStatus
;  *    @Description         : 读取转换标志位 
;  *    @IN_Parameter      	 :
;  *    @Return parameter    :
;  ***********************************************/
flagstatus ADC_Get_FlagStatus(void)
{
    flagstatus bitstatus = RESET;
    if ((ADCCR0 & ADC_ADEOC_ADDR) != (uint8_t)RESET)
    {
        bitstatus = SET;
    }
    else
    {
        bitstatus = RESET;
    }
    return bitstatus;
}

/**************************** end of file *********************************************/
