热度 7
2011-11-15 21:39
2282 次阅读|
0 个评论
//外部中断 只需要设置相关寄存器就可以了 程序很短也就几句就把外部中断设置好了,但是我们要理解它的用处,本程序中只写了外部中断0的下降沿方式触发,其实它还有其他的触发方式,大家不妨试试,例如电平触发。。。。/ //----------------------------------------------------------------- // 名称: INT0中断计数 //----------------------------------------------------------------- // 说明: 每次按下计数键时触发INT0中断,中断程序累加计数, // 计数值显示在三只数码管上,按下清零键时数码管清零. // //----------------------------------------------------------------- #include avr/io.h #include avr/interrupt.h #define INT8U unsigned char #define INT16U unsigned int //清零键按下 #define KEY_CLEAR_ON() ((PIND _BV(PD6)) == 0x00) //0-9的数字编码,最后一位为黑屏(索引为10) const INT8U DSY_CODE = {0,0,0}; //----------------------------------------------------------------- // 在数码管上显示计数值 //----------------------------------------------------------------- void Show_Count_ON_DSY() { Display_Buffer = Count/100; Display_Buffer = Count%100/10; Display_Buffer = Count%10; if(Display_Buffer ==0) { Display_Buffer = 10; if(Display_Buffer ==0) Display_Buffer = 10; } PORTA = DSY_CODE ]; PORTB = DSY_CODE ]; PORTC = DSY_CODE ]; } //I/O端口初始化 void Port_init() { DDRA = 0XFF; PORTA = 0X00; DDRB = 0XFF; PORTB = 0X00; DDRC = 0XFF; PORTC = 0X00; // DDRD = 0X00; // PORTD = 0XFF; } //INT0初始化 void INT0_init() { MCUCR = 0X02; //下降沿触发 GICR = 0x40; //使能中断 GIFR = 0x40; //标志位清零 SREG = 0X80; } //----------------------------------------------------------------- // 主程序 //----------------------------------------------------------------- int main() { Port_init(); INT0_init(); while(1) { if(KEY_CLEAR_ON()) Count = 0; Show_Count_ON_DSY(); } } //----------------------------------------------------------------- // INT0中断函数 //----------------------------------------------------------------- ISR (INT0_vect) { Count++; } /再来喊下口号,嘿嘿: 每天成长一点点,一棵小草也能成长为参天大树/