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