?? fpgadigitalclock.txt
字號:
本程序是IIC設(shè)備讀寫IIC接口的PCF8563日歷和時鐘的范例,在調(diào)試狀態(tài)時選擇
輸入當(dāng)前時間值。設(shè)置可編程時鐘輸出為1HZ,并觸發(fā)中斷,中斷程序中控制數(shù)碼
管顯示,數(shù)碼管顯示由BUTTON選擇。按BUTTON1,顯示切換。按BUTTON2,當(dāng)前數(shù)值加
。按BUTTON3,當(dāng)前數(shù)值減。按BUTTON4,確認(rèn)寫入
*********************************************************/
#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;
/*********************************************
函數(shù)名:button_irq
功 能:button中斷處理函數(shù)
輸 入:context:相關(guān)內(nèi)容指針,中斷號
返 回:
備 注:
讀取相應(yīng)BUTTON數(shù)據(jù),設(shè)置選擇狀態(tài)
**********************************************/
void button_irq(void *context,alt_u32 interrupt)
{
int iRet;
unsigned int data,uc;
// 讀取邊沿捕獲寄存器值
data=IORD(BUTTON_PIO_BASE,0x03);
// 點亮相應(yīng)的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;
// 當(dāng)前顯示數(shù)值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;
// 當(dāng)前顯示數(shù)值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;
// 確認(rèn)當(dāng)前數(shù)值,寫入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){
// 數(shù)碼管顯示
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);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -