📄 em78p372n_ad_int.c
字号:
//**************************************************************************
//以下的程序是用中断方式实现P50的AD转换,并把转换的结果存储在
//D_ADDATAL和D_ADDATAH中,采用内部VDD作为参考电压。
//**************************************************************************
//MCU:EM78P372N
//Oscillator:IRC 4MHz
//Clock:2
//WDT: Disable
//编译软件:eUIDE version 1.02.09.07
#include "EM78P372N.H" //EM78P372N的头文件
#define DISI() _asm{disi}
#define WDTC() _asm{wdtc}
#define NOP() _asm{nop}
#define ENI() _asm{eni}
#define SLEP() _asm{slep}
#define uchar unsigned char
unsigned int D_ADDATA1H @0X20:bank 0;
unsigned int D_ADDATA1L @0X21:bank 0;
void AD_CALI_P(void);
extern int IntVecIdx; //occupied 0x10:rpage 0
void main()
{
WDTC();
DISI();
SCR=0X7F; //选择主频,4MHz
P5CR=0XFF; //P50设为输入
AISR=1; //P50/ADC0引脚作为ADC0输入口
ADCON=0X08; //打开AD电源,并选择ADC0输入口
AD_CALI_P(); //调用AD子程序
WDTCR|=0X20; //使能AD中断
ENI();
ADRUN=1; //使能AD转换
while(1);
}
void AD_CALI_P()
{
unsigned char cnt;
cnt=0x07;
ADOC=0XF8; //使能ADC位校正功能
do
{
ADRUN=1; //开始AD转换
while(ADRUN==1); //等待AD转换完成
cnt--;
if(!SIGN) //offset 负电压
{
ADOC+=0X08;
}
else //offset 正电压
{
ADOC-=0X08;
}
if(cnt==0)
{
cnt=0x07;
if(SIGN)
{
ADOC=0X80;
}
else
{
CALI=0;
}
}
}while((ADDATA1H||ADDATA1L)&&CALI);
CALI=0;
}
void _intcall ALLInt(void) @ int
{
switch(IntVecIdx)
{
case 0xD:
if (ADIF==1)
{
ADIF=0;
D_ADDATA1H=ADDATA1H;
D_ADDATA1L=ADDATA1L; //保存AD转换值
}
break;
}
}
void _intcall ADC_l(void) @ 0x0C:low_int 3
{
_asm{MOV A,0x2};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -