📄 fpgadigitalclock.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 + -