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

📄 timer.c

📁 在nios II DE2开发板上开发的实时时钟
💻 C
字号:
#include "alt_types.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "system.h"
#include "sys/alt_irq.h"
#include "altera_avalon_pio_regs.h"
#include "count_binary.h"
#include "lcd.h"

//volatile int edge_capture;

void LCD_Init()
{
  //LCD初始化
  lcd_write_cmd(LCD_16207_0_BASE,0x38);
  usleep(2000);
  lcd_write_cmd(LCD_16207_0_BASE,0x0C);
  usleep(2000);
  lcd_write_cmd(LCD_16207_0_BASE,0x01);
  usleep(2000);
  lcd_write_cmd(LCD_16207_0_BASE,0x06);
  usleep(2000);
  lcd_write_cmd(LCD_16207_0_BASE,0x80);
  usleep(2000);
}

void LCD_Show_Text(char* Text)
{
  //LCD输出格式
  int i;
  for(i=0;i<strlen(Text);i++)
  {
    lcd_write_data(LCD_16207_0_BASE,Text[i]);
    usleep(2000);
  }
 }
 
 void LCD_Line1()
 {
  //向LCD写命令
  lcd_write_cmd(LCD_16207_0_BASE,0x80);
  usleep(2000);
 }
 
 void LCD_Line2()
 {
  //向LCD写命令
  lcd_write_cmd(LCD_16207_0_BASE,0xC0);
  usleep(2000);
 }
 
 static void handle_button_interrupts(void* context,alt_u32 id)
 {
  volatile int* edge_capture_ptr=(volatile int*)context;
  //存储按钮的值到边沿捕获寄存器
  *edge_capture_ptr=
  IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
  //复位边沿捕获触发器
  IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0);
 }
 
 //初始化button_pio
 static void init_button_pio()
 {
  void* edge_capture_ptr=(void*)&edge_capture;
  //开放全部4个按钮的中断
  IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xf);
  //复位边沿捕获触发器
  IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0x0);
  //登记中断源
  alt_irq_register(BUTTON_PIO_IRQ,edge_capture_ptr,handle_button_interrupts);
 }
 
 void delay(unsigned int x)
 {
  while(x--);
 }
 
 int check_month(int month)
 {
  if((month==1)||(month==3)||(month==5)||(month==7)
  ||(month==8)||(month==10)||(month==12))
  return 1;
  if((month==4)||(month==6)||(month==9)||(month==11))
  return 0;
  if(month==2)
  return 2;
 }
 
 int check_year(int year)
 {
  if(((year%400)==0)||(((year%4)==0)&&(year%100!=0)))
  return 1;
  else return 0;
 }
 
 int main(void)
 {
  int screen=1;
  int pos=0;
  int year,month,day,hour,minute,second;
  unsigned long sum;
  char date[16];
  char time[16];
  int year1=7;
  int year2=0;
  int year3=0;
  int year4=2;
  int month1=2;
  int month2=1;
  int day1=9;
  int day2=0;
  int hour4,hour3,hour2,hour1,minute2,minute1,second2,second1;
  unsigned int screenflag;
  hour=0;minute=0;second=0;year=2006;month=1;day=1;
  init_button_pio();
  LCD_Init();
  while(1)
  {
    if(pos>3) pos=0;
    if(screen>=2) screen=0;
    //na_LED8->np_piodata=1<<pos;
    if(screen==0) screenflag=8;
    else screenflag=0;
    IOWR_ALTERA_AVALON_PIO_DATA(LED_GREEN_BASE,(1<<pos)|screenflag);
    usleep(1000000);
    if(second<59) second++;
    else{
      second=0;
      if(minute<59) minute++;
      else{
        minute=0;
        if(hour<23) hour++;
        else{
          hour=0;
          if(check_month(month)==0&&day<30)
          day++;
          else if(check_month(month)==1&&day<31)
          day++;
          else if(check_month(month)==2&&check_year(year)&&day<29)
          day++;
          else if(check_month(month)==2&&!check_year(year)&&day<28)
          day++;
          //{
            //if(check_year(year)) 
              //{
               // if(day<29) day++;
               // else if(day<28) day++;
              //}
          //}
          //if(day<30) day++;
          else{
            day=1;
            if(month<12) month++;
            else{
              month=1;
              if(year<9999) year++;
              else year=2007;
            }
          }
        }
      }
    }
    switch(edge_capture)
    {
      case 0x08: 
      {
        pos=pos+1;
        if(pos==3)
        {
          screen+=1;
          //pos=0;
        }
      //{
        //pos=pos+1;
       // switch(edge_capture)
        //{
          //case 0x08:screen=screen+1;break;
          //case 0x04:pos=pos+1;break;
         // case 0x02:break;
        //}        
        break;
      }
      case 0x02:
      if(pos==0)
      {
        if(screen==0)
        {
          if(day>1)day--;
          else
          {
            if(check_month(month)==0)day=30;
            if(check_month(month)==1)day=31;
            if(check_month(month)==2)
            {
              if(check_year(year)) day=29;
              else day=28;
            }
          }
        }
        if(screen==1)
        {
          if(second>0) second--;
          else second=59;
        }
      }
      if(pos==1)
      {
        if(screen==0)
        {
          if(month>1) month--;
          else month=12;
        }
        if(screen==1)
        {
          if(minute>0) minute--;
          else minute=59;
        }
      }
      if(pos==2)
      {
        if(screen==0)
        {
          if(year>0) year--;
          else year=2007;
        }
        if(screen==1)
        {
          if(hour>0) hour--;
          else hour=23;
        }
      }
      break;
      case 0x04:
      if(pos==0)
      {
        if(screen==0)
        {
            if(check_month(month)==0)
            {
              if(day<30) day++;
              else day=1;
            }
            if(check_month(month)==1)
            {
              if(day<31) day++;
              else day=1;
            }
            if(check_month(month)==2)
            {
              if(check_year(year)) 
              {
                if(day<29) day++;
                else day=1;
              }
              else
              {
                if(day<28) day++;
                else day=1;
              }
            }
        }  
        if(screen==1)
        {
          if(second<59) second++;
          else second=0;
        }
      }
      if(pos==1)
      {
        if(screen==0)
        {
          if(month<12) month++;
          else month=1;
        }
        if(screen==1)
        {
          if(minute<59) minute++;
          else minute=0;
        }
      }
      if(pos==2)
      {
        if(screen==0)
        {
          if(year<9999) year++;
          else year=2007;
        }
        if(screen==1)
        {
          if(hour<23) hour++;
          else hour=0;
        }
      }
      break;
      //case 0x01:screen++;break;
    }
    edge_capture=0;
    {
      year4=year/1000;
      year3=(year-year4*1000)/100;
      year2=(year-year4*1000-year3*100)/10;
      year1=year%10;
      month2=month/10;
      month1=month%10;
      day2=day/10;
      day1=day%10;
      LCD_Line1();
      //while(screen==1&&pos==0)
      //{
        date[0]=' ';date[1]=' ';
        date[2]=year4+0x30;date[3]=year3+0x30;
        date[4]=year2+0x30;date[5]=year1+0x30;
        date[6]=' ';date[7]=' ';
        date[8]=month2+0x30;date[9]=month1+0x30;
        date[10]=' ';date[11]=' ';
        date[12]=day2+0x30;date[13]=day1+0x30;
        date[14]=' ';date[15]=' ';
        LCD_Show_Text(date);
      if(screen==0&&pos==0)
      {
        LCD_Line1();
        date[0]=' ';date[1]=' ';
        date[2]=year4+0x30;date[3]=year3+0x30;
        date[4]=year2+0x30;date[5]=year1+0x30;
        date[6]=' ';date[7]=' ';
        date[8]=month2+0x30;date[9]=month1+0x30;
        date[10]=' ';date[11]=' ';
        date[12]=day2+0x30;date[13]=day1+0x30;
        date[14]=' ';date[15]=' ';
        LCD_Show_Text(date);
        usleep(200000);
        LCD_Line1();
        date[0]=' ';date[1]=' ';
        date[2]=year4+0x30;date[3]=year3+0x30;
        date[4]=year2+0x30;date[5]=year1+0x30;
        date[6]=' ';date[7]=' ';
        date[8]=month2+0x30;date[9]=month1+0x30;
        date[10]=' ';date[11]=' ';
        date[12]=' ';date[13]=' ';
        date[14]=' ';date[15]=' ';
        LCD_Show_Text(date);
        usleep(100000);
      }
      if(screen==0&&pos==1)
      {
        LCD_Line1();
        date[0]=' ';date[1]=' ';
        date[2]=year4+0x30;date[3]=year3+0x30;
        date[4]=year2+0x30;date[5]=year1+0x30;
        date[6]=' ';date[7]=' ';
        date[8]=month2+0x30;date[9]=month1+0x30;
        date[10]=' ';date[11]=' ';
        date[12]=day2+0x30;date[13]=day1+0x30;
        date[14]=' ';date[15]=' ';
        LCD_Show_Text(date);
        usleep(200000);
        LCD_Line1();
        date[0]=' ';date[1]=' ';
        date[2]=year4+0x30;date[3]=year3+0x30;
        date[4]=year2+0x30;date[5]=year1+0x30;
        date[6]=' ';date[7]=' ';
        date[8]=' ';date[9]=' ';
        date[10]=' ';date[11]=' ';
        date[12]=day2+0x30;date[13]=day1+0x30;
        date[14]=' ';date[15]=' ';
        LCD_Show_Text(date);
        usleep(100000);
      }
       if(screen==0&&pos==2)
      {
        LCD_Line1();
        date[0]=' ';date[1]=' ';
        date[2]=year4+0x30;date[3]=year3+0x30;
        date[4]=year2+0x30;date[5]=year1+0x30;
        date[6]=' ';date[7]=' ';
        date[8]=month2+0x30;date[9]=month1+0x30;
        date[10]=' ';date[11]=' ';
        date[12]=day2+0x30;date[13]=day1+0x30;
        date[14]=' ';date[15]=' ';
        LCD_Show_Text(date);
        usleep(200000);
        LCD_Line1();
        date[0]=' ';date[1]=' ';
        date[2]=' ';date[3]=' ';
        date[4]=' ';date[5]=' ';
        date[6]=' ';date[7]=' ';
        date[8]=month2+0x30;date[9]=month1+0x30;
        date[10]=' ';date[11]=' ';
        date[12]=day2+0x30;date[13]=day1+0x30;
        date[14]=' ';date[15]=' ';
        LCD_Show_Text(date);
        usleep(100000);
      }
    }
    {
      hour4=0;hour3=0;
      hour2=hour/10;
      hour1=hour%10;
      minute2=minute/10;
      minute1=minute%10;
      second2=second/10;
      second1=second%10;
      time[0]=' ';time[1]=' ';
      time[2]=' ';time[3]=' ';
      time[4]=hour2+0x30;;time[5]=hour1+0x30;
      time[6]=':';time[7]=minute2+0x30;
      time[8]=minute1+0x30;time[9]=':';
      time[10]=second2+0x30;time[11]=second1+0x30;
      time[12]=' ';time[13]=' ';
      time[14]=' ';time[15]=' ';
      LCD_Line2();
      LCD_Show_Text(time);
      if(screen==1&&pos==0)
      {
        time[0]=' ';time[1]=' ';
        time[2]=' ';time[3]=' ';
        time[4]=hour2+0x30;;time[5]=hour1+0x30;
        time[6]=':';time[7]=minute2+0x30;
        time[8]=minute1+0x30;time[9]=':';
        time[10]=second2+0x30;time[11]=second1+0x30;
        time[12]=' ';time[13]=' ';
        time[14]=' ';time[15]=' ';
        LCD_Line2();
        LCD_Show_Text(time);
        usleep(200000);
        time[0]=' ';time[1]=' ';
        time[2]=' ';time[3]=' ';
        time[4]=hour2+0x30;;time[5]=hour1+0x30;
        time[6]=':';time[7]=minute2+0x30;
        time[8]=minute1+0x30;time[9]=':';
        time[10]=' ';time[11]=' ';
        time[12]=' ';time[13]=' ';
        time[14]=' ';time[15]=' ';
        LCD_Line2();
        LCD_Show_Text(time);
        usleep(100000);
      }
       if(screen==1&&pos==1)
      {
        time[0]=' ';time[1]=' ';
        time[2]=' ';time[3]=' ';
        time[4]=hour2+0x30;;time[5]=hour1+0x30;
        time[6]=':';time[7]=minute2+0x30;
        time[8]=minute1+0x30;time[9]=':';
        time[10]=second2+0x30;time[11]=second1+0x30;
        time[12]=' ';time[13]=' ';
        time[14]=' ';time[15]=' ';
        LCD_Line2();
        LCD_Show_Text(time);
        usleep(200000);
        time[0]=' ';time[1]=' ';
        time[2]=' ';time[3]=' ';
        time[4]=hour2+0x30;;time[5]=hour1+0x30;
        time[6]=':';time[7]=' ';
        time[8]=' ';time[9]=':';
        time[10]=second2+0x30;time[11]=second1+0x30;
        time[12]=' ';time[13]=' ';
        time[14]=' ';time[15]=' ';
        LCD_Line2();
        LCD_Show_Text(time);
        usleep(100000);
      }
      if(screen==1&&pos==2)
      {
        time[0]=' ';time[1]=' ';
        time[2]=' ';time[3]=' ';
        time[4]=hour2+0x30;;time[5]=hour1+0x30;
        time[6]=':';time[7]=minute2+0x30;
        time[8]=minute1+0x30;time[9]=':';
        time[10]=second2+0x30;time[11]=second1+0x30;
        time[12]=' ';time[13]=' ';
        time[14]=' ';time[15]=' ';
        LCD_Line2();
        LCD_Show_Text(time);
        usleep(200000);
        time[0]=' ';time[1]=' ';
        time[2]=' ';time[3]=' ';
        time[4]=' ';;time[5]=' ';
        time[6]=':';time[7]=minute2+0x30;
        time[8]=minute1+0x30;time[9]=':';
        time[10]=second2+0x30;time[11]=second1+0x30;
        time[12]=' ';time[13]=' ';
        time[14]=' ';time[15]=' ';
        LCD_Line2();
        LCD_Show_Text(time);
        usleep(100000);
      } 
    }
    //sum=year4*0x10000000+year3*0x1000000+year2*0x100000+year1*0x10000;
    //sum+=month2*0x1000+month1*0x100+day2*0x10+day1;
    //sum=minute2*0x10000000+minute1*0x1000000+second2*0x100000+second1*0x10000;
    sum=month2*0x10000000+month1*0x1000000+day2*0x100000+day1*0x10000;
    sum+=hour2*0x1000+hour1*0x100+minute2*0x10+minute1;
    IOWR_ALTERA_AVALON_PIO_DATA(SEG7_DISPLAY_BASE,sum);
  }
 }

      
            
 
  
  

⌨️ 快捷键说明

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