写了一个AD采样程序,显示用数码管;但是无论自动手动都不能转换,DONE位不能被硬件置1,采样1次1次中断,不能进入中断,
晶振是6M,
#include<p24HJ128GP510.h>
unsigned char const Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段码控制
unsigned char const dispbit[]={0X1D,0X1A,0X16,0X0E };
//{0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};
static unsigned int LedNumVal=1234 ;
void lcddelay(unsigned char ms) //ms
{
unsigned char i,j;
for(i=ms;i>0;i--)
for(j=166;j>0;j--)
{;}
}
void initacd(void)
{
AD1PCFGL=0Xfffb; //AN2
AD1CON1=0X0000; //SHOU采样 采样结束后SHOU转换
AD1CON2=0X0000; //Vadd Vss 1个采样产生一个中断
AD1CON3=0X1fff; //32Tad ;256*Tcy=256*1/3us ;Fosc=6M
AD1CHS0=0X0002; //AN2
AD1CON4=0;
AD1CSSL=0;
ADC1BUF0=0;
_ADON=1; //开启AD模块
}
void intadcin(void) //中断初始化
{
_AD1IP=111; //中断优先级7
_AD1IF=0;
_AD1IE=1; //开启中断
}
main(void)
{
unsigned int i ;
unsigned int LedOut[4];
TRISC=0X0000;
TRISE=0X0000;
TRISBbits.TRISB2=1;
PORTE=0X0000;
intadcin();
initacd();
lcddelay(10);
while(1) //进入循环状态
{
_SAMP = 1;
lcddelay(10);
_SAMP = 0;
lcddelay(1);
// AD1CON1bits.DONE=1;
//lcddelay(10);
if(LedNumVal<=2000)
{
LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;
LedOut[2]=Disp_Tab[LedNumVal%100/10];
LedOut[3]=Disp_Tab[LedNumVal%10];
}
else
{
LedOut[0]=Disp_Tab[2];
LedOut[1]=Disp_Tab[0];
LedOut[2]=Disp_Tab[0];
LedOut[3]=Disp_Tab[0];
}
for( i=0; i<4; i++) //实现4位动态扫描循环
{
PORTE= LedOut
; //将字模送到数码管显示
PORTC=dispbit;
lcddelay(10);
}
PORTE=LedNumVal;
}
}
void __attribute__((__interrupt__)) _ADCInterrupt(void)
{
LedNumVal=ADC1BUF0;
_AD1IF=0;
}
此帖出自小平头技术问答
unsigned char const Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段码控制
unsigned char const dispbit[]={0X1D,0X1A,0X16,0X0E };
volatile static unsigned int LedNumVal=0,sum=0;
int a=1;
void lcddelay(unsigned char ms) //(4j+11)*i个指令周期
{
unsigned char i,j; //
for(i=ms;i>0;i--)
for(j=4000;j>0;j--)
{;}
}
void ADCinit(void)
{
AD1PCFGL=0XfffF;
AD1PCFGH=0XFFFF;
AD1PCFGLbits.PCFG3=0; //AN3
TRISBbits.TRISB3=1;
AD1CON1=0X00e4; //自动采样 采样以后自动开始转换
AD1CON2=0X0004; //Vadd=3.2V Vss 2个采样产生一个中断
AD1CON3=0X1f09; //9*Tcy=9*1/12us ;Fosc=24M;32*Tad
AD1CHS0=0X0003; //AN3
AD1CSSL=0;
_AD1IF=0;
_AD1IP=7;
_AD1IE=1;
AD1CON1bits.ADON=1; //开启AD模块
}
void __attribute__((__interrupt__)) _ADC1Interrupt(void)
{
if(a<=11)
{
sum=sum+ADC1BUF0;
a++;
}
else
{
LedNumVal=sum/11;
sum=0;
PORTD=LedNumVal;
a=1 ;
}
// while(!_DONE);
// LedNumVal=ADC1BUF0;
_AD1IF=0;
}
void main()
{
unsigned char LedOut[4];
int k;
TRISC=0;
TRISE=0;
TRISD=0; //提供给FPGA的控制信号
ADCinit();
//_SAMP=1;
while(1) //进入循环状态
{
if(LedNumVal<=1000)
{
LedOut[0]=Disp_Tab[LedNumVal%10000/1000+1];
LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;
LedOut[2]=Disp_Tab[LedNumVal%100/10];
LedOut[3]=Disp_Tab[LedNumVal%10];
}
else
{
LedOut[0]=Disp_Tab[2];
LedOut[1]=Disp_Tab[0];
LedOut[2]=Disp_Tab[0];
LedOut[3]=Disp_Tab[0];
}
for( k=0; k<4; k++) //实现4位动态扫描循环
{
PORTC=dispbit[k]&0xff;
PORTE= LedOut[k]&0xff; //将字模送到数码管显示
lcddelay(20);
}
}
}
一周热门 更多>