使用NIOS II处理器实现的60秒计时器
上一篇 / 下一篇 2008-11-17 10:27:29 / 个人分类:研发心得
#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;
//=============================================================================
//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);
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);
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: