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

📄 time.c

📁 lcd1602的四位数据线用法
💻 C
字号:
#include"1602.h"
#include"sd2000.h"

#define uint  unsigned int
#define uchar unsigned char

extern unsigned char   date[7];   //日期数组
                  /*date[0]=year,date[1]=month,date[2]=day,date[3]=week,
                    date[4]=hour,date[5]=minute,date[6]=second*/


//定义时间变量
uchar time_ms,time_s,time_m,time_h,time_w,time_d,time_mo,time_y;
                                                       //毫秒时间、秒、分、时,周,日,月,年等时间变量
bit flag_s,flag_m,flag_h;			  //每秒、每分、每时的标志

uchar flag_sy[11];  //闹钟的声音种类
uchar flag_sw[11];	 //闹钟允许标志	//10组闹钟,第10个用来贪睡功能
uchar alarm[11][2];	//闹钟数组
bit flag_alarm;	  //闹钟标志


bit flag_op;//进入操作界面标志

uchar num_op;  //界面操作数,00为闹钟0,01为闹钟1,08为闹钟8,09为闹钟9,0a为正常时钟
uchar num_fsn;//组时分闹的操作数。00为组,01为时,02为分,03为闹多久,04为闹钟声音种类;


uchar key_temp;	 //按键临时变量

bit flag_flag_s;//秒钟闪动标志

uchar at;


void delay(uint time) //24M晶振 1ms
{
	uint i,j;
	for(i=0;i<time;i++)
	{
	  j=215;
	  while(j--);
	}
}
static void TransmitInterrupt (void)
{
 TI=0;
}

static void ReceiveInterrupt (void)
{
 RI=0;
}

//串口中断处理程序
void com_isr(void) interrupt 4 using 1
{
EA=0;
if (RI) ReceiveInterrupt ();
if (TI) TransmitInterrupt ();
EA=1;
}
//////////////////////////////////////////////////////////
//SD2000每分钟中断//
void SD2000_isr(void) interrupt 3 using 3
{
   flag_m=1;	//标志
}


//定时中断处理程序
void t0_isr(void) interrupt 1 using 2
{
 TH0=0x3C;		 //	
 TL0=0xB8;
 time_ms++;
 if(time_ms==20)  //0.5秒
  { time_ms=0;
    time_s++;
    flag_s=1;
  }//end if(time_ms==20)
}
////////////////////////////////////////////////////////////////
main()
{
  uchar ii;

  TMOD=0x21;      //T0为方式1的16位定器数,T1为方式2的波特率发生器
  TH0=0x3C;		 //	
  TL0=0xB8;		 //24M晶振的25ms定时为0x3CB0   8为修正

  TH1=0xCC;		 //
  TL1=0xCC;		//24M晶振的的1200B

  SCON=0xd0;   //串口方式3
  IE=0x92;	  //开串口T0

  TR0=1;
  TR1=1;

  time_ms=0;
  time_s=0;
  time_m=58;
  time_h=23;


  flag_s=0;
  flag_m=0;
  flag_h=0;
  flag_alarm=0;
  flag_op=0;

  num_op=0;
  num_fsn=0;

  for(ii=0;ii<12;ii++)
  {
   alarm[ii][0]=0;
   flag_sw[ii]=0;
   flag_sy[ii]=0;
  }

  for(ii=0;ii<12;ii++)
  {
   alarm[ii][1]=0;
  }



 inst_lcd();		 //初始化LCD


 
 disp(0,0,time_h);	 //时钟显示
 dispchar(2,0,0x3a); //冒号显示
 disp(3,0,time_m);	 //分钟显示
//////////////////////////////////////////////////////////////////////////////

  I2CWriteStatus();	//写SD2000状态寄存器
  I2CWriteTime();	//写SD2000时间寄存器


	   I2CReadDate();//读入实时数据
	   disp_bcd(6,0,date[0]);//年显示
	   dispchar(8,0,0x2e);	 //间隔号“小点”显示
	   disp_bcd(9,0,date[1]);//月显示
	   dispchar(11,0,0x2e);	  //间隔号“小点”显示
	   disp_bcd(12,0,date[2]);//日显示
	   dispchar(14,0,0x2e);	//间隔号“小点”显示
	   dispchar(15,0,0x30|date[3]);	//星期显示


 
  while(1)
  {
	if(flag_s) //秒钟闪动显示程序
	 {
	   flag_s=0;
	   if(flag_flag_s)
	   	{
	   		dispchar(2,0,0x3a);
			flag_flag_s=0;
		}
	    else
		 {
		 	dispchar(2,0,0x20);
			flag_flag_s=1;
		 }

		if(flag_op)		//进入操作界面后闪动操作的数组
		   {
			 switch(num_fsn)
			 	{
					case 0 : 
						{
							dispchar(0,1,0x20);
							delay(100);
						}break;

					case 1 :
						{
							dispchar(1,1,0x20);
							dispchar(2,1,0x20);
							delay(50);
						}  break;

					case 2:
						{
							dispchar(4,1,0x20);
							dispchar(5,1,0x20);
							delay(50);
						}break;

					case 3:
						{
							dispchar(6,1,0x20);
							delay(100);
						} break;
					case 4: 
						{
							dispchar(7,1,0x20);
							delay(100);
						}

					default:
					break;
				} //end switch(num_fsn)
		   } //end if(flag_op)
	 }//end if(flag_s)  


	if(flag_m)	 //每分钟软件定时中断处理*********************************************************
	 {
	   flag_m=0;
	   if(flag_alarm)//正在闹铃,是否关闹铃
	      { 
		     if(flag_sw[at]==0)	//闹一分钟的,关闹钟
			  {
			    flag_alarm=0;
			  } 
		   } //end if(flag_alarm)
	   //实时时钟更正,判断年、月、日、星期、时、分是否应该更正//
	   I2CReadDate();//读入实时数据
	   if(time_y!= date[0])
	   	{
	   		time_y=date[0];
	   		disp_bcd(6,0,time_y);//年
		}
	   dispchar(8,0,0x2e);

	   if(time_mo!= date[1])
	   	{
	   		time_mo=date[1];
	   		disp_bcd(9,0,time_mo);//月
		}
	   dispchar(11,0,0x2e);

	   if(time_d!= date[2])
	   	{
	   		time_d=date[2];
	   		disp_bcd(12,0,time_d);//日
		}
	   dispchar(14,0,0x2e);
	   if(time_w!= date[3])
	   	{
	   		time_w=date[3];
	   		dispchar(15,0,0x30|time_w);//星期
		}

	   if(time_h!=date[4])
	   	{
			time_h=date[4];
			disp_bcd(0,0,time_h);//时
		}

		time_m=date[5];
		disp_bcd(3,0,time_m);//分
	   //实时时钟更正,判断年、月、日、星期、时、分是否应该更正//////////////////////////////////////////

	   for(at=0;at<11;at++)	   //闹钟检测
	    {
		  if (alarm[at][0]==time_h)//比较时钟
		    {
			  if (alarm[at][1]==time_m)//比较分钟
			  {
				flag_alarm=1; //标志闹钟标志
				break;
			  }
			}
	    }//end for
	 }//end if(flag_m)


	if(flag_op)	 //进入操作界面后的显示程序
	  {
		 dispchar(3,1,0x3a); //显示“:”
		 if(num_op==0x0a)
		   {
			dispchar(0,1,0x54); //显示“T”表示正常时间	T的代码为54
			disp(1,1,time_h);	//显示时钟
			disp(0,0,time_h);	//更新时钟
			disp(4,1,time_m);	//显示分钟
			disp(3,0,time_m);	//更新分钟
			dispchar(6,1,0x20);	  //闹钟长久位不显示
			dispchar(7,1,0x20);	 //闹钟种类位不显示
		   }
		 else
		   {
			dispchar(0,1,0x30|num_op);	 //显示闹钟号(0--9)的代码为30-39
			disp(1,1,alarm[num_op][0]);	 //显示时钟
			disp(0,0,time_h);			 //更新时钟
			disp(4,1,alarm[num_op][1]);	 //显示分钟
			disp(3,0,time_m);			 //更新分钟
			if(flag_sw[num_op])	 //永远闹
		 		{
			  		dispchar(6,1,0x4f);//显示“P”
				}
		 	else					 //只闹一分钟
		 		{
			  		dispchar(6,1,0x5f); //显示“-”
				} 
			dispchar(7,1,0x30|flag_sy[num_op]); //显示闹钟声音种类号


		   }//end else
	   } //end if(flag_op)

	   if(flag_alarm)		//闹钟提示操作
	   	{
		   
		   dispchar(10,1,0xf4);	 //打开闹铃提示显示“”
		   //闹铃响铃操作函数,根据flag_sy[at]来进行
		   
		}
		else
		{
		   dispchar(10,1,0x20);	 //关闭闹铃提示显示“0”
		   //闹铃闭铃操作函数,根据flag_sy[at]来进行
		}
	   


	key_temp=P3;
	key_temp&=0xf0;	//取P3.4到P3.7四位

	switch(key_temp)
	 {
	   case	0x70:	//P3.7按下	//长按3秒进入操作界面
	    {
		   delay(50);	  //延时50ms
		   key_temp=P3&0xf0;  //再次读取键值
		   if(key_temp==0x70)
		    {

			  	delay(1000); //延时1s
			  	key_temp=P3&0xf0;  //再次读取键值
			  	if(key_temp==0x70)
			  		{
						delay(2000); //延时2s
			     		key_temp=P3&0xf0;  //再次读取键值
			     		if(key_temp==0x70)	 //延时3s后还是	--3秒长按即可进入操作界面
			      			{
								if(flag_op)	//进入界面后
								 {
									flag_op=0;		   //退出界面,清除显示
				  					dispchar(0,1,0x20);
				  					dispchar(1,1,0x20);
				  					dispchar(2,1,0x20);
				  					dispchar(3,1,0x20);
				  					dispchar(4,1,0x20);
				  					dispchar(5,1,0x20);
				  					dispchar(6,1,0x20);
									dispchar(7,1,0x20);	 //闹钟种类位不显示
								 }
								
								else	 //末进入界面
								  {
									flag_op=1;	//标志进入界面操作
									num_op=0x0a;
								  }
			      			}//end if(key_temp==0x38)
			  		}//end if(key_temp==0x38)
			}//end if(key_temp==0x38)
	    }break;	//end case	0x38:
 ///////////////////////////////////////////////////////////////////////////////
	   case	0xb0:	//P3.6按下	上翻
	    {
		  if(flag_op)//进入操作界面后的操作
		   {
		     delay(50);	  //延时50ms
		     key_temp=P3&0xf0;  //再次读取键值
			 if(key_temp==0xb0)
			  {
				 switch(num_fsn)//num_fsn;组时分闹的操作数。00为组,01为时,02为分,03为闹;
				 	{
						case 0:		   //操作数加
							{
								num_op++;
								if(num_op==0x0b)
									{
										num_op=0;
									}
							}break;	 //end case 0:

						case 1:		//小时加
							{
								if(num_op==0x0a)//时钟小时加
									{
										time_h++;
										if(time_h==24)
											{
												time_h=0;	
											}
									}
								else		//0-9组闹钟小时加
									{
									   alarm[num_op][0]++;
									   if(alarm[num_op][0]==24)
									   		{
												alarm[num_op][0]=0;
											}
									}
							}break;	//end case 1:

						case 2:		//分加
							{
								if(num_op==0x0a)//时钟小时加
									{
										time_m++;
										if(time_m==60)
											{
												time_m=0;	
											}
									}
								else		//0-9组闹钟小时加
									{
									   alarm[num_op][1]++;
									   if(alarm[num_op][1]==60)
									   		{
												alarm[num_op][1]=0;
											}
									}
							}break;	 //end case 2:

						case 3:	 //闹钟长久选择
							{
							  if(flag_sw[num_op])
							  	{
									flag_sw[num_op]=0;	
								}
							  else
							  	{
									 flag_sw[num_op]=1;
								}
							}break;	//end case 3:


						case 4: //闹钟声音种类选择
							{
							   flag_sy[num_op]++;
							   if(flag_sy[num_op]==10)
							   		{
										 flag_sy[num_op]=0;
									}
							}break;//end case 4:

						 default:
	                 	 break;
					}//end switch(num_fsn)
			  }//end if(key_temp==0x34)
		   }  //end if(flag_op)
		   else
		   	{
			   if(flag_alarm)
			   	{
					flag_alarm=0;
					dispchar(10,1,0x20);	 //关去闹铃提示,显示“ ”	
				}
			}//end else
	    }break;	//end case	0x34:
///////////////////////////////////////////////////////////////////////////////////////////////
		case 0xd0:	//P3.5按下	下翻
	    {
		   if(flag_op)//进入操作界面后的操作
		   {
		     delay(50);	  //延时50ms
		     key_temp=P3&0xf0;  //再次读取键值
			 if(key_temp==0xd0)
			  {
				 switch(num_fsn)//num_fsn;组时分闹的操作数。00为组,01为时,02为分,03为闹;
				 	{
						case 0:		   //操作数减
							{
								num_op--;
								if(num_op==255)
									{
										num_op=0x0a;
									}
							}break;//end case 0:

						case 1:		//小时减
							{
								if(num_op==0x0a)//时钟小时减
									{
										time_h--;
										if(time_h==0)
											{
												time_h=23;	
											}
									}
								else		//0-9组闹钟小时减
									{
									   alarm[num_op][0]--;
									   if(alarm[num_op][0]==255)
									   		{
												alarm[num_op][0]=23;
											}
									}
							}break;	//end case 1:

						case 2:		//分减
							{
								if(num_op==0x0a)//时钟小时减
									{
										time_m--;
										if(time_m==255)
											{
												time_m=59;	
											}
									}
								else		//0-9组闹钟小时减
									{
									   alarm[num_op][1]--;
									   if(alarm[num_op][1]==255)
									   		{
												alarm[num_op][1]=59;
											}
									}
							  }break; //end case 2:

						case 3:	 //闹钟长久选择
							{
							  if(flag_sw[num_op])		//交互设置
							  	{
									flag_sw[num_op]=0;	
								}
							  else
							  	{
									flag_sw[num_op]=1;
								}

							}break;	//end case 3:
						case 4: //闹钟声音种类选择
							{
							   flag_sy[num_op]--;
							   if(flag_sy[num_op]==255)
							   		{
										 flag_sy[num_op]=9;
									}
							}break;//end case 4:


						default:
	                 	break;
					}//end switch(num_fsn)
			  }	//end if(key_temp==0x2C)
		   }//end if(flag_op)

		   else	 //末进入操作界面的操作-关闹钟
		   	{
			   if(flag_alarm)
			   	{
					flag_alarm=0;
					dispchar(10,1,0x20);	 //关去闹铃提示显示“ ”	
				}
			}//end else
	    }break;	 //end 0x2C: 
 /////////////////////////////////////////////////////////////////////////////
		case 0xe0:	//P3.4按下	换组
	    { 
		  if(flag_op)  //进入操作界面后的操作-换组
		   {
		     delay(20);	  //延时20ms
		     key_temp=P3&0xf0;  //再次读取键值
		     if(key_temp==0xe0)
		      {
				num_fsn++;
			    if(num_fsn==5)		  //num_fsn;组时分闹的操作数。00为组,01为时,02为分,03为闹铃长久,04为闹钟声音种类;
			  	  {
				 	num_fsn=0;
				  }
		      }
		    }//end if(flag_op)
		  else	//末进入操作界面的操作-关闹钟,起动贪睡功能
		  	{
			  if(flag_alarm)  //在有闹钟出现的情况下
			   {
			   		flag_alarm=0;
			   		dispchar(10,1,0x20);	 //关去闹铃提示显示“ ”
			   		if((alarm[at][1]+5)>60)						  //给贪睡闹钟置值
			   			{
							alarm[10][0]=alarm[at][0];
							alarm[10][1]=(alarm[at][1]+5)-60;	
			   			}
					else
						{
							alarm[10][0]=alarm[at][0];
							alarm[10][1]=alarm[at][1]+5;
						}
					flag_sy[10]=flag_sy[at];  //声音种类置值
				} //end if(flag_alarm)
		  	}//end else
	    }break;	//end case 0x1C: 

		default:
		break;
	 } //end switch(key_temp)
  
  }//end while(1)
} //end main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -