avr中斷使用例子
#pragma interrupt_handler 函數名:中斷向量
要注意不同的AVR芯片的中斷向量是不同的,因此在ICCAVR下編譯,除了要在程序上注明芯片的類型外,還要在PROJECT的OPTION頁選擇正確的芯片,否則有可能導致程序運行不正常;而GCC只要在MFILE里面選定芯片型號就可以,GCC在這點上的使用比ICCAVR的方便。
附:定時器1溢出中斷例子,每溢出一次就令i自加1,然后在LCD1602上顯示出來
------------------------------------------------------------------------------------------------
#include
#include
#pragma interrupt_handler ANA_COMP:10 //定時器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處顯示數字num
int AdcVal(uchar n);
void delayms(uint n);
int AdcValPro(uchar n);
void ANA_COMP(void);
char BCD[6]; //十位二進制的顯示碼分別是千百十個位的顯示
int Adc[3]; //存放Adc轉換后的值
int i=0;
void main(void)
{
LcdIni();
TIMSK=0X04;
TCNT1H=0XFF;
TCNT1L=0X00;
TCCR1A=0X00;
TCCR1B=0X01;
SEI(); //允許全局中斷
while(1);
}
void ANA_COMP(void)
{//中斷處理程序,溢出時就令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個ADC的值從0到7
uchar dat1,dat0;
int val;
DDRA &=~BIT(n); //設置對應的ADC口為輸入
PORTA &=~BIT(n);
ADMUX=0x40+n; //選擇AVCC,選擇第N個ADC
ADCSRA=0xc0; //允許轉換ADEN,ADSC
while(ADCSRA & BIT(ADSC)); //
dat1=ADCH;
dat0=ADCL;
val=ADCH*256+ADCL;
return val;
}
void ShowNum(uchar addr,uint num) //在addr處顯示數字num
{//將num轉化成五個BCD碼存放在全局數組BCD[5]中
uchar i;
for(i=5;i>0;i--) //將NUM數據轉化成ASCII碼,如521會轉化為00521
{
BCD[i-1]=(uchar)(num%10+0x30); //取出最低位
num/=10; //去掉最低位
}
i=0;
while(BCD[i] ==0x30 && i<4) BCD[i++]= ; //NUM轉換成數組存放,但還沒有加上小數點
BCD[5]= 主站蜘蛛池模板: 临泉县| 涟源市| 蓬安县| 湘西| 溧水县| 布拖县| 河池市| 长海县| 内江市| 乐平市| 山阳县| 四子王旗| 儋州市| 武山县| 石首市| 东乡族自治县| 汾西县| 大埔县| 万州区| 奉化市| 安吉县| 阿合奇县| 封开县| 永新县| 吴江市| 乌拉特前旗| 兴仁县| 华容县| 横峰县| 通州市| 巴楚县| 道孚县| 肇源县| 玉门市| 洞头县| 吴川市| 孟连| 定远县| 洛阳市| 措勤县| 林口县|