/******************************************************************************
;  *   	@型号				  : MC32P8141
;  *   	@创建日期             : 2021.08.04
;  *   	@公司/作者			  : SINOMCU-FAE
;  *   	@晟矽微技术支持       : 2048615934
;  *   	@晟矽微官网           : http://www.sinomcu.com/
;  *   	@版权                 : 2021 SINOMCU公司版权所有.
;  *----------------------摘要描述---------------------------------
;  *   	   	   	        低频校准
                上电后初始化T0定时器，配置：FT0=LIRC 不分频
                启动T0，延时1S，读取CNTL、H关闭T0，
                计算此时 LOAD值，重新配置T0 1S中断 P17翻转
                
                如果需要2S、4S可以再第二次配置T0时修改分频
                如果需要0.5S、0.25S可以再第二次配置T0时将LOAD值右移 移位后装载值不能为0
   	   	   	   	如果修改了主频，对应的延时时间参数也需要修改
******************************************************************************/

#include "user.h"

/************************************************
;  *    @Function Name       : CLR_RAM
;  *    @Description         : 
;  *    @IN_Parameter        :
;  *    @Return parameter    :
;  ***********************************************/
void CLR_RAM(void)
{
__asm 
   	movai   0x7F 
   	movra   FSR0
   	clrr    INDF0
   	DJZR    FSR0 
   	goto    $ -2 
   	clrr    INDF0
__endasm;
}
/************************************************
;  *    @Function Name       : IO_Config
;  *    @Description         : io口初始化
;  *    @IN_Parameter      	 : 
;  *    @Return parameter    :
;  ***********************************************/
void IO_Init(void)
{
    IOP0 = 0x00; //io口数据位
    OEP0 = 0xff; //io口方向 1:out  0:in
    PUP0 = 0x00; //io口上拉电阻   1:enable  0:disable
    PDP0 = 0x00; //io口下拉电阻   1:enable  0:disable

    IOP1 = 0x00; //io口数据位
    OEP1 = 0xff; //io口方向 1:out  0:in
    PUP1 = 0x00; //io口上拉电阻   1:enable  0:disable
    PDP1 = 0x00; //io口下拉电阻   1:enable  0:disable

    P0ADCR = 0x00; //端口数模控制   1:模拟  0:数字
    P1ADCR = 0x00; //端口数模控制   1:模拟  0:数字
}
/************************************************
;  *    @Function Name       : Sys_Init
;  *    @Description         : 系统初始化
;  *    @IN_Parameter      	 : 
;  *    @Return parameter    :
;  ***********************************************/
void Sys_Init(void)
{
    GIE = 0;
    CLR_RAM();
    IO_Init();
    GIE = 1;
}
/************************************************
;  *    @Function Name       : Delay_1S
;  *    @Description         : 延时1s
;  *    @IN_Parameter        :
;  *    @Return parameter    :
;  ***********************************************/
void Delay_1S(void)
{

    while (1)
    {
        cntl++;
        if (cntl == 0)
        {
            cntm++;
            if (cntm == 0)
            {
                cnth++;
            }
        }
        if ((cnth >= DELAY_NUM_H) && (cntm >= DELAY_NUM_M) && (cntl >= DELAY_NUM_L))
        {
            break;
        }
    }
    // P17D=1;
    // __asm
    // T1END:
    //     	JZR	   	_cntl
    //     	goto   	$+4
    //     	JZR	   	_cntm
    //     	goto   	$+2
    //     	INCR   	   _cnth
    
    //     	MOVAI  	0xf0
    //     	RSUBAR 	_cntl
    //     	MOVAI  	0x48
    //     	RSBCAR 	_cntm
    //     	MOVAI  	0x01
    //     	RSBCAR 	_cnth
    //     	JBSET  	PFLAG,0
    //     	goto   	T1END
    // __endasm;
    // P17D=0;
}
/************************************************
;  *    @Function Name       : LIRC_ADJ
;  *    @Description         : 低频校准
;  *    @IN_Parameter        :
;  *    @Return parameter    :
;  ***********************************************/
void LIRC_ADJ(void)
{
    //T0
    T0IF = 0;
    T0EN = 0;

    T0CR = 0x10; //FLOSC 不分频
    T0LOADH = 0xff;
    T0LOADL = 0xff;
    T0IE=0; //关闭定时器0中断
    T0EN = 1;      //使能定时器0 

    P17D = 1;       //延时时间测试
   	Delay_1S();
    P17D = 0;       //延时时间测试

    u8_templ = 0xff - T0CNTL;
    u8_temph = 0xff - T0CNTH;
    u8_templ = 0xff - T0CNTL;
    u8_temph = 0xff - T0CNTH;   //为了稳定，读取两次
    T0EN = 0;       //关闭定时器
    T0IF = 0;  
   	//如果需要定时2S  选择2分频
    //如果需要定时0.5S  LOAD值右移，移位后装载值不能为0
    T0CR = 0x10; //FLOSC 不分频 1S
   	T0LOADH = u8_temph;
    T0LOADL = u8_templ;
    //T0LOADH = u8_temph>>1;
    //T0LOADL = u8_templ>>1;
    T0EN = 1;   //使能定时器0    
    T0IE = 1;   //使能定时器中断
}
void main(void)
{
    Sys_Init();
    LFEN = 1; //低频时钟工作
    while (!STBL); //等待低频稳定
    LIRC_ADJ();     //低频校准
    while (1)
    {
    }
}

void int_isr(void) __interrupt
{
__asm 
    movra   _abuf
    swapar  _PFLAG
    movra   _statusbuf
__endasm;
    if ((T0IE) && (T0IF))       //T0中断
    {
        T0IF = 0;
        //P17翻转
   	__asm       
        MOVAI 10000000B         
        XORRA IOP1
   	__endasm;
    }
__asm 
    swapar  _statusbuf
    movra   _PFLAG
    swapr   _abuf
    swapar  _abuf
__endasm;
}
