//*********************************************************************** 
//Copyright (c) 2022, 苏州华芯微电子股份有限公司
//All rights reserved                                 
//文件名称: main.c
//摘    要: ADC输入实验
//          
//
//当前版本: 1.0                                      
//作    者: 华芯微MCU组
//完成日期: 2022.03.09
//*********************************************************************** 
#include 	<hs16f3612.h>  	
#include 	<main.h>	 
//******************************************************
unsigned char BSREG_Buf;	//System Use
unsigned char TX_Flag = 0;

unsigned char SendIndex = 0x00;
unsigned char EEtestdat = 0x00;
unsigned char EEerr_Flag = 0x00;

unsigned char Ad_sdata_l = 0x00;
unsigned char Ad_sdata_h = 0x00;

//****interrupt function****//
/*-------------------------------------------------
 *  函数名称：Interrupt
 *  功能：   中断处理函数
 *  输入参数：无
 *  返回参数：无 
 -------------------------------------------------*/
void interrupt myIsr(void)    
{
//BSREG_SAVE
	BSREG_Buf = BSREG;

//--------------------------------------------	
	GOTO_BANK0;
	

    if ((IFTX == 1)&&(TXIE ==1))
    {
		IFTX = 0;		//只读位  自动清0的  软件清不清都一样
		TX_Flag = 1;
    }
    
  
    
    
    if((ADCIE==1)&&(ADCIF ==1))
    {
    	ADCIF =0;
    
    }
    	
//-----------------------------------------------	
//BANK_RECOVER
	BSREG = BSREG_Buf;
} 
//char RAM20 @ 0X25;
//char RAMA0 @ 0XA5;
//char RAM120 @ 0X125;
//char RAM1A0 @ 0X1A5;

//****UART configuration****//
void UART_Init(void)
{
	//--00 0000;UART端口选择
	//PFACES = 0x0A;	//--00 1010;TX=PB3;RX=PB4;
	PFACES = 0x02;	//--00 0010;TX=PB3;RX=NULL;
	//FTXEN =1;	

	//波特率	8M-19200
	SPBRG = BRGDAT_L;
	SPBRGH =BRGDAT_H;
	
	//发送使能
	TXSTA = 0x20;	//0010 -000;  TXEN
	
	//接收使能  串口使能
	RCSTA = 0x90;	//1001 0000;SPEN 
	
	//TX RX中断配置
	BAUDCTL = 0x10;	//-011 0-11;TX中断使能 16位波特率

	//RXREG = 0x00;
	TXREG = 0x00;	//发送数据
	
	FGIE  = 1;
}


//****GPIO configuration****//
/*-------------------------------------------------
 *  函数名称:GPIO_Init
 *  功能：   IO初始化函数
 *				
 *  输入参数：无
 *  返回参数：无
 -------------------------------------------------*/
void GPIO_Init(void) 
{
//;PORTA
	PORTA = 0b00000000;	//PA输出赋值
	TRISA = 0b00000000;	//PA输入输出配置 :0-输出  ;1=输入
	PAODCON = 0b00000000;	//PA漏极开路配置 :1-使能  ;0-禁止
	PAHCON = 0b11111111;	//PA内部上拉配置 :1-禁止  ;0-使能
	PADCON = 0b11111111;	//PA内部下拉配置 :1-禁止  ;0-使能
	WUACON = 0b00000000;	//PA端口唤醒配置 :1-使能  ;0-禁止
	PAIC0 = 0b00000000;	//启动加强驱动   :1-加强驱动;0-默认驱动
	PORTA = 0b00000000;	//PA输出赋值	
//----------------------------------------------------------------------
//;PORTB
	PORTB = 0b00000000;	//PB输出赋值
	TRISB = 0b00100110;	//PB输入输出配置 :0-输出  ;1=输入
	PBODCON = 0b00000000;	//PB漏极开路配置 :1-使能  ;0-禁止
	PBHCON = 0b11111111;	//PB内部上拉配置 :1-禁止  ;0-使能
	PBDCON = 0b11111111;	//PB内部下拉配置 :1-禁止  ;0-使能
	WUBCON = 0b00000000;	//PB端口唤醒配置 :1-使能  ;0-禁止
	PBIC0 = 0b00000000;	//启动加强驱动   :1-加强驱动;0-默认驱动
	PORTB = 0b00000000;	//PB输出赋值	
//----------------------------------------------------------------------
//;PORTC
	PORTC = 0b00000000;	//PC输出赋值	
	TRISC = 0b00000000;	//PC输入输出配置 :0-输出  ;1=输入
	PCDCON = 0b11111111;	//PC内部下拉配置 :1-禁止  ;0-使能
	PCHCON = 0b11111111;	//PC内部上拉配置 :1-禁止  ;0-使能
} 


//****System_Init function****// 
/*-------------------------------------------------
 *  函数名称：System_Init
 *  功能：   中断初始化配置
 *  输入参数：无
 *  返回参数：无 
 -------------------------------------------------*/
void System_Init(void)
{
	OPTION = 0b000000000;//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分频
	

	PCON  = 0b10110000;
			  //Bit7 WDTE,看门狗定时器控制  1-使能WDT   0-禁止WDT
					  //Bit6 EIS,PB0管脚复用控制位  1-使能为外部中断输入脚  0-屏蔽中断功能	
					  //Bit5 LVDTE,LVDT低压复位使能,电压点由配置字决定  	
	                  //Bit4 SMTS,施密特使能位 1-施密特有效，0-施密特禁止
					  //Bit3 空	
					  //Bit2 空
					  //Bit1 空
					  //Bit0 空
	
	INTEN = 0B00000000;	
					  //Bit7 GIE 使能全局中断     1-使能 0-禁止	
					  //Bit6 T3IE 使能T3溢出中断  1-使能 0-禁止
					  //Bit5 INT1IE 使能外部中断1 1-使能 0-禁止
					  //Bit4 T2IE 使能T2溢出中断  1-使能 0-禁止
					  //Bit3 TC1IE 使能T1溢出中断 1-使能 0-禁止
					  //Bit2 INTIE 使能外部中断0  1-使能 0-禁止
					  //Bit1 PBIE 使能端口变化中断1-使能 0-禁止 
					  //Bit0 T0IE TIME0溢出中断   1-使能 0-禁止
	INTFLAG=0B00000000;	
					  //Bit7 空	
					  //Bit6 T3IF T3溢出中断标志位
					  //Bit5 INT1IF 外部中断1标志位
					  //Bit4 T2IF T2溢出中断标志位	
					  //Bit3 TC1IF TC1溢出中断标志位		
					  //Bit2 INTIF 外部中断0标志位		
					  //Bit1 PBIF PA/PB输入状态变化中断标志位	
					  //Bit0 T0IF TIME0溢出中断标志位
	INTEN1 = 0B00000000;	 
					  //Bit7 空	
					  //Bit6 空
					  //Bit5 空
					  //Bit4 空	
					  //Bit3 空	
					  //Bit2 ADCIE ADC中断使能位 1-使能 0-禁止
					  //Bit1 空
					  //Bit0 TKIE 触摸中断使能位 1-使能 0-禁止
	INTFLAG1=0B00000000;	
					  //Bit7 空	
					  //Bit6 空
					  //Bit5 空
					  //Bit4 空	
					  //Bit3 空	
					  //Bit2 ADCIF ADC中断标志位
					  //Bit1 空
					  //Bit0 TKIF 触摸中断标志位
}

//****delay function****// 
//;Fcpu=1MHz;DelayUs = 11+7x     
void DelayUs(unsigned char delayUs)     
{
	while(delayUs--);    
} 


//****main function****//
void main(void) 
{ 
	System_Init();
	GPIO_Init();
	//TMR0_Init();
	UART_Init();
	//TC1_Init();
	//T2_Init();
	

	TX_Flag = 0;
	SendIndex = 0x00;
	EEtestdat =0x00;
	EEerr_Flag =0x00;
	while(1)
	{
		CLRWDT();  	
		DelayUs(250);
		DelayUs(250);
		
		//AD 测试
		ADC_Data_Get(AD_AIN5);


		//串口 测试
		if (TX_Flag)
		{
		  SendIndex++;
		  switch(SendIndex&0x0f)
		  {
		  	case 0x01:	TXREG = 0x5a; break;
		  	case 0x02:	TXREG = Ad_sdata_h; break;
		  	case 0x03:	TXREG = Ad_sdata_l; SendIndex =0; break;

		  }
		  
		  //TXREG = Ad_sdata_h;	// SendIndex;	//发送数据
		  //TXREG = Ad_sdata_l;
		  TX_Flag = 0;
		}
	}
} 

//****ADC configuration****//

void	ADC_Data_Get(unsigned char AD_ain)
{
	ADM =0;
	ADR	= 0X50;		//Fcpu/2
	ADM = 0X10;		//使能输入通道
	ADM |= AD_ain;	//输入通道
	VREFH = 0X02;	//4v基准
	ADT = 0X00;		//AD结果微调
	
	if(AD_ain<8)
	{
		ADPC =  0x01<<AD_ain;
	 	ADPC1 =0;
	}
	else 
	{
		AD_ain -=8;
		ADPC =0;
		ADPC1 =  0x01<<AD_ain;
	}
	
	ADENB =1;		//使能AD
	DelayUs(80);
	
	ADCIE =0; 		//关中断
	ADCIF =0;
	
	EOC =0;
	ADS =1;			//启动AD
	while(!EOC);
	
	ADENB =0;
	Ad_sdata_l = ADBREG;		//12位AD值低八位数据
	Ad_sdata_h = (ADB>>4)&0X0F;	//12位AD值高四位数据
}



 



