/*-------------------------------------------

程序名称：运算放大器调零程序
日期版本：2018/6/15 <V1.1>

备注：若OPA使用到相关的IO口，用户必须将其置为输入

*本程序由 中微半导体有限公司 &应用支持部& 编写整理
*公司网址 www.mcu.com.cn
*技术支持QQ 3001082102  罗工
            3001085706	陈工
-------------------------------------------*/

#include <cms.h>


void Set_OPA();
void DelayXus(unsigned char X);

void main()
{
	asm("nop");
	asm("clrwdt");
	
	TRISB = 0B00111000;
	
	Set_OPA();
	
	while(1)
	{
		asm("clrwdt");
	}
}

/***********************************************
函数名称：Set_OPA
函数功能：设置芯片内置运算放大器
入口参数：无
出口参数：无
备注：RB3运放正端输入，RB4运放负端输入，RB5运放输出
************************************************/
void Set_OPA()
{
	static bit OPA_Out;
	
	//用户根据需要修改寄存器
		OPA0ADJ = 0B01111111;		//调节模式，调节模式正端输入，失调电压调节位为FFH
		OPA0CON = 0B11000101;		//使能OPA0，正端接地，负端接RB4，输出内部接滤波		
	//--------------------
	while(1)
	{
		DelayXus(10);				//一小段延时后检测输出
		
		if(0X80 & OPA0ADJ)			//运放输出是否翻转
			break;
		else
		{
			OPA0ADJ--;				//运放输出未翻转，递减调节位
			
			if(!(0x1f & OPA0ADJ))	//是否调到了最小值
			{
				OPA0ADJ = 0x10;		//调不到零点，赋中间值
				break;
			}
		}
	}
	
	OPA0ADJ &= 0x1f;				//运放工作在正常模式
	
	if(0x20 & OPA0ADJ)				//避免溢出
	{
		OPA0ADJ = 0x1f;
	}
	
		OPA0CON = 0B11111101;		//运放所有端口接至相应IO
		
}

void DelayXus(unsigned char X)
{
	while(X--);
}