⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 system.c

📁 51单片机时钟 和18B20 温度的 LED显示
💻 C
📖 第 1 页 / 共 2 页
字号:
//=========================================================================================//
//文件名称: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 + -