IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_BASE,0xff); //允许8个按键中断 IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE,0); //清除中断标志寄存器 alt_irq_register(KEY_IRQ,NULL,Button_Irq_Handler); //注册中断 }
static void display(int num) {
IOWR_ALTERA_AVALON_PIO_DATA(SEL_BASE,0); //数码管位选
IOWR_ALTERA_AVALON_PIO_DATA(DAT_BASE,segtab[num]); //显示倒计时 usleep(1000); }
/*------------------------------------------------------------------ ***********************按键中断处理函数**************************** *-----------------------------------------------------------------*/
static void Button_Irq_Handler(void* context,alt_u32 id) { int i;
for(i=0;i<9;i++) {
num=9-i; display(num);
IOWR_ALTERA_AVALON_PIO_DATA(A_BASE, 1);//蜂鸣器响起 IOWR_ALTERA_AVALON_PIO_DATA(LED1_BASE, 0); IOWR_ALTERA_AVALON_PIO_DATA(LED2_BASE, 1); usleep(500000);
IOWR_ALTERA_AVALON_PIO_DATA(LED2_BASE, 0); usleep(500000); }
IOWR_ALTERA_AVALON_PIO_DATA(A_BASE, 0);//蜂鸣器关闭 IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE,0); num=0;
display(num); }
int main(void) {
printf(\
Button_ISR_Init(); //按键中断初始化
while(1) {
usleep(100000);
IOWR_ALTERA_AVALON_PIO_DATA(LED1_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(LED2_BASE, 0); num=0; display(num); } return 0; }
六、设计结果
按键未按下时,处于初始状态:LED1亮,LED2灭,数码管显示为0,蜂鸣器未启动;按键按下之后,LED1灭,LED2闪烁,数码管进入9秒倒计时并且蜂鸣器响;9秒后恢复初始状态。
七、设计问题
设计中遇到了不少问题:
一开始因为延迟原因使得蜂鸣器音乐间断,后来将延迟时间缩短后问题解决;
然后在数码管动态显示时,也存在延时问题,按下按键后数码管在一秒后才进入倒计时,修改程序后问题解决;
八、心得感受
通过本次设计,我们更加熟悉C语言和SOPC,也在自己动手设计中发现了平时所没遇到的很多问题,包括硬件和软件方面的,有一部分是粗心,有一部分确实是不够了解这门技术;因此在设计过程中,我们不断和其他小伙伴探讨后解决了问题,并从他们那里学到了不少东西。