?? system.c
字號:
//=========================================================================================//
//文件名稱:system.c
//功能描述:液晶顯示驅動,以及時間日期調整
//維護記錄:2006.7.31 by zhenlei
//==========================================================================================//
#include "SPCE061A.h"
#include "SPLC501User.h"
#include "Bit.h"
#define serial_clk IOB1_Data
#define serial_data IOB0_Data
extern void keyscan(); //鍵盤掃描函數聲明
extern void PlayRespond(unsigned int Result);
extern void F_Disp_Drv(unsigned int i,unsigned int j);
//語音播放函數聲明
void showhour(int showhour); //顯示小時函數聲明
void ring_choice(); //鈴聲選擇函數聲明
void BCD(unsigned int c,unsigned int *p );
void uart_operate(unsigned int uart_data);
void ClearDisplay();
extern unsigned int num; //2HZ計數單元
extern unsigned int hour; //存放當前的小時
extern unsigned int min; //存放當前的分鐘
extern unsigned int sec; //存放當前的秒
extern unsigned int year; //存放當前的年
extern unsigned int gmonth; //存放當前的公歷的月
extern unsigned int gday; //存放當前的公歷的日
extern unsigned int xqvalue; //存放當前的星期
extern unsigned int nmonth; //存放農歷的月
extern unsigned int nday; //存放農歷的日
extern unsigned int runxq[]; //閏年星期偏差表
extern unsigned int pingxq[]; //平年星期偏差表
extern unsigned int glunarmonthday[]; //農歷月天數表
extern char number[];
extern int DispEnb;
extern unsigned int keyvalue;
extern unsigned int keyflag3;
extern unsigned int keyflag4;
extern unsigned int keyflag6;
extern unsigned int keyflag7;
extern unsigned int clockset[];
extern unsigned int nhour;
extern unsigned int nmin;
extern unsigned int mbsec;
extern unsigned int mmsec;
extern unsigned int mbmin;
extern unsigned int keyflag5;
extern unsigned int mbnum;
extern unsigned int onoff;
extern unsigned int runflag;
extern unsigned int ringflag;
extern unsigned int int2hz;
extern unsigned int counter;
extern unsigned int mapcounter1;
extern unsigned int mapcounter2;
extern unsigned int* BMP_Cartoon[];
extern unsigned int Flash;
extern unsigned int Time[6],mTime[6],Date[6],nDate[6];
unsigned int LED[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//數碼管的段選碼
//===============================================================//
//語法格式:void clock()
//實現功能:時鐘的調整
//參數 :無
//返回值 :無
//==============================================================//
void clock() //時鐘運算函數,入口參數半秒、秒、分、時。
{
if(num==0x0002) //如果半秒到了2,則秒加1
{
num = 0x0000;
sec = sec++;
counter=counter++; //顯示動畫的楨加一
if(counter==40)
counter=0;
}
if(sec==60) //如果秒到了60,則秒清零分加1
{
sec = 0;
min = ++min;
}
if(min==60) //如果分到了60,則分清零,小時加1
{
min = 0;
hour = ++hour;
}
}
//===============================================================//
//語法格式: void gyearmonthday()
//實現功能:公歷日期和農歷日期的調整
//參數 :無
//返回值 :無
//==============================================================//
void gyearmonthday() //公歷運算子函數修改變量年、
{
int monthvalue = 0; //月、日、時、陰歷月,日
int xx = 0;
int nmonthvalue = 0;
if(hour==24)
{
hour = 0;
gday = ++gday;
nday = ++nday;
}
switch(nmonth) //查表確定陰歷月份的天數。
{
case 1:
xx=glunarmonthday[year-2001]&0x8000;
break;
case 2:
xx=glunarmonthday[year-2001]&0x4000;
break;
case 3:
xx=glunarmonthday[year-2001]&0x2000;
break;
case 4:
xx=glunarmonthday[year-2001]&0x1000;
break;
case 5:
xx=glunarmonthday[year-2001]&0x0800;
break;
case 6:
xx=glunarmonthday[year-2001]&0x0400;
break;
case 7:
xx=glunarmonthday[year-2001]&0x0200;
break;
case 8:
xx=glunarmonthday[year-2001]&0x0100;
break;
case 9:
xx=glunarmonthday[year-2001]&0x0080;
break;
case 10:
xx=glunarmonthday[year-2001]&0x0040;
break;
case 11:
xx=glunarmonthday[year-2001]&0x0020;
break;
case 12:
xx=glunarmonthday[year-2001]&0x0010;
break;
}
if(xx==0)
nmonthvalue = 29;
else
nmonthvalue = 30;
if(nday==(nmonthvalue+1))
{
if((nmonth==(glunarmonthday[year-2001] & 0x000f)) && runflag==0)//判斷是否當年閏月
{
runflag = 1;
nday = 1;
}
else
{
nmonth = ++nmonth;
runflag = 0;
nday = 1;
}
}
if(nmonth==13)
{
nmonth = 1;
}
switch(gmonth) //判斷公歷天的個數
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
monthvalue = 31;
break;
case 4:
case 6:
case 9:
case 11:
monthvalue = 30;
break;
case 2:
if((year%4==0&&year%100!=0)||(year%400==0)) // 判斷當年是否是閏年。
monthvalue = 29;
else
{
monthvalue = 28;
}
break;
}
if(gday==monthvalue+1)
{
gday = 1;
gmonth=gmonth++;
}
if(gmonth==13)
{
gmonth = 1;
year = year++; //到了12月,年就加1。
}
if(year==2101) //年的顯示范圍為2001--2100。
{
year = 2001;
}
}
//===============================================================//
//語法格式:gxq()
//實現功能:星期的調整
//參數 :無
//返回值 :無
//==============================================================//
void gxq() // 計算當前星期的子函數,入口參數年、
{ //月、日、星期
if((year%4==0&&year%100!=0)||(year%400==0)) //如果當年是閏年
{
xqvalue = (((year/100)%4)*5+year%100+(year%100)/4+runxq[gmonth-1]+gday+2)%7;
}
else
xqvalue = (((year/100)%4)*5+year%100+(year%100)/4+pingxq[gmonth-1]+gday+2)%7;
}
//===============================================================//
//語法格式: void display()
//實現功能:顯示正常運行界面
//參數 :
//返回值 :無
//==============================================================//
void display()
{
BCD(sec,&Time[4]);
BCD(min,&Time[2]);
BCD(hour,&Time[0]);
uart_operate(Time[0]);
uart_operate(Time[1]); //顯示小時
uart_operate(0x02);
uart_operate(Time[2]);
uart_operate(Time[3]); //顯示分
uart_operate(0x02);
uart_operate(Time[4]);
uart_operate(Time[5]); //顯示秒
}
//===============================================================//
//語法格式: void nextdisplay()
//實現功能:顯示時間日期調整及功能選擇界面
//參數 :無
//返回值 :無
//==============================================================//
void nextdisplay() //顯示時間日期調整子程序
{
BCD(gday,&Date[4]);
BCD(gmonth,&Date[2]);
BCD(year-2000,&Date[0]);
uart_operate(Date[0]);
uart_operate(Date[1]); //顯示年
uart_operate(0x02);
uart_operate(Date[2]);
uart_operate(Date[3]); //顯示月
uart_operate(0x02);
uart_operate(Date[4]);
uart_operate(Date[5]); //顯示日
}
//===============================================================
//===============================================================
void nextdisplay2()
{
BCD(xqvalue,&nDate[4]);
BCD(nday,&nDate[2]);
BCD(nmonth,&nDate[0]);
uart_operate(nDate[0]);
uart_operate(nDate[1]); //顯示農歷月
uart_operate(0x02);
uart_operate(nDate[2]);
uart_operate(nDate[3]); //顯示農歷日
uart_operate(0x02);
uart_operate(nDate[4]);
uart_operate(nDate[5]); //顯示星期
}
//===============================================================//
//語法格式: void displaymodify(keynowvalue)
//實現功能:時間日期調整界面
//參數 :keynowvalue當前閃爍
//返回值 :無
//==============================================================//
void displaymodify(unsigned int keynowvalue)
{
switch(keynowvalue)
{
case 0:
if(Flash) //正常顯示
{
nextdisplay();
Flash=0;
}
else if(DispEnb) //每0.5s秒不顯示
{
uart_operate(0x00);
uart_operate(0x00); //不顯示年
uart_operate(0x02); //-
uart_operate(Date[2]);
uart_operate(Date[3]); //顯示月
uart_operate(0x02); //-
uart_operate(Date[4]);
uart_operate(Date[5]); //顯示日
DispEnb=0;
}
break;
case 2:
if(Flash) //正常顯示
{
nextdisplay();
Flash=0;
}
else if(DispEnb) //每0.5s秒不顯示
{
uart_operate(Date[0]);
uart_operate(Date[1]); //顯示年
uart_operate(0x02);
uart_operate(0x00); //-
uart_operate(0x00); //不顯示月
uart_operate(0x02); //-
uart_operate(Date[4]);
uart_operate(Date[5]); //顯示日
DispEnb=0;
}
break;
case 4:
if(Flash) //正常顯示
{
nextdisplay();
Flash=0;
}
else if(DispEnb) //每0.5s秒不顯示
{
uart_operate(Date[0]);
uart_operate(Date[1]); //顯示年
uart_operate(0x02); //-
uart_operate(Date[2]);
uart_operate(Date[3]); //顯示月
uart_operate(0x02); //-
uart_operate(0x00);
uart_operate(0x00); //不顯示日
DispEnb=0;
}
break;
case 6:
if(Flash) //正常顯示
{
display();
Flash=0;
}
else if(DispEnb) //每0.5s年不顯示
{
uart_operate(0x00);
uart_operate(0x00); //不顯示時
uart_operate(0x02);
uart_operate(Time[2]);
uart_operate(Time[3]); //顯示分
uart_operate(0x02);
uart_operate(Time[4]);
uart_operate(Time[5]); //顯示秒
DispEnb=0;
}
break;
case 8:
if(Flash) //正常顯示
{
display();
Flash=0;
}
else if(DispEnb) //每0.5s年不顯示
{
uart_operate(Time[0]);
uart_operate(Time[1]); //顯示時
uart_operate(0x02);
uart_operate(0x00);
uart_operate(0x00); //不顯示分
uart_operate(0x02);
uart_operate(Time[4]);
uart_operate(Time[5]); //顯示秒
DispEnb=0;
}
break;
case 10:
if(Flash) //正常顯示
{
display();
Flash=0;
}
else if(DispEnb) //每0.5s年不顯示
{
uart_operate(Time[0]);
uart_operate(Time[1]); //顯示時
uart_operate(0x02);
uart_operate(Time[2]);
uart_operate(Time[3]); //顯示分
uart_operate(0x02);
uart_operate(0x00);
uart_operate(0x00); //不顯示秒
DispEnb=0;
}
break;
case 12:
if(Flash) //正常顯示
{
nextdisplay2();
Flash=0;
}
else if(DispEnb) //每0.5s年不顯示
{
uart_operate(0x00);
uart_operate(0x00); //不顯示農歷月
uart_operate(0x02);
uart_operate(nDate[2]);
uart_operate(nDate[3]); //顯示農歷日
uart_operate(0x02);
uart_operate(nDate[4]);
uart_operate(nDate[5]); //顯示星期
DispEnb=0;
}
break;
case 14:
if(Flash) //正常顯示
{
nextdisplay2();
Flash=0;
}
else if(DispEnb) //每0.5s年不顯示
{
uart_operate(nDate[0]);
uart_operate(nDate[1]); //顯示農歷月
uart_operate(0x02);
uart_operate(0x00);
uart_operate(0x00); //不顯示農歷日
uart_operate(0x02);
uart_operate(nDate[4]);
uart_operate(nDate[5]); //顯示星期
DispEnb=0;
}
break;
}
}
//===============================================================//
//語法格式: void setday()
//實現功能:顯示時間日期調整界面
//參數 :無
//返回值 :無
//==============================================================//
void setday()
{
int j = 0;
/*此處 如有需要可加入 日期顯示*/
keyflag3 = 1; //置位鍵按下標志
while(keyflag3==1)
{
keyscan(); //鍵盤掃描
if(keyvalue!=0)
if(j>=0&&j<6) //年、月、日
nextdisplay();
else if(j>=6&&j<12) //十、分、秒
display();
else
nextdisplay2(); //農歷月、日和星期
else
displaymodify(j); //調用時間日期顯示界面
switch(keyvalue)
{
case 0x0001:
if(j==14) //如果光標已經到了最后的一個位置
{ //則退出調整界面
keyflag3 = 0;
}
else //根據按鍵修改光標的位置
j = j+2;
break;
case 0x0002: //如果是KEY2按下,那么光標所對應的值進行加操作
switch(j)
{
case 0:
if(year>=2100)
year = 2001;
else
year = ++year;
break;
case 2:
if(gmonth==12)
gmonth = 1;
else
gmonth = ++gmonth;
break;
case 4:
if(gday==31)
gday = 1;
else
gday = ++gday;
break;
case 6:
if(hour==24)
hour = 0;
else
hour = ++hour;
break;
case 8:
if(min==60)
min = 0;
else
min = ++min;
break;
case 10:
if(sec==60)
sec = 0;
else
sec = ++sec;
break;
case 12:
if(nmonth==12)
nmonth = 1;
else
nmonth = ++nmonth;
break;
case 14:
if(nday==30)
nday = 0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -