avr外部中断

来源:互联网 发布:3d地球仪软件 编辑:程序博客网 时间:2024/06/05 04:44
/***************************************************************************************              慧净电子10天学会AVR单片机与C语言视频教程配套程序源码             ****** 实验目的:HJ-1 M16 AVR实验板  《推荐用慧净电子的HJ-2G AVR多功能二合一开发板》 ****** MCU: ATmega16  部分C源码可以直接用于项目开发、欢迎复制共享、没有版权          ****** 作者:慧净免费助学会员  部分源码网上收集整理 感谢有共享精神的朋友             ****** 编译器:GCC                                                                   ****** 百度交流空间:http://hi.baidu.com/HJMCU                                       ****** 论坛交流:http://hjdz.5d6d.com                                                ****** 配套的硬件学习板网址:http://shop37031453.taobao.com                          ****** 日期:2008.12.18                                                              ****** 目标:用C语言写程序就这么简单:《1天入门、10天学会、1年精通单片机系列源码》   ****************************************************************************************///程序说明:#include <avr/io.h>        #include <util/delay.h>#include <avr/interrupt.h>   //中断函数头文件unsigned char Disp_Buff[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管字型码表显示:0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,Fvolatile unsigned char Counter;  //按键按下次数变量,如果在中断中调用全局变量,必须加                                 //volatile来定义,否则变量不会变化int main(void)            {PORTB = 0X00;      //DDRB = 0Xff;      ////PORTC &= ~(1 << PC6);  //配置数码管0的位选通口为低电平,不导通数码管//DDRC |= (1 << PC6);    ///配置数码管0的位选通口为输出,选通数码管0//PORTD = 0X08;     //一定要使能K2的上拉电阻,否则会有干扰PORTD = 0X00;//自己接下拉电阻DDRD = 0XF3;      //K1、K2按键(PD2、PD3)设置为输入端口MCUCR |= (1 << ISC11) | (1 << ISC01) | (1 << ISC00);                               //INT0设置为上升沿中断,INT1为下降沿中断请求    GICR |= (1 << INT0) | (1 << INT1);      //允许INT0、INT1中断GIFR |= (1 << INTF1) | (1 << INTF0);    //清除INT0、INT1中断标志位Counter = 0;                //按键按下次数变量清零PORTC |= (1 << PC6);       //选通数码管0    sei();          //使能全局中断  while(1){PORTB = Disp_Buff[Counter];//数码管显示按键按下次数}}//外部中断0函数,当按键K1按下后,进入此中断ISR(INT0_vect )            {_delay_ms(20);         //按键按下,延时一会再判断是否按下, 以消除干扰if((PIND & (1 <<  PD2)))    // 按键真正按下后,进行相应处理{if(++Counter >= 16) Counter = 0;//次数大于15,清零while((PIND & (1 <<  PD2)));//等待按键释放}}//外部中断1函数,当按键K2按下后,进入此中断ISR(INT1_vect){_delay_ms(20);         //判断按键按下,延时一会再判断是否按下, 以消除干扰if(!(PIND & (1 <<  PD3)))    // 按键真正按下后,进行相应处理{if(Counter) --Counter;  // 次数减1else Counter = 15;   //   次数为零则改成15while(!(PIND & (1 <<  PD3)));  //}}

原创粉丝点击