写了一个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;
}
此帖出自小平头技术问答
for( i=0; i<4; i++) //实现4位动态扫描循环
{
PORTE= LedOut; //将字模送到数码管显示
PORTC=dispbit;
你这样不是一直显示最高位么。
还有你这个芯片这些端口设置跟我刚在学的 差好多哦 都看不懂
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;
还有这个AD1CON2=0X0000; //Vadd Vss 1个采样产生一个中断
这个怎么实现采样一次一次中断的? 你说不能进入中断又是怎么判断的
我还没学中断 所以有个疑问 需要先开总中断么?
一周热门 更多>