/*---------------------------------------------------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/*---------------------------------------------------------------------*/

/*************  功能说明    **************

本例程基于AI8051U为主控芯片的实验箱进行编写测试。

使用Keil C51编译器,为了达到比较高的效率,一般建议选择"Small"模式。

当编译器出现 "error C249: 'DATA': SEGMENT TOO LARGE" 错误时，则需要手动将部分比较大的数组通过"xdata" 强制分配到 XDATA 区域（例如：char xdata buffer [256];）。

比较器的正极可以是 P4.6、P5.0、P5.1 端口或者 ADC 的模拟输入通道，

而负极可以是 P4.4 端口或者是内部 BandGap 经过 OP 后的 REFV 电压（1.19V内部固定比较电压）。

通过中断或者查询方式读取比较器比较结果，CMP+的电平低于CMP-的电平P43口输出低电平(LED10亮)，反之输出高电平(LED10灭)。

下载时, 选择时钟 24MHz (用户可自行修改频率).

******************************************/

#include "..\comm\AI8051U.h"
#include "stdio.h"
#include "intrins.h"

typedef 	unsigned char	u8;
typedef 	unsigned int	u16;
typedef 	unsigned long	u32;

#define MAIN_Fosc        24000000UL

/*****************************************************************************/

//void CMP_Isr() interrupt 21
INTERRUPT(CMP_Isr,CMP_VECTOR)
{
CMPCR1&=~CMPIF;//清中断标志
    P43 = (CMPCR1 & CMPRES);                     //中断方式读取比较器比较结果
}

/********************* 主函数 *************************/
void main(void)
{
    WTST = 0;  //设置程序指令延时参数，赋值为0可将CPU执行指令的速度设置为最快
    EAXSFR(); //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

    CMPEXCFG = 0x00;
//  CMPEXCFG |= 0x40;                           //比较器DC迟滞输入选择，0:0mV; 0x40:10mV; 0x80:20mV; 0xc0:30mV

//  CMPEXCFG &= !0x04;                          //P4.4为CMP-输入脚
    CMPEXCFG |= 0x04;                           //内部1.19V参考电压为CMP-输入脚

CMPEXCFG&=~0x03;//P4.6为CMP+输入脚
//  CMPEXCFG |= 0x01;                           //P5.0为CMP+输入脚
//  CMPEXCFG |= 0x02;                           //P5.1为CMP+输入脚
//  CMPEXCFG |= 0x03;                           //ADC输入脚为CMP+输入脚


    CMPCR2 = 0x00;
CMPCR2&=~INVCMPO;//比较器正向输出
//  CMPCR2 |= INVCMPO;                                //比较器反向输出
CMPCR2&=~DISFLT;//使能0.1us滤波
//  CMPCR2 |= DISFLT;                                 //禁止0.1us滤波
//  CMPCR2 &= !0x3f;                            //比较器结果直接输出
    CMPCR2 |= 0x10;                             //比较器结果经过16个去抖时钟后输出

    CMPCR1 = 0x00;
//  CMPCR1 &= !CMPPIE;                                    //禁止比较器上升沿中断
    CMPCR1 |= CMPPIE;                                    //使能比较器上升沿中断
//  CMPCR1 &= !CMPNIE;                                    //禁止比较器下降沿中断
    CMPCR1 |= CMPNIE;                                    //使能比较器下降沿中断

//  CMPCR1 &= !CMPOE;                                  //禁止比较器输出
    CMPCR1 |= CMPOE;                                  //使能比较器输出

P_SW2&=~CMPO_S;//选择P4.5作为比较器输出脚
//  P_SW2 |= CMPO_S;                                 //选择P4.1作为比较器输出脚
    CMPCR1 |= CMPEN;                                  //使能比较器模块

    EA = 1;

    while (1)
    {
//      P43 = (CMPCR1 & CMPRES);  //查询方式读取比较器比较结果
    }
}
//========================================================================

