#include 	<hs16f2612.h> 	
#include 	<main.h>		



void interrupt myIsr(void) {
	if (T2IF == 1) {

		T2IF = 0;

		T2TH = 0x08;
		T2TL = 0x00;
	}
}


/*-------------------------------------------------
 *  函数名称：IO_Init
 *  功能：   io 初始化函数
 *  输入参数：无
 * 	返回参数：无
 -------------------------------------------------*/
void GPIO_Init(void) {
	PORTA = 0b00000000;	    //PA输出赋值
	TRISA = 0b00000100;	    //PA输入输出配置 :0-输出  ;1=输入  
	PAODCON = 0b00000000;	//PA漏极开路配置 :1-使能  ;0-禁止 
	PAHCON = 0b11111111;	//PA内部上拉配置 :1-禁止  ;0-使能 
	PADCON = 0b11111111;	//PA内部下拉配置 :1-禁止  ;0-使能 
	WUACON = 0b00000000;	//PA端口唤醒配置 :1-使能  ;0-禁止 
	PORTC = 0b00000000;	    //PA输出赋值
	TRISC = 0b00000000;	    //PA输入输出配置 :0-输出  ;1=输入 

	//----------------------------------------------------------------------
	PORTC = 0b00000000;	    //PA输出赋值
	TRISC = 0b00000000;	    //PA输入输出配置 :0-输出  ;1=输入 
	PCDCON = 0b11111111;	//PA内部下拉配置 :1-禁止  ;0-使能 
	PCHCON = 0b11111111;	//PA内部上拉配置 :1-禁止  ;0-使能 	
}

/*-------------------------------------------------
 *  函数名称：System_Init
 *  功能：   中断初始化配置
 *  输入参数：无
 * 	返回参数：无
 -------------------------------------------------*/
void System_Init(void) {
	OPTIONR = 0b00000010;//Bit7 INT1EDG, 外部中断1触发方式 0 INT1引脚下降沿触发
	//Bit6 INTEDG, 外部中断 触发方式 0 INT引脚下降沿触发
	//Bit5 T0CS, TMR0时钟源选择位 0 内部指令时钟
	//Bit4 T0SE, TMR0时钟源边沿选择位 0 T0CKI引脚下降沿触发计数
	//Bit1 PSA, 预分频分配位 0 预分频器分配给TMR0
	//Bit2:0 PS[2:0], 预分频配置 010 '8分频
	PCON = 0b10110000;
	//Bit7 WDTE,看门狗定时器控制  1-使能WDT   0-禁止WDT
//Bit6 EIS,PB0管脚复用控制位  1-使能为外部中断输入脚  0-屏蔽中断功能	
//Bit5 LVDTE,LVDT低压复位使能,电压点由配置字决定  	
				//Bit4 SMTS,施密特使能位 1-施密特有效，0-施密特禁止
//Bit3 空	
//Bit2 空
//Bit1 空
//Bit0 空				
	INTCON = 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-禁止
	PIR1 = 0B00000000;
	//Bit7 空	
	//Bit6 T3IF T3溢出中断标志位
	//Bit5 INT1IF 外部中断1标志位
	//Bit4 T2IF T2溢出中断标志位	
	//Bit3 TC1IF TC1溢出中断标志位		
	//Bit2 INTIF 外部中断0标志位		
	//Bit1 PBIF PA/PB输入状态变化中断标志位	
	//Bit0 T0IF TIME0溢出中断标志位		
	PIR2 = 0B00000000;
	//Bit7 空	
//Bit6 空
//Bit5 空
//Bit4 空	
//Bit3 空	
//Bit2 ADCIE ADC中断使能位 1-使能 0-禁止
//Bit1 空
//Bit0 TKIE 触摸中断使能位 1-使能 0-禁止		
}


volatile unsigned long g_adc_data = 0;


//ADC 配置
//
//选择ADC通道和时钟，将对应IO口设置为模拟输入脚，关闭改引脚的上下拉，选择参考电压

void adc_init() {

	
	ADM = 0x90; 
						//bit7     ADENBN ADC使能				0:禁止					 1:使能
						//bit6     ADS	  ADC启动位			0:停止					 1:开始
						//bit5     EOC	  ADC状态控制位  0:转换过程中    1:转换结束，ADS复位
						//bit4     GCHS   通道选择位     0:禁止AIN通道   1:使能AIN通道
						//bit3~0   ADC 通道选择
						//      0000  AIN0(PA0)	
						//      0001  AIN1(PA1)		  	
						//      0010  AIN2(PA2)		  	
						//      0011  AIN3(PA3)		  	
						//      0100  AIN4(PC0)		  		  	
						//      0101  AIN5(PC1)		  		  	
						//      0110  AIN6(PC2)		  		
						//      1100  VDD/4
						//      1111  GND
	ADR = 0x00;
					//[bit6:bit4] ADCKS1:ADCKS0			ADC时钟源
					//						  0      0				Fcpu/16
					//						  0      1				Fcpu/8
					//						  1      0				Fcpu/16
					//						  1      1				Fcpu/2
					//
					//[bit3:bit0]  ADC12位分辨率低4位数据
					//ADB 寄存器   ADC12位分辨率高8位数据

	VREF = 0x01;  //ADC 参考电压寄存器
				 //bit7    EVHENB  ADC内部参考电压控制位  0:内部参考电压  1：外部参考电压 PA6脚
				 //bit1:bit0			 ADC内部参考电压选择位
				 //   VHS1    VHS0    内部VREFH参考电压
				 //    1       1					VDD
				 //    1       0					4.0V
				 //    0       1					3.0V		
				 //    0       0					2.0V 



	ADT = 0X1a; //ADC结果微调寄存器
							//bit4  ADTS<0>  0:负方向(ADB转换制变小)  1:正方向(ADB转换制变大) 
							//bit3~bit0
							// 0000  修调0mv
							// 0001  修调1mv
							// 0010  修调2mv
							// 0011  修调3mv
							// 0100  修调4mv
							// 0101  修调5mv
							// 0110  修调6mv
							// 0111  修调7mv
							// 1000  修调8mv
							// 1001  修调9mv
							// 1010  修调10mv
							// 1011  修调11mv
							// 1100  修调12mv
							// 1101  修调13mv
							// 1111  修调14mv
							// 1111  修调15mv

	ANSEL = 0x80;	
							//bit6   0:PC2为GPIO   0:PC2为纯模拟输入脚
							//bit5   0:PC1为GPIO   0:PC1为纯模拟输入脚
							//bit4   0:PC0为GPIO   0:PC0为纯模拟输入脚
							//bit3   0:PA3为GPIO   0:PA3为纯模拟输入脚
							//bit2   0:PA2为GPIO   0:PA2为纯模拟输入脚
							//bit1   0:PA1为GPIO   0:PA1为纯模拟输入脚
							//bit0   0:PA0为GPIO   0:PA0为纯模拟输入脚

	ANSEL3 = 1;//PA3

	FCHS0 = 1;
	FCHS1 = 1;
	FCHS2 = 0;
	FCHS3 = 0;


}


void main(void) {
	System_Init();
	GPIO_Init();



	PIE1 = 0x02;//Enable T2 interrupt routine
	INTCON = 0xC0;//Enable global interrupt
	T2C1 = 0x17;//clock source -> Fosc / 1
	T2C0 = 0x80;//Enable T2 counting

	adc_init();






	while (1) {  //16Mhz/2 : 40 commands = 125ns * 40 = 5us


		DelayMs(2);
		FGIE = 0;
		NOP();
		NOP();
		NOP();
		NOP();
		NOP();
		NOP();
		FADS = 1; //启动ADC
		while (!FEOC);
		FGIE = 1;
		g_adc_data = (ADB << 4) + (ADR & 0x0f);

		
	}
}


void DelayMs(unsigned char x) {
	unsigned int i, j;
	for (i = 0; i < x; i++)
		for (j = 0; j < 141; j++) {
			//CLRWDT();
		}
}
