大连工作的硬件工程师

带有外部中断的60S timer

上一篇 / 下一篇  2008-11-17 10:59:38 / 个人分类:研发心得

#include <stdio.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "altera_avalon_timer_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"

#define seg_7      0x00001820
#define drive      0x00001830
#define timer_0    0x00001800
#define key        0x00001840

int main (void) __attribute__ ((weak, alias ("alt_main")));
alt_u8 seg_4_7(int count);

volatile int count_0;
volatile int count_1;
volatile int count_2;
volatile int count_3;
alt_u8 seg;

static void  handle_key_interrupts()
{
  alt_u8 k;
  int i;
  k = IORD_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE);
  if(k==0x0001)
  {
    IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE,0x0008);
  }
  else
  {
    IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE,0x0007);
  }
  for(i=0;i<1000;i++);
  IOWR_ALTERA_AVALON_PIO_EDGE_CAP(key,0x0);
}


//=============================================================================
//timer interrupt 0
//=============================================================================
static void handle_timer0_interrupts()
{
    IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE,0x0000);
    if(count_0<9)
    {
      count_0+=1;
    }
    else
    {
      count_0=0;
      if(count_1<9)
      {
        count_1+=1;
      }
      else
      {
        count_1=0;
        if(count_2<9)
        {
          count_2+=1;
        }
        else
        {
          count_2=0;
          if(count_3<5)
          {
            count_3+=1;
          }
          else
          {
            count_3=0;
            IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE,0x0008);
          }
        }
      }
    }
}

//=============================================================================
//main function
//=============================================================================
int alt_main (void)
{
  alt_u8 seg = 0xff;
  alt_u8 dri = 0xf;
 
  int i;
 
  count_0 = 0;
  count_1 = 0;
  count_2 = 0;
  count_3 = 0;
  seg=seg_4_7(count_0);  

  //timer_0 interrupt setup
  IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE,0x0007);
  alt_irq_enable_all(0x1);
  alt_irq_register(TIMER_0_IRQ,TIMER_0_BASE,handle_timer0_interrupts);
 
  //button interrupt setup
  IOWR_ALTERA_AVALON_PIO_EDGE_CAP(key,0x3);
  IOWR_ALTERA_AVALON_PIO_IRQ_MASK(key,0x1);
  alt_irq_register(2,key,handle_key_interrupts);
   
  while (1)
  {
    for(i=0;i<1000;i++);
    seg=seg_4_7(count_0);
    IOWR_ALTERA_AVALON_PIO_DATA(seg_7, seg);
    IOWR_ALTERA_AVALON_PIO_DATA(drive, 0x1);
    for(i=0;i<1000;i++);
    seg=seg_4_7(count_1);
    IOWR_ALTERA_AVALON_PIO_DATA(seg_7, seg);
    IOWR_ALTERA_AVALON_PIO_DATA(drive, 0x2);
    for(i=0;i<1000;i++);
    seg=seg_4_7(count_2);
    IOWR_ALTERA_AVALON_PIO_DATA(seg_7, seg);
    IOWR_ALTERA_AVALON_PIO_DATA(drive, 0x4);
    for(i=0;i<1000;i++);
    seg=seg_4_7(count_3);
    IOWR_ALTERA_AVALON_PIO_DATA(seg_7, seg);
    IOWR_ALTERA_AVALON_PIO_DATA(drive, 0x8);
  }
  return 0;
}

//=============================================================================
//4bit--7segment decode
//=============================================================================
alt_u8 seg_4_7(int count)
{
  alt_u8 seg_temp;
 
  switch(count)
  {
    case 0: seg_temp=0x3f;break;//00111111;
    case 1: seg_temp=0x06;break;//00000110;
    case 2: seg_temp=0x5b;break;//01011011;
    case 3: seg_temp=0x4f;break;//01001111;
    case 4: seg_temp=0x66;break;//01100110;
    case 5: seg_temp=0x6d;break;//01101101;
    case 6: seg_temp=0x7d;break;//01111101;
    case 7: seg_temp=0x07;break;//00000111;
    case 8: seg_temp=0x7f;break;//01111111;
    case 9: seg_temp=0x6f;break;//01101111;
    default:seg_temp=0xff;
  }
  return(seg_temp);
}


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar