按键的编程—中断检测按键

基于轮询的方法效率会比较低,在大型的系统中,或者实时性要求比较高的系统中应该慎重使用。而使用中断的编程就更好的实现了按键和cpu的异步工作,可以很好的解决效率问题。不过后面我们可以看到,这也不是最好啊。

 

不过,基于中断也有总体有两种思路。

1.把按键接到单片机的外部中断口,比如mega48的INT0或者INT0(下面的程序就是这样的接的)。值得高兴的是,mega48提供了PCINT0-23口,可以很方便的检测很多的外部中断。在一个项目中,我就是利用48的这么多中断口来实现对多个电机的状态检测(通,断)。

2.利用单片机的定时器,每隔一定时间(10ms)去检测一下按键的状态,这样的话,可以减少外部中断口的应用。(但是对于像48这样,有这么多外部中断口的芯片。第一种方法也挺好的。)

/*检测一个按键的按下,采用中断的方法,实时性较好*/ #include #include #include volatile unsigned char key_value = 0; //全局变量,用来记录键值,这里简单的用0,1来表示按键的状态值 void IO_initial(); void interrupt_initial(); void IO_initial(){ DDRC = 0xff; //C口作为输出,控制二极管 PORTC = 0x00; interrupt_initial(); } void interrupt_initial(){ DDRD &= ~_BV(PD2); //D口作为输入 PORTD |= _BV(PD2); //使能内部上拉电阻 EICRA = _BV(ISC01); //INT0下降沿触发 EIMSK = _BV(INT0); //开INT0的中断 sei(); //开全局中断 } ISR(INT0_vect){ _delay_ms(10); if((PIND&_BV(PD2))==0) PORTC ^=0x01; while((PIND&_BV(PD2))==0); _delay_ms(10); } int main(){ IO_initial(); while(1); //死循环,等待中断 }

ok,完毕了。gcc下,proteus检验通过

你可能感兴趣的:(按键的编程—中断检测按键)