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

📄 fpgadigitalclock.txt

📁 My thesis entitled "fpga digital clock," immature, to enlighten
💻 TXT
字号:
本程序是IIC设备读写IIC接口的PCF8563日历和时钟的范例,在调试状态时选择
输入当前时间值。设置可编程时钟输出为1HZ,并触发中断,中断程序中控制数码
管显示,数码管显示由BUTTON选择。按BUTTON1,显示切换。按BUTTON2,当前数值加
。按BUTTON3,当前数值减。按BUTTON4,确认写入
     
*********************************************************/

#include <stdio.h>
#include <io.h>
#include <system.h>
#include <math.h>

unsigned char function_key;
unsigned short int year;
unsigned char month,day,hour,minute,sec;
int month_confirm,hour_confirm;
int DigitLedCount;
unsigned char seg1,seg2,seg3,seg4;
int setup_flag;

/*********************************************
函数名:button_irq
功  能:button中断处理函数
输  入:context:相关内容指针,中断号
返  回: 
备  注:
      读取相应BUTTON数据,设置选择状态
**********************************************/
void button_irq(void *context,alt_u32 interrupt)
{
  int iRet;
  unsigned int data,uc;
  
  // 读取边沿捕获寄存器值 
  data=IORD(BUTTON_PIO_BASE,0x03);
  
  // 点亮相应的LED 
  IOWR(LED_PIO_BASE,0x00,data);
  
  switch(data){
    case 1:
      // 开放显示中断
      IOWR(RCLKOUT_BASE,0x02,0x01);
      setup_flag=0;
      
      // 显示切换 1、年 2、月日 3、时 分 4、秒
      function_key++;
      if(function_key>4)
        function_key=1;
      printf("function_key=%d\n",function_key);
      break;
    case 2:
      // 屏蔽显示中断
      IOWR(RCLKOUT_BASE,0x02,0x00);
      setup_flag=1;
      
      // 当前显示数值UP;
      switch(function_key){
        case 1:
          year++;
          seg1=year/1000;
          seg2=(year%1000)/100;
          seg3=(year%100)/10;
          seg4=year%10;
          break;
        case 2:
          if(!month_confirm)month++;
          else day++;
          seg1=month/10;
          seg2=month%10;
          seg3=day/10;
          seg4=day%10;
          break;
        case 3:
          if(!hour_confirm)hour++;
          else minute++;
          seg1=hour/10;
          seg2=hour%10;
          seg3=minute/10;
          seg4=minute%10;
          break;
        case 4:
          sec++;
          seg1=0;
          seg2=0;
          seg3=sec/10;
          seg4=sec%10;
          break;
      }
      break;
    case 4:
      // 屏蔽显示中断
      IOWR(RCLKOUT_BASE,0x02,0x00);
      setup_flag=1;
      
      // 当前显示数值DOWN;
      switch(function_key){
        case 1:
          year--;
          seg1=year/1000;
          seg2=(year%1000)/100;
          seg3=(year%100)/10;
          seg4=year%10;
          break;
        case 2:
          if(!month_confirm)month--;
          else day--;
          
          seg1=month/10;
          seg2=month%10;
          seg3=day/10;
          seg4=day%10;
          break;
        case 3:
          if(!hour_confirm)hour--;
          else minute--;
          seg1=hour/10;
          seg2=hour%10;
          seg3=minute/10;
          seg4=minute%10;
          break;
        case 4:
          sec--;
          seg1=0;
          seg2=0;
          seg3=sec/10;
          seg4=sec%10;
          break;
      }
      break;
    case 8:
      // 开放显示中断
      IOWR(RCLKOUT_BASE,0x02,0x01);
      setup_flag=0;
      
      // 确认当前数值,写入PCF8563
      switch(function_key){
        case 1:
          //写入年
          year=year % 100;
          uc=((year/10)<<4)|(year%10);
          I2C_write_byte(0xA2,0x08,uc);
          break;
        case 2:
          if(!month_confirm){
            month_confirm=1;
            //写入月份
            uc=((month/10)<<4)|(month%10);
            I2C_write_byte(0xA2,0x07,uc);
          }else{
            month_confirm=0;
            //写入日期
            uc=((day/10)<<4)|(day%10);
            I2C_write_byte(0xA2,0x05,uc);
          }
          break;
        case 3:
          if(!hour_confirm){
            hour_confirm=1;
            
            //写入小时
            uc=((hour/10)<<4)|(hour%10);
            I2C_write_byte(0xA2,0x04,uc);
          }else{
            hour_confirm=0;
            //写入分钟
            uc=((minute/10)<<4)|(minute%10);
            I2C_write_byte(0xA2,0x03,uc);
          }
          break;
        case 4:
          sec--;
          uc=((sec/10)<<4)|(sec%10);
          I2C_write_byte(0xA2,0x02,uc);
          break;
      } 
      break;  
  }

  if(setup_flag){
    // 数码管显示
    IOWR(SERIAL_SEGMENT_0_BASE, 0x00,seg1);
    IOWR(SERIAL_SEGMENT_0_BASE, 0x01,seg2);
    IOWR(SERIAL_SEGMENT_0_BASE, 0x02,seg3);
    IOWR(SERIAL_SEGMENT_0_BASE, 0x03,seg4); 
  }
  
  // 清除边沿捕获寄存器 
  IOWR(BUTTON_PIO_BASE,0x03,0x00);
}

⌨️ 快捷键说明

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