按键控制数码管显示

目的:此处利用按键中断完成数码管显示读数的控制

 

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);
    }
}

复制代码

 

 

 

 

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_*/
复制代码

你可能感兴趣的:(Nois,II)