⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 数字钟的程序.c

📁 Altera FPGA工程师成长手册源文件清华大学
💻 C
字号:
#include "system.h"                      
#include "altera_avalon_timer_regs.h"    
#include "altera_avalon_pio_regs.h"     
#include "alt_types.h"                  
#include "sys/alt_irq.h"                  
#include "sys/alt_alarm.h"             
#include "unistd.h"                      

#define seg  *(volatile unsigned char *) SM_SEG_BASE 
#define bit  *(volatile unsigned char *) SM_BIT_BASE 
#define key  *(volatile unsigned char *) KEY_BASE 

void Timer_Init();                         	//定时器初始化函数
void Timer_ISR(void* context, alt_u32 id);   	//定时器中断服务函数
void display();                           	//数码管显示函数
void KeyDown_ISR(void* context, alt_u32 id);	// 按键中断服务函数
void KeyDown_Init();                      	/按键中断初始化函数

alt_u8 duan[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF};
									//共阳数码管的0到9的段码
alt_u8 num[8] = {0,0,0,0,0,0,0,0};       		//时,分,秒初始化
alt_u8 second,min,hour;                	//秒,分,时

void KeyDown_ISR(void* context, alt_u32 id)
{
     if(key==0x0e) { second = 0;  while(key == 0x0e){display();} }                       
     if(key==0x0d) {min++;if(min==60) min=0;while(key == 0x0d){display();}}        
     if(key==0x0b) {hour++;if(hour == 24) hour=0;while(key == 0x0b){display();}}   
     if(key==0x07){min--;if(min==0)min=60;while(key==0x07){display();}} 
     IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE, 0x00);   
}

void KeyDown_Init()
{
    IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_BASE, 0x0f);    
    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE, 0x00);   
    alt_irq_register(KEY_IRQ,0,KeyDown_ISR);           
}

void Timer_Init()
{
    alt_irq_register(TIMER_IRQ,0,Timer_ISR);         
    IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE, 0);   
    IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_BASE, 7);  
}

void Timer_ISR(void* context, alt_u32 id)
{
    second++;
    if(second == 60) { min++; second = 0;}
    if(min == 60) { hour++; min = 0;}
    if(hour == 24) { hour = 0;} 
    if(second % 2) duan[10] = 0xff;
    else duan[10] = 0xbf;             
    IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE, 0);    
}

void display()
{
    alt_u8 j;
    num[0] = second % 10;
    num[1] = second / 10;
    num[2] = 10;
    num[3] = min % 10;
    num[4] = min / 10;
    num[5] = 10;
    num[6] = hour % 10;
    num[7] = hour / 10;
     
   for(j=0; j<8; j++)
   {
       bit = ~(0x01 << j);    
       seg = duan[num[j]];  
       sleep(500);   
    }
}

int main(void)
{   
    Timer_Init();   
    KeyDown_Init(); 
    while(1)
    {
        display();  
    }
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -