avr中斷使用例子
#pragma interrupt_handler 函數(shù)名:中斷向量
要注意不同的AVR芯片的中斷向量是不同的,因此在ICCAVR下編譯,除了要在程序上注明芯片的類(lèi)型外,還要在PROJECT的OPTION頁(yè)選擇正確的芯片,否則有可能導(dǎo)致程序運(yùn)行不正常;而GCC只要在MFILE里面選定芯片型號(hào)就可以,GCC在這點(diǎn)上的使用比ICCAVR的方便。
附:定時(shí)器1溢出中斷例子,每溢出一次就令i自加1,然后在LCD1602上顯示出來(lái)
------------------------------------------------------------------------------------------------
#include
#include
#pragma interrupt_handler ANA_COMP:10 //定時(shí)器1溢出中斷
#define uchar unsigned char
#define uint unsigned int
#define LcdBus PORTA
#define rs 2 //LCD端口定義
#define rw 3
#define en 4
void LcdIni(void);
void WrOp(uchar dat);
void WrDat(uchar dat);
void ChkBusy(void);
void DisText(uchar addr,uchar *text);
void DisTextConst(uchar addr,uchar const *text);
void ShowNum(uchar addr,uint num); //在addr處顯示數(shù)字num
int AdcVal(uchar n);
void delayms(uint n);
int AdcValPro(uchar n);
void ANA_COMP(void);
char BCD[6]; //十位二進(jìn)制的顯示碼分別是千百十個(gè)位的顯示
int Adc[3]; //存放Adc轉(zhuǎn)換后的值
int i=0;
void main(void)
{
LcdIni();
TIMSK=0X04;
TCNT1H=0XFF;
TCNT1L=0X00;
TCCR1A=0X00;
TCCR1B=0X01;
SEI(); //允許全局中斷
while(1);
}
void ANA_COMP(void)
{//中斷處理程序,溢出時(shí)就令i增加1
TCNT1H=0XFF;
TCNT1L=0X00;
ShowNum(0x82,i++);
}
int AdcVal(uchar n)
{//軟件濾波
uchar i,k;
uint tmp=0;
for(i=0;i<20;i++)
tmp=(tmp+AdcValPro(n))/2;
k=tmp>Adc[n] ? (tmp-Adc[n]):(Adc[n]-tmp);
Adc[n]=k>0 ? tmp:Adc[n];
return Adc[n];
}
int AdcValPro(uchar n)
{//返回第N個(gè)ADC的值從0到7
uchar dat1,dat0;
int val;
DDRA &=~BIT(n); //設(shè)置對(duì)應(yīng)的ADC口為輸入
PORTA &=~BIT(n);
ADMUX=0x40+n; //選擇AVCC,選擇第N個(gè)ADC
ADCSRA=0xc0; //允許轉(zhuǎn)換ADEN,ADSC
while(ADCSRA & BIT(ADSC)); //
dat1=ADCH;
dat0=ADCL;
val=ADCH*256+ADCL;
return val;
}
void ShowNum(uchar addr,uint num) //在addr處顯示數(shù)字num
{//將num轉(zhuǎn)化成五個(gè)BCD碼存放在全局?jǐn)?shù)組BCD[5]中
uchar i;
for(i=5;i>0;i--) //將NUM數(shù)據(jù)轉(zhuǎn)化成ASCII碼,如521會(huì)轉(zhuǎn)化為00521
{
BCD[i-1]=(uchar)(num%10+0x30); //取出最低位
num/=10; //去掉最低位
}
i=0;
while(BCD[i] ==0x30 && i<4) BCD[i++]= ; //NUM轉(zhuǎn)換成數(shù)組存放,但還沒(méi)有加上小數(shù)點(diǎn)
BCD[5]=