//文件名:INT0.C,int0中断每按一次显示数据正常,INT1,每按一次按键显示不正常
//功能:外部中断的应用
//晶振:8MZH
//MCU:ATMEGA8
#include <iom8.h>
#include<AVRdef.h>
unsigned char countnum;
//以下是延时函数
void Delay(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<125;j++);
}
#pragma vector=INT0_vect //中断0中断
__interrupt void int0_isr(void)
{
if(++countnum>=100)
countnum=0;
}
#pragma vector=INT1_vect //中断1中断
__interrupt void int1_isr(void)
{
if(++countnum>=100)
countnum=0;
}
//
void main()
{
unsigned char temp;
unsigned char num[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,
0xe0,0xfe,0xf6}; //0-9数字段码表
//
DDRB=0XFF; //设置B口为输出模式
PORTB=0XFF; //置高电平
DDRC=0X03; //11
PORTC=0XFF;
DDRD=0XFF;
PORTD=0XFF;
MCUCR=0X02; //10,INT0的下降沿产生中断请求,INT1为低电平时产生中断请求,
//如果选择上升沿中断请求,没看到有什么差别
GICR|=0XC0; //11000000
GIFR=0XC0; //11000000
countnum=0; //初始化全局变量
SEI(); //打开局中断
while(1)
{
CLI(); //关闭全局中断
temp=countnum/10;//没有/10,个位十位一起显示,如到2时显22,十位过后显示更不对,个位显示
PORTC&=~(1); //LED取第个位,显示个位数
PORTB=num[temp];//没有此行,不分个位十位,按一下出11,再按出22
Delay(1);
PORTC|=0XFF;
temp=countnum%10; //没有%10时,到十位以上显示就不正常
SEI();
PORTC&=~(2); //LED取第十位,显示十位数
PORTB=num[temp]; //没有此行,按INT0没有作用,按INT1同时显示两个数
Delay(1);
PORTC|=0XFF;
SEI(); //打开全局中断
Delay(1);
}
}
//功能:外部中断的应用
//晶振:8MZH
//MCU:ATMEGA8
#include <iom8.h>
#include<AVRdef.h>
unsigned char countnum;
//以下是延时函数
void Delay(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<125;j++);
}
#pragma vector=INT0_vect //中断0中断
__interrupt void int0_isr(void)
{
if(++countnum>=100)
countnum=0;
}
#pragma vector=INT1_vect //中断1中断
__interrupt void int1_isr(void)
{
if(++countnum>=100)
countnum=0;
}
//
void main()
{
unsigned char temp;
unsigned char num[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,
0xe0,0xfe,0xf6}; //0-9数字段码表
//
DDRB=0XFF; //设置B口为输出模式
PORTB=0XFF; //置高电平
DDRC=0X03; //11
PORTC=0XFF;
DDRD=0XFF;
PORTD=0XFF;
MCUCR=0X02; //10,INT0的下降沿产生中断请求,INT1为低电平时产生中断请求,
//如果选择上升沿中断请求,没看到有什么差别
GICR|=0XC0; //11000000
GIFR=0XC0; //11000000
countnum=0; //初始化全局变量
SEI(); //打开局中断
while(1)
{
CLI(); //关闭全局中断
temp=countnum/10;//没有/10,个位十位一起显示,如到2时显22,十位过后显示更不对,个位显示
PORTC&=~(1); //LED取第个位,显示个位数
PORTB=num[temp];//没有此行,不分个位十位,按一下出11,再按出22
Delay(1);
PORTC|=0XFF;
temp=countnum%10; //没有%10时,到十位以上显示就不正常
SEI();
PORTC&=~(2); //LED取第十位,显示十位数
PORTB=num[temp]; //没有此行,按INT0没有作用,按INT1同时显示两个数
Delay(1);
PORTC|=0XFF;
SEI(); //打开全局中断
Delay(1);
}
}