//*****************************************************   
//Copyright (c) 2021, 苏州华芯微电子股份有限公司
//All rights reserved                                 
//
//文件名称: HS16F3211-模拟UART接收
//摘    要: HS16F3211-模拟UART_RX功能演示 9600bps
//  		
//			UART_RX/FPB0 串口接收脚 接收到0x55 FPB2输出高 接收到0xAA FPB2输出低 
//当前版本: 1.0                                      
//作    者: 华芯微MCU组
//完成日期: 2021.08.31
//*****************************************************   

#include 	<hs16f3211.h> 

//***********************宏定义*****************************
#define  unchar     unsigned char 
#define  unint      unsigned int
#define  unlong     unsigned long

#define  DemoPortOut	FPB1

#define	 UART_RX		FPB0 //串口接收脚

#define	 CLRWDT()		asm("clrwdt")

volatile bit FINTEDG              @ ((unsigned)&OPTION_REG*8)+6;


bit f_uart_rx_startbit; //串口接收起始位标记位
bit f_uart_rxed; 		//串口接收一字节完成位标记位
unsigned char f_uart_rx_bits;
unsigned char rx_buf=0;

/*-------------------------------------------------
 *  函数名：GPIO_Init
 *	功能：  GPIO设置
 *  输入：  无
 *  输出：  无
 --------------------------------------------------*/	
void GPIO_Init(void) 
{
	OPTION= 0b00000000; //Bit7 INT1EDG, 外部中断1触发方式 0 INT1引脚下降沿触发
                        //Bit6 INTEDG, 外部中断 触发方式 0 INT引脚下降沿触发
                        //Bit5 T0CS, TMR0时钟源选择位 0 内部指令时钟
                        //Bit4 T0SE, TMR0时钟源边沿选择位 0 T0CKI引脚下降沿触发计数
                        //Bit3 PSA, 预分频分配位 0 预分频器分配给TMR0
                        //Bit2:0 PS[2:0], 预分频配置 000 '2分频
                        
    PORTA = 0b00000000;	
    IOSTA = 0b00000000;	//PA输入输出 0-输出 1-输入
                        //PA口->全输出

    PORTB = 0b00000000;	
    IOSTB = 0b00000001;	//PB输入输出 0-输出 1-输入
                        //PB口->全输出
}


//**************中断处理**********************************
void interrupt ISR(void)			//
{
	if(FINTIF)
	{
		FINTIF=0;	//清除外部中断0标记位
		TMR0 = 120; //TMR0 156us 进入TMR0中断
		//FEIS  = 0;	//PB0 IO功能
		
		DemoPortOut = ~DemoPortOut; //10us翻转电平
		
		FINTIE = 0;	//失能外部中断0
		
		FT0IF = 0;  //清除TMR0中断标记位
		FT0IE = 1;	//使能TMR0中断
		
		f_uart_rx_bits = 0;//接收0bit串口数据
		
		f_uart_rx_startbit = 0;
	}
    //定时器TMR0的中断处理**********************
	if(FT0IF) 
	{
		FT0IF = 0; //清除TMR0中断标记位 104us中断一次
		TMR0 = 162; //TMR0 104us中断一次
        
        DemoPortOut = ~DemoPortOut; //10us翻转电平
		
		f_uart_rx_bits++;
		if(f_uart_rx_bits<=8)
		{
			rx_buf >>= 1;
			if(UART_RX)
				rx_buf |= 0x80;
		}else{
			if(UART_RX)//接收停止位正确
			{
				f_uart_rxed=1;
			}
			//FEIS  = 1;	//PB0 INT功能
			FT0IE = 0;	//关闭TMR0中断
			FINTIF=0;	//清除外部中断0标记位
			FINTIE = 1;	//使能外部中断0
		}
	}
}

/*-------------------------------------------------
 *  函数名：DelayMs
 *	功能：  软件延时函数
 *  输入：  延时时间 单位 MS 存在一定的误差
 *  输出：  无
 --------------------------------------------------*/	
void DelayMs(unsigned char delayMs)
{
	unsigned char delay_us;
	while(delayMs--)
	{
		delay_us=247;
		while(delay_us--);
        CLRWDT();
	}
}


unsigned char dat=0;
//****主函数****//
void main(void) 
{
    GPIO_Init();
	
	FEIS  = 1;	//PB0 INT功能
	
	FINTEDG = 0;//外部中断 INT引脚下降沿触发中断
	
	FINTIF=0;	//清除外部中断0标记位
	FINTIE = 1;	//使能外部中断0
	
	FT0IF = 0;  //清除TMR0中断标记位
	FT0IE = 0;	//关闭TMR0中断
	FGIE  = 1;	//开全局中断
	
    while(1)
    {
      	CLRWDT();
		if(f_uart_rxed)
		{
			f_uart_rxed=0;
			
			if(rx_buf==0x55)
			{
				FPB2=1;
			}
			else if(rx_buf==0xaa)
			{
				FPB2=0;
			}
		}			
	}
}
