سلام دوستان
من یه برنامه دارم که خواستم باهاش وقفه دریافت یوزارت رو تست کنم. مدارمو به شکل زیر بستم:

این هم برنامم:
میبینید که خیلی سادس! ولی مگه نباید وقتی کلید رو یه لحظه فشار میدم فقط یک بار وارد وقفه بشه و یک واحد فقط به f اضافه بشه؟! یعنی با هربار زدن کلید یک بار وارد وقفه بشه.
ولی به محض زدن کلید با سرعت f شروع به شمردن میکنه و دیگه قطع نمیشه! هم توی پروتئوس و هم در عمل اینجوریه! علت چیه؟ من جایی دارم اشتباه میکنم؟
من یه برنامه دارم که خواستم باهاش وقفه دریافت یوزارت رو تست کنم. مدارمو به شکل زیر بستم:

این هم برنامم:
کد:
#include <mega32a.h> #include <alcd.h> #include <stdio.h> char str[16],f; interrupt [USART_RXC] void usart_rx_isr(void) { f++; } void main(void){ { // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: Off // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x90; UCSRC=0x06; UBRRH=0x00; UBRRL=0x33; // Alphanumeric LCD initialization // Connections are specified in the // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTC Bit 0 // RD - PORTC Bit 1 // EN - PORTC Bit 2 // D4 - PORTC Bit 3 // D5 - PORTC Bit 4 // D6 - PORTC Bit 5 // D7 - PORTC Bit 6 // Characters/line: 16 lcd_init(16); // Global enable interrupts #asm("sei") } while (1) { lcd_gotoxy(0,0); sprintf(str,"%04d",f); lcd_puts(str); } }
ولی به محض زدن کلید با سرعت f شروع به شمردن میکنه و دیگه قطع نمیشه! هم توی پروتئوس و هم در عمل اینجوریه! علت چیه؟ من جایی دارم اشتباه میکنم؟
دیدگاه