本程序,同时允许INT0,INT1中断。GICR = 0XC0也可写作 GICR = _BV(INT0) | _BV(INT1);
MCUCR = 0x0A是将两个中断设为下降沿触发.
以下是仿真的电路图:
以下是Studion6.2编译截图:
以下是程序:
- /*
- * GccApplication20.c
- *
- * Created: 2014-10-16 21:18:46
- * Author: Administrator
- */
- #define F_CPU 0x8000000UL
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <util/delay.h>
- #include <stdint.h>
- #define K1_CLEAR_ON() ((PIND & 0x10)== 0x00)
- #define K2_CLEAR_ON() ((PIND & 0x20)== 0x00)
- const uint8_t SEG_CODE[] = { 0xc0,0xf9,0xa4,0x80,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
- const uint8_t SCAN_BITs[] = {0x20,0x10,0x08,0x04,0x02,0x01};
- uint8_t Buffer_Counts[] = {0,0,0,0,0,0};
- uint16_t Count_A = 0,Count_B = 0;
- void Show_Counts()
- {
- uint8_t i;
-
- Buffer_Counts[2] = Count_A/100;
- Buffer_Counts[1] = Count_A %100/10;
- Buffer_Counts[0] = Count_A %10;
-
- if(Buffer_Counts[2]== 0)
- {
- Buffer_Counts[2] = 10;
- if(Buffer_Counts[1] == 0) Buffer_Counts[1] = 10;
- }
-
- Buffer_Counts[5] = Count_B/100;
- Buffer_Counts[4] = Count_B % 100 /10;
- Buffer_Counts[3] = Count_B % 10;
-
- if(Buffer_Counts[5] == 0)
- {
- Buffer_Counts[5] = 10;
- if(Buffer_Counts[4] == 0)Buffer_Counts[4] = 10;
- }
-
- for(i=0;i<6;i++)
- {
- PORTC = SCAN_BITs[i];
- PORTB = SEG_CODE[Buffer_Counts[i]];
- _delay_ms(1);
- }
- }
- int main(void)
- {
- DDRB = 0xFF;PORTB = 0xFF;
- DDRC = 0xFF;PORTC = 0xFF;
- DDRD = 0x00;PORTD = 0xFF;
- MCUCR = 0x0A;
- GICR = 0xC0;
- sei();
-
- while(1)
- {
- if(K1_CLEAR_ON())Count_A = 0;
- if(K2_CLEAR_ON())Count_B = 0;
- Show_Counts();
- }
- }
- ISR(INT0_vect)
- {
- Count_A++;
- }
- ISR(INT1_vect)
- {
- Count_B++;
- }
|