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

📄 yejin.c

📁 用51内部定时器在Keil uVision3环境下开发的
💻 C
字号:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P3^5;
sbit lcden=P3^4;
sbit rd=P3^7;     //把rd口置0,扫描P3^0,1,2,3,同独立键盘功能
sbit s1=P3^0;  //功能键
sbit s2=P3^1;     //调日期,时间增加
sbit s3=P3^2;     //调日期,时间减少
uchar code table[]="   2000-01-01";    //初始化液晶显示
uchar code table1[]="    00:00:00";
uchar count,s1num;
char second,minute,hour,day,month,year;
//uchar code dis_week[]={"Sun,Mon,Tue,Wed,Thu,Fri,Sat"};
//uchar code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5};	//星期月参变数

//------------延时---------------------
void delay(uint z)
{
   uint x,y;
   for(x=z;x>0;x--)
      for(y=110;y>0;y--);
}

//----------写命令--------------------
void write_com(uchar com)
{
   rs=0;
   lcden=0;
   P0=com;
   delay(5);
   lcden=1;
   delay(5);
   lcden=0;
}

//----------写数据--------------------
void write_date(uchar date)
{
   rs=1;
   lcden=0;
   P0=date;
   delay(5);
   lcden=1;
   delay(5);
   lcden=0;
}

//-------------初始化----------------
void init()
{  
   uchar num;
   lcden=0;
   write_com(0x38);
   write_com(0x0c);
   write_com(0x06);
   write_com(0x01);

   write_com(0x80);
   for(num=0;num<13;num++)   //让液晶显示日期
   {
      write_date(table[num]);
	  delay(5);
   }

   write_com(0x80+0x40);
   for(num=0;num<12;num++)   //让液晶显示时间
   {
      write_date(table1[num]);
	  delay(5);
   }
   TMOD=0x01;                //定时器中断初始化
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   EA=1;
   ET0=1;
   TR0=1;
}

//-------写年月日---------------
void write_lyr(uchar add,uchar date)
{
   uchar shi,ge;
   shi=date/10;
   ge=date%10;
   write_com(0x80+add);
   write_date(0x30+shi);
   write_date(0x30+ge);
}

//--------写时分秒----------------------
void write_sfm(uchar add,uchar date)
{
   uchar shi,ge;
   shi=date/10;
   ge=date%10;
   write_com(0x80+0x40+add);
   write_date(0x30+shi);
   write_date(0x30+ge);
}

//---------该年是否是闰年--------------------------
bit leap_year()
{
   int leap;
   if((year%4==0&&year%100!=0)||year%400==0)
      leap=1;
   else
      leap=0;
   return leap;
}

//星期的自动运算和处理
/*uchar week_proc()
{	uchar num_leap;	
	uchar b;
	num_leap=year/4-year/100+year/400;//自00年起到year所经历的闰年次数
	if( leap_year()&& month<=2 )	  //既是闰年且是1月和2月	
		b=5;
	else 
		b=6;
	week=(year+para_month[month]+day+num_leap+b)%7;//计算对应的星期
	return week;
}*/

//-------写星期-----------------------------
/*void write_week(week)
{
   switch(week)
   {
      case 1:write_com(0x80+12);write_date(dis_week[0]);break;
	  case 2:write_com(0x80+12);write_date(dis_week[1]);break;
	  case 3:write_com(0x80+12);write_date(dis_week[2]);break;
	  case 4:write_com(0x80+12);write_date(dis_week[3]);break;
	  case 5:write_com(0x80+12);write_date(dis_week[4]);break;
	  case 6:write_com(0x80+12);write_date(dis_week[5]);break;
	  case 7:write_com(0x80+12);write_date(dis_week[6]);break;
	  default:write_com(0x80+12);write_date();break;
   }
}*/

//----------键盘扫描-------------------- 
void keyscan()
{
  rd=0;     //把rd口置0,准备扫描
  if(s1==0)     //第一个键是否按下
  {
     delay(5);
	 if(s1==0)
	 {
	    while(!s1);
		s1num++;
		if(s1num==1)    //第一个键被按一次
		{  
		   TR0=0;
		   write_com(0x80+0x40+10);
		   write_com(0x0f);
		}
		if(s1num==2)    
		{
		   write_com(0x80+0x40+7);
		}
        if(s1num==3)   
		{
		   write_com(0x80+0x40+4);
		}
        if(s1num==4)   
		{
		   write_com(0x80+11);
		}
		if(s1num==5)    
		{
		   write_com(0x80+8);
		}
		if(s1num==6)    
		{
		   write_com(0x80+5);
		}
		/*if(s1num==7)    
		{
		   write_com(0x80+12);
		}*/
		if(s1num==7)   
		{
           s1num=0;
		   write_com(0x0c);
		   TR0=1;
		}
     }
  }
     if(s1num!=0)      //如果功能键被按下
	 {
	    if(s2==0)      //第二个按下
		{
		   delay(5);
		   if(s2==0)
		   {
		      while(!s2);
			  if(s1num==1)      //第二个键被按一次,秒钟加一
			  {
			     second++;
				 if(second==60)
				    second=0;
				 write_sfm(10,second);
				 write_com(0x80+0x40+10);
			  }
              if(s1num==2)    //第二个键被按二次,分钟加一
			  {
			     minute++;
				 if(minute==60)
				    minute=0;
				 write_sfm(7,minute);
				 write_com(0x80+0x40+7);
			  }
			  if(s1num==3)     //第二个键被按三次,时钟加一
			  {
			     hour++;
				 if(hour==24)
				    hour=0;
				 write_sfm(4,hour);
				 write_com(0x80+0x40+4);
			  }
			  if(s1num==4)     
			  {
			     day++;
				 if(day==30)
				    day=0;
				 write_lyr(11,day);
				 write_com(0x80+11);
			  }
			  if(s1num==5)     
			  {
			     month++;
				 if(month==12)
				    month=0;
				 write_lyr(8,month);
				 write_com(0x80+8);
			  }
			  if(s1num==6)    
			  {
			     year++;
				 if(year==99)
				    year=0;
				 write_lyr(5,year);
				 write_com(0x80+5);
			  }
             /*if(s1num==7)    
			  {
			     week_proc(); 
				 write_com(0x80+12);
			  }*/
		   }
		}
		if(s3==0)       //第三个键被按下	
		{
		   delay(5);
		   if(s3==0)
		   {
			   while(!s3);
			   if(s1num==1)
			   {
			      second--;
				  if(second==-1)
				    second=59;
				  write_sfm(10,second);
				  write_com(0x80+0x40+10);
			   }
			   if(s1num==2)
			   {
				  minute--;
				  if(minute==-1)
				     minute=59;
				  write_sfm(7,minute);
				  write_com(0x80+0x40+7);
			   }
			   if(s1num==3)
			   {
			      hour--;
			      if(hour==-1)
				     hour=23;
				  write_sfm(4,hour);
				  write_com(0x80+0x40+4);
			   }
			   if(s1num==4)
			   {
			      day--;
			      if(day==-1)
				     day=31;
				  write_lyr(11,day);
				  write_com(0x80+11);
			   }
			   if(s1num==5)
			   {
			      month--;
			      if(month==-1)
				     month=12;
				  write_lyr(8,month);
				  write_com(0x80+8);
			   }
			   if(s1num==6)
			   {
			      year--;
			      if(year==-1)
				     year=99;
				  write_lyr(5,year);
				  write_com(0x80+5);
			   }
			   /*if(s1num==7)    
			  {
			     week_proc(); 
				 write_com(0x80+12);
			  }*/
		    }
			  
		}
	 }
}


//---------主程序----------------------
void main()
{
   init();
   while(1)
   {
      keyscan();
   }
}

//---------定时器中断---------------------   
void timer0() interrupt 1
{
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   count++;
   if(count==18)
   {
      count=0;
	  second++;
      if(second==60)
	  {
	      second=0;
		  minute++;
		  if(minute==60)
		  {
		     minute=0;
			 hour++;
			 if(hour==24)
			 {
			    hour=0;
				day++;
				{
				   if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)  //大月三十一天
				   if(day==32)
				   {
				      day=1;
					  month++;
				   }
				if(month==4||month==6||month==9||month==11)   //小月三十天
				   if(day==31)
				   {
				      day=1;
					  month++;
				   }
				if(month==2)
				{
				   if(leap_year())
				   {
				      if(day==30)     //闰年二月29天
					  {
					     day=1;
						 month++;
					  }
				   }
				   else
				   {
				      if(day==29)    //非闰年二月28天
					  {
					     day=1;
						 month++;
					  }
				   }
				}
			       //week_proc();
				   if(month==13)
				   {
				      month=1;
					  year++;
					  if(year==99)
					  {
					     year==0;
					  }
					  write_lyr(5,year);
				   }
				   write_lyr(8,month);
				}
                write_lyr(11,day);
			 }
             write_sfm(4,hour);
		  }
		  write_sfm(7,minute);
	  }
	  write_sfm(10,second);
   }
}


⌨️ 快捷键说明

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