目的:此处利用按键中断完成数码管显示读数的控制
sopc:设置key为input port——下降沿中断
nios:
main.c
/*
* ====================================================
* Filename: main.c
* Description:
* Version:
* Created:
* Revision: none
* Compiler: Nios II IDE
* Author: lasers
* Company: 441lab
* =====================================================
*/
#include " ../inc/sopc.h " // 包含nios系统信息
#include " altera_avalon_pio_regs.h " // PIO内核信息描述
#include " sys/alt_irq.h " // 中断访问文件
#include " stdio.h " // 输出文件
// volatile alt_u32 edge_capture;
void display(); // 显示函数声明
alt_u32 btd_cnt = 0 ; // 定义全局变量,作为SEG显示的参数
void key_irq( void * context, alt_u32 id) // 按键中断函数
{
// volatile alt_u32 * edge_capture_ptr = (volatile alt_u32 *) context;
//
// *edge_capture_ptr = KEY->EDGE_CAPTURE;
if (btd_cnt < 9 )
{
btd_cnt ++ ;
}
else
{
btd_cnt = 0 ;
}
display(btd_cnt);
KEY -> EDGE_CAPTURE = 0 ; // 边沿捕获寄存器清零
}
int init_key() // 按键中断初始化函数
{
// void * edge_capture_ptr = (void *) &edge_capture;
KEY -> INTERRUPT_MASK = 1 ; // 开按键中断
KEY -> EDGE_CAPTURE = 0 ; // 边沿捕获寄存器清零
return alt_irq_register(KEY_PIO_IRQ,NULL,key_irq); // 注册中断服务函数,成功则返回0
}
void display(num) // 数码管显示函数
{
alt_u8 segtab[ 10 ] = { 0x40 , 0x79 , 0x24 , 0x30 , 0x19 , 0x12 , 0x02 , 0x78 , 0x00 , 0x18 };
SEG0 -> DATA = segtab[num];
}
int main()
{
if ( ! init_key()) // 判断初始化是否成功,成功返回0
{
printf( " Key irq success!\n " );
}
else
{
printf( " Error irq!\n " );
}
while ( 1 )
{
display(btd_cnt);
}
}
* ====================================================
* Filename: main.c
* Description:
* Version:
* Created:
* Revision: none
* Compiler: Nios II IDE
* Author: lasers
* Company: 441lab
* =====================================================
*/
#include " ../inc/sopc.h " // 包含nios系统信息
#include " altera_avalon_pio_regs.h " // PIO内核信息描述
#include " sys/alt_irq.h " // 中断访问文件
#include " stdio.h " // 输出文件
// volatile alt_u32 edge_capture;
void display(); // 显示函数声明
alt_u32 btd_cnt = 0 ; // 定义全局变量,作为SEG显示的参数
void key_irq( void * context, alt_u32 id) // 按键中断函数
{
// volatile alt_u32 * edge_capture_ptr = (volatile alt_u32 *) context;
//
// *edge_capture_ptr = KEY->EDGE_CAPTURE;
if (btd_cnt < 9 )
{
btd_cnt ++ ;
}
else
{
btd_cnt = 0 ;
}
display(btd_cnt);
KEY -> EDGE_CAPTURE = 0 ; // 边沿捕获寄存器清零
}
int init_key() // 按键中断初始化函数
{
// void * edge_capture_ptr = (void *) &edge_capture;
KEY -> INTERRUPT_MASK = 1 ; // 开按键中断
KEY -> EDGE_CAPTURE = 0 ; // 边沿捕获寄存器清零
return alt_irq_register(KEY_PIO_IRQ,NULL,key_irq); // 注册中断服务函数,成功则返回0
}
void display(num) // 数码管显示函数
{
alt_u8 segtab[ 10 ] = { 0x40 , 0x79 , 0x24 , 0x30 , 0x19 , 0x12 , 0x02 , 0x78 , 0x00 , 0x18 };
SEG0 -> DATA = segtab[num];
}
int main()
{
if ( ! init_key()) // 判断初始化是否成功,成功返回0
{
printf( " Key irq success!\n " );
}
else
{
printf( " Error irq!\n " );
}
while ( 1 )
{
display(btd_cnt);
}
}
sopc.h
#ifndef SOPC_H_
#define SOPC_H_
#include " system.h "
#include " alt_types.h "
#define _KEY
#define _SEG0
typedef struct
{
alt_u32 DATA;
alt_u32 DIRECTION;
alt_u32 INTERRUPT_MASK;
alt_u32 EDGE_CAPTURE;
}PIO_STR;
#ifdef _KEY
#define KEY ((PIO_STR *)KEY_PIO_BASE)
#endif
#ifdef _SEG0
#define SEG0 ((PIO_STR *)SEG0_PIO_BASE)
#endif
#endif /*SOPC_H_*/
#define SOPC_H_
#include " system.h "
#include " alt_types.h "
#define _KEY
#define _SEG0
typedef struct
{
alt_u32 DATA;
alt_u32 DIRECTION;
alt_u32 INTERRUPT_MASK;
alt_u32 EDGE_CAPTURE;
}PIO_STR;
#ifdef _KEY
#define KEY ((PIO_STR *)KEY_PIO_BASE)
#endif
#ifdef _SEG0
#define SEG0 ((PIO_STR *)SEG0_PIO_BASE)
#endif
#endif /*SOPC_H_*/