volatile int edge_capture; #ifdef KEY_BASE static void handle_button_interrupts(void* context, alt_u32 id) { volatile int* edge_capture_ptr = (volatile int*) context; /* 存储按钮的值到边沿捕获寄存器中 */ *edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE); /* 复位边沿捕获寄存器 */ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE, 0); } /* 初始化button_pio */ static void init_button_pio() { /* Recast the edge_capture pointer to match the alt_irq_register() function * prototype. */ void* edge_capture_ptr = (void*) &edge_capture; /* 开放全部4个按钮的中断 */ IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_BASE, 0xf); /* 复位边沿捕获寄存器*/ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE, 0x0); /* 登记中断源 */ alt_irq_register( KEY_IRQ, edge_capture_ptr, handle_button_interrupts ); } #endif int main (void) { init_button_pio(); while(1) { switch(edge_capture) { case 0x01: printf("key=1"); break; case 0x02: printf("key=2"); break; } } } 完整程序如上,按一次按键1后,照理说应该只进行了一次边沿触发,可是屏幕上却不断打印出key=1,为什么?是不是要清除什么标志?
[此贴子已经被作者于2007-9-22 14:32:37编辑过] |