使用ADC只需要對相應(yīng)的寄存器進行配置,然后啟動ADC即可,啟動ADC有兩種方法:
1. 手動完成啟動。
2.讀取上一次轉(zhuǎn)換結(jié)果后自動啟動下一次ADC轉(zhuǎn)換。
得到ADC是否轉(zhuǎn)換完成的信息的方法有兩種方法:
1. 查詢法:查詢寄存器ADCCON的第15位(ADC的轉(zhuǎn)換完成位)。
2. 中斷法:轉(zhuǎn)換完成后,產(chǎn)生ADC中斷信號。
當不使用觸摸屏時,與ADC相關(guān)的寄存器主要有據(jù)寄存器ADCCON和寄存器ADCDAT0。寄存器ADCCON主要用于選擇ADC的啟動方式、設(shè)置ADC轉(zhuǎn)換時鐘以及ADC轉(zhuǎn)換結(jié)束標志位等。寄存器ADCDAT0中存放了ADC抓換所得的結(jié)果,ADC轉(zhuǎn)換結(jié)束后,可以直接讀改寄存器的值來得到轉(zhuǎn)換結(jié)果。
注意:普通ADC轉(zhuǎn)換數(shù)據(jù)值存儲在ADCDAT0的低10位,數(shù)據(jù)范圍0~0x3ff。ADC的時鐘來自PCLK時鐘的分頻,并且時鐘必須小于PCLK/5。
//****************ADC 中斷*****************
void ADC_start();
extern int ADC_dat;
void __irq ADC_isr()
{
unsigned long irqOffSet;
send_dat(ADC_dat);
send_str((unsigned char *)"ADC is started!rn");
ADC_dat = 1010;//((int)rADCDAT0&0x3ff);//讀取ADC的轉(zhuǎn)換值
//dely(100);
send_dat(ADC_dat);
//ADC_start();//啟動AD
send_dat(ADC_dat);
irqOffSet = rINTOFFSET;// 取得中斷號
rSUBSRCPND |= (1<<10)|(1<<9);
rSRCPND |= 1< rINTPND= rINTPND;//中斷標志清零 dely(550); send_str((unsigned char *)"ADC is end!rn"); } void Init_ADC() { //寄存器進行清零 rADCCON &= ~((1<<14)|(0xff<<6)|(0x07<<3)|(1<<2)|(1<<1)|(1<<0)); //允許分頻,預(yù)分頻值為49,通道0,正常工作模式,讀數(shù)時不啟動轉(zhuǎn)換 rADCCON |= (1<<14)|(49<<6)|(0<<3)|(0<<2)|(0<<1); rINTSUBMSK &= ~((1<<10)|(1<<9)); rINTMSK &= ~(1<<31);//使能ADC中斷 pISR_ADC = (unsigned int)ADC_isr; send_str((unsigned char *)"ADC initial is OK!rn"); } void ADC_start() { rADCCON |= 0x01;//啟動AD轉(zhuǎn)換 while(!(rADCCON&0x01));//ADC 開始后,bit0會自動清零 } int get_ADC_data(void) { //send_dat(ADC_dat); send_str((unsigned char *)"test is started!rn"); ADC_dat = 1010;//((int)rADCDAT0&0x3ff);//讀取ADC的轉(zhuǎn)換值 //dely(100); send_dat(ADC_dat); //ADC_start();//啟動AD send_dat(ADC_dat); send_str((unsigned char *)"test is end!rn"); return 0; }