欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

uart.c

在开发FPGA上比较有用
C
字号:
/***************************************************
*模块说明 :
*模块功能:查询当前时间函数
*备注:
*由navigator团队创作 
***************************************************/
#include <stdio.h>
#include <alt_types.h>
#include <io.h>
#include <system.h>
#include <string.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"

unsigned char function_key;
unsigned short int year;
unsigned char month,day,hour,minute,sec,minute1;
int month_confirm,hour_confirm;
int DigitLedCount;
unsigned char seg1,seg2,seg3,seg4;
int setup_flag;
/*********************************************
函数名:rclkint_irq
功  能:PCF8563中断请求处理函数
输  入:context:相关内容指针,中断号
返  回: 
备  注:
     
**********************************************/
void rclkint_irq(void *context,alt_u32 interrupt)
{
  int iRet;
  unsigned int data;
  unsigned char seg1,seg2,seg3,seg4;
  data=IORD(RCLKINT_BASE,0x03);
  IOWR(RCLKINT_BASE,0x03,0x00);
}


int timereport()
{
  unsigned char data;                               ///* 读取边沿捕获寄存器值 */
   FILE *fp_lcd;
   fp_lcd=fopen(LCD_16702_0_NAME,"w");
       //读取键盘字符
  int iRet,i;
  unsigned char uc;
  month_confirm=hour_confirm=0;
  DigitLedCount=0;
  setup_flag=0;
  // 清除边沿捕获寄存器 
  IOWR(BUTTON_PIO_BASE,0x03,0x00);
  IOWR(RCLKOUT_BASE,0x03,0x00);
  IOWR(RCLKINT_BASE,0x03,0x00);
  // 初始化I2C设备
  iRet=init_i2c(FREEDEV_I2C_0_BASE);
  
  // 初始化PCF8563控制寄存器0 STOP
  iRet=I2C_write_byte(0xA2,0x00,0x20);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x00] error iRet=%d\n",iRet);
    return 0;  
  }
 
  // 初始化PCF8563控制寄存器1
  iRet=I2C_write_byte(0xA2,0x01,0x00);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x01] error iRet=%d\n",iRet);
    return 0;  
  }
  
  // 初始化PCF8563 CLKOUT频率寄存器 0X83
  iRet=I2C_write_byte(0xA2,0x0D,0x83);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x0D] error iRet=%d\n",iRet);
    return 0;  
  }
  
  // 初始化秒寄存器
  iRet=I2C_write_byte(0xA2,0x02,0x80);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x02] error iRet=%d\n",iRet);
    return 0;  
  }
    
  // 初始化PCF8563控制寄存器0 START
  iRet=I2C_write_byte(0xA2,0x00,0x00);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x00] error iRet=%d\n",iRet);
    return 0;  
  } 
  
  /* 开放中断屏蔽 */
  IOWR(BUTTON_PIO_BASE,0x02,0x0f);
  IOWR(RCLKOUT_BASE,0x02,0x01);
  IOWR(RCLKINT_BASE,0x02,0x01);
  
 // unsigned char data;
  /* 读取边沿捕获寄存器值 */
       data=IORD(RCLKOUT_BASE,0x03);
     iRet=I2C_read_byte(0xa3,0x07,&data);
      if( (data & 0x80) ){
        seg1=1;
        seg2=9;
      }else{
        seg1=2;
        seg2=0;
      }
 
      iRet=I2C_read_byte(0xA3,0x08,&data);
      seg3=(data & 0xf0)>>4;
      seg4=(data & 0x0f);
      year=seg1*1000+seg2*100+seg3*10+seg4;
      iRet=I2C_read_byte(0xA3,0x07,&data);
      seg1=(data & 0x10)>>4;
      seg2=(data & 0x0f);
      month=seg1*10+seg2;
      iRet=I2C_read_byte(0xA3,0x05,&data);
      seg3=(data & 0x30)>>4;
      seg4=(data & 0x0f);
      day=seg3*10+seg4;
      iRet=I2C_read_byte(0xA3,0x04,&data);
      seg1=(data & 0x30)>>4;
      seg2=(data & 0x0f);
      hour=seg1*10+seg2;
      iRet=I2C_read_byte(0xA3,0x03,&data);
      seg3=(data & 0x70)>>4;
      seg4=(data & 0x0f);
      minute=seg3*10+seg4;
      iRet=I2C_read_byte(0xA3,0x06,&data);
      seg3=(data & 0x30)>>4;
      seg4=(data & 0x0f);
      minute1=seg3*10+seg4;
      printf("%d年%d月%d日%d时%d分\n",year,month,day,hour,minute);
      fprintf(fp_lcd,"  Y: M: D: H: M:\n");
   /*   if(day == 19)
        aic23_play();
      if(hour)*/
    ///  aic23_play(3022);aic23_play(3024);aic23_play(3027);
      fprintf(fp_lcd," %d.%d.%d %d:%d\n",year,month,day,hour,minute);
     return 0;
}

/******************************************************
 * 函数名称:minutereport
* 功能:一共一些函数作为中断处理
*输  入:context:相关内容指针,中断号
*返  回: 分钟值
*备  注:由navigator团队创作    
**********************************************/

 int minutereport()
 {
      unsigned char data;                               ///* 读取边沿捕获寄存器值 */
  int iRet,i;
  unsigned char uc;
  month_confirm=hour_confirm=0;
  DigitLedCount=0;
  setup_flag=0;
  // 清除边沿捕获寄存器 
  IOWR(BUTTON_PIO_BASE,0x03,0x00);
  IOWR(RCLKOUT_BASE,0x03,0x00);
  IOWR(RCLKINT_BASE,0x03,0x00);
  // 初始化I2C设备
  iRet=init_i2c(FREEDEV_I2C_0_BASE);
  
  // 初始化PCF8563控制寄存器0 STOP
  iRet=I2C_write_byte(0xA2,0x00,0x20);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x00] error iRet=%d\n",iRet);
    return 0;  
  }
 
  // 初始化PCF8563控制寄存器1
  iRet=I2C_write_byte(0xA2,0x01,0x00);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x01] error iRet=%d\n",iRet);
    return 0;  
  }
  
  // 初始化PCF8563 CLKOUT频率寄存器 0X83
  iRet=I2C_write_byte(0xA2,0x0D,0x83);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x0D] error iRet=%d\n",iRet);
    return 0;  
  }
  
  // 初始化秒寄存器
  iRet=I2C_write_byte(0xA2,0x02,0x80);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x02] error iRet=%d\n",iRet);
    return 0;  
  }
    
  // 初始化PCF8563控制寄存器0 START
  iRet=I2C_write_byte(0xA2,0x00,0x00);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x00] error iRet=%d\n",iRet);
    return 0;  
  } 
  
  /* 开放中断屏蔽 */
  IOWR(RCLKOUT_BASE,0x02,0x01);
  IOWR(RCLKINT_BASE,0x02,0x01);
  
 // unsigned char data;
  /* 读取边沿捕获寄存器值 */
       data=IORD(RCLKOUT_BASE,0x03);
     iRet=I2C_read_byte(0xa3,0x07,&data);
      if( (data & 0x80) ){
        seg1=1;
        seg2=9;
      }else{
        seg1=2;
        seg2=0;
      }
      iRet=I2C_read_byte(0xA3,0x03,&data);
      seg3=(data & 0x70)>>4;
      seg4=(data & 0x0f);
      minute=seg3*10+seg4;
      printf("%d分\n",minute);
      return minute;
    
 }
int secreport()
 {
      unsigned char data;                               ///* 读取边沿捕获寄存器值 */
  int iRet,i;
  unsigned char uc;
  month_confirm=hour_confirm=0;
  DigitLedCount=0;
  setup_flag=0;
  // 清除边沿捕获寄存器 
  IOWR(BUTTON_PIO_BASE,0x03,0x00);
  IOWR(RCLKOUT_BASE,0x03,0x00);
  IOWR(RCLKINT_BASE,0x03,0x00);
  // 初始化I2C设备
  iRet=init_i2c(FREEDEV_I2C_0_BASE);
  
  // 初始化PCF8563控制寄存器0 STOP
  iRet=I2C_write_byte(0xA2,0x00,0x20);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x00] error iRet=%d\n",iRet);
    return 0;  
  }
 
  // 初始化PCF8563控制寄存器1
  iRet=I2C_write_byte(0xA2,0x01,0x00);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x01] error iRet=%d\n",iRet);
    return 0;  
  }
  
  // 初始化PCF8563 CLKOUT频率寄存器 0X83
  iRet=I2C_write_byte(0xA2,0x0D,0x83);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x0D] error iRet=%d\n",iRet);
    return 0;  
  }
  
  // 初始化秒寄存器
  iRet=I2C_write_byte(0xA2,0x02,0x80);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x02] error iRet=%d\n",iRet);
    return 0;  
  }
    
  // 初始化PCF8563控制寄存器0 START
  iRet=I2C_write_byte(0xA2,0x00,0x00);
  if(iRet <0 )
  {
    printf("I2C_write_byte[0x00] error iRet=%d\n",iRet);
    return 0;  
  } 
  
  /* 开放中断屏蔽 */
  IOWR(RCLKOUT_BASE,0x02,0x01);
  IOWR(RCLKINT_BASE,0x02,0x01);
  int m;
 // unsigned char data;
  /* 读取边沿捕获寄存器值 */
  while(1)
  {
       data=IORD(RCLKOUT_BASE,0x03);
      seg1=0;
      seg2=0;
      iRet=I2C_read_byte(0xA3,0x02,&data);
      seg3=(data & 0x70)>>4;
      seg4=(data & 0x0f);
      sec=seg3*10+seg4;
    //  printf("sec=%d",sec);
     /// m=sec/59;
    //  printf("%d",m);
      switch(sec)
     {
        case  1 :
        printf("1");   break;
        case  2 :   printf("2"); break;
     }
  }  
      return sec;
 }
 int main ()
 {
 
    int a;
//    printf("the sec=");
    int secreport();
    secreport();
   /// a= minutereport();
  //  printf("sec=%d",a);
 
   return 0;
 }

⌨️ 快捷键说明

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