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

📄 液晶显示1.c

📁 LCD显示的电子时钟
💻 C
字号:
#include<reg51.h>
#include <LCD1602.h>
#include<stdio.h>
#define unchar unsigned char 
#define unint unsigned int 
sbit adjust_button=P0^7;sbit increase_button=P0^6;
sbit decrease_button=P0^5;
unchar i,count,con1=0;
unchar dis0[2],dis1[2],dis2[2],dis3[2],dis4[2],dis5[2];dis6[2];dis7[2];dis8[2];
       dis9[2];
char con=-1;
char dis[12]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
char timedata[8]={0x00,0x00,0x00,0x00,0x00,0x00};
             //秒个位,秒十位,分 ,分  ,时  ,时 

unsigned int year1=1700,mon1=12,day1=10,tmp_days;
unchar year[5],mon[3],day[3],week1[2],tmp,weekday;
void time_initial()
{
 TMOD=0x11;
 TH0=(65536-49980)/256;
 TL0=(65536-49980)%256;
 EA=1;
 ET0=1;
 ET1=1;
 TR0=1;
 TR1=0;
}

void Delay(unint i)
{
 unint j;
 for(;i>0;i--)
 for(j=0;j<125;j++){;}
}

void keyscan()
{
 if(adjust_button==0)
 {
  Delay(10);
  while(adjust_button==0);
  TR0=0;
  con++;
  //实现数字一闪,使使用者知道调的是哪位数字.
  switch(con)
  {
   case 0:LCD_Print(11,0," ");Delay(300);break;
   case 1:LCD_Print(10,0," ");Delay(300);break;
   case 2:LCD_Print(8,0," ");Delay(300);break;
   case 3:LCD_Print(7,0," ");Delay(300);break;
   case 4:LCD_Print(5,0," ");Delay(300);break;
   case 5:LCD_Print(4,0," ");Delay(300);break;
   case 6:LCD_Print(8,1,"  ");Delay(300);break;
   case 7:LCD_Print(5,1,"  ");Delay(300);break;
   case 8:LCD_Print(0,1,"    ");Delay(300);break;
  }
  if(con>=9){con=-1;TR0=1;}
 }
 //数字增加
 if(increase_button==0)
 {
   Delay(10);
   while(increase_button==0);
   timedata[con]++;
   if((con==0|con==2)&timedata[con]>=10){timedata[con]=0;}
   if((con==1|con==3)&timedata[con]>=6){timedata[con]=0;}
   if(con==4&timedata[con]>=4){timedata[con]=0;}
   if(con==5&timedata[con]>=3){timedata[con]=0;}
  //日增加调整
   if(con==6)
   {day1++;
    if(mon1==4||mon1==6||mon1==9||mon1==11){if(day1==31){day1=1;};}
	if(mon1==1||mon1==3||mon1==5||mon1==7||mon1==8||mon1==10||mon1==12)
	 {if(day1==32){day1=1;};}
	if(mon1==2&year1%4==0){if(day1==30){day1=1;};}
	if(mon1==2&year1%4){if(day1==29){day1=1;};}
   }
  //月增加调整
  if(con==7){mon1++;if(mon1==13){mon1=1;};}
  //年增加调整
  if(con==8){year1=year1+1;}//??有问题:不知为什么要减256
   dis[con]=timedata[con];dis[6]=0x0a;
 }
 //数字减少
 if(decrease_button==0)
 {
  Delay(10);
  while(decrease_button==0);
  timedata[con]--;
  if((con==0|con==2)&timedata[con]<0){timedata[con]=9;}
  if((con==1|con==3)&timedata[con]<0){timedata[con]=5;}
  if(con==4&timedata[con]<0){timedata[con]=3;}
  if(con==5&timedata[con]<0){timedata[con]=2;}
  dis[con]=timedata[con];dis[6]=0x0a;
 //日减少调整
  if(con==6)
   {day1--;
    if(mon1==4||mon1==6||mon1==9||mon1==11){if(day1==0){day1=30;};}
	if(mon1==1||mon1==3||mon1==5||mon1==7||mon1==8||mon1==10||mon1==12)
	 {if(day1==0){day1=31;};}
	if(mon1==2&year1%4==0){if(day1==0){day1=29;};}
	if(mon1==2&year1%4){if(day1==0){day1=28;};}
   }
//月减少调整
if(con==7){mon1--;if(mon1==0){mon1=12;};}
 //年减少调整
  if(con==8){year1=year1-1;}
 }
}
//计算出星期几
void week()
{
 if(year1==2000) weekday=5;//2000年1月1日为星期六
//计算出当年的1月1日为星期几
 else{tmp=(year1-1)/4+1;tmp=(year-tmp)+tmp*2;weekday=(tmp+5)%7;}
tmp_days=0;
for(tmp=1;tmp<mon1;tmp++)
if(tmp==1||tmp==3||tmp==5||tmp==7||tmp==8||tmp==10)
tmp_days=tmp_days+31;
else if(tmp==4||tmp==6||tmp==9||tmp==11)
tmp_days=tmp_days+30;
else if(tmp==2)
{if(year1%4==0)tmp_days=tmp_days+29;
 else tmp_days=tmp_days+28;}
 tmp_days=tmp_days+day1-1;
 weekday=(weekday+tmp_days%7)%7+1;
}

void display()
{
 //多加'0'使之转化为字符的形式,液晶显示,数字的形式显示不出
 dis0[0]=dis[0]+'0';dis1[0]=dis[1]+'0';dis2[0]=dis[2]+'0';
 dis3[0]=dis[3]+'0';dis4[0]=dis[4]+'0';dis5[0]=dis[5]+'0';
 week1[0]=weekday+'0';week1[1]='\0';
 LCD_Print(4,1,"/");LCD_Print(7,1,"/");
 LCD_Print(13,0,week1);
 LCD_Print(6,0,":");LCD_Print(9,0,":");
 LCD_Print(4,0,&dis5[0]);LCD_Print(5,0,&dis4[0]);
 LCD_Print(7,0,&dis3[0]);LCD_Print(8,0,&dis2[0]);
 LCD_Print(10,0,&dis1[0]);LCD_Print(11,0,&dis0[0]);

 //年显示
  year[0]=year1/1000+'0';
 year[1]=(year1/100)%10+'0';
 year[2]=(year1/10)%10+'0';
 year[3]=year1%10+'0';
 year[4]='\0';        //一定要加结束符,这一句非常重要.
 LCD_Print(0,1,year);
 //月显示
mon[0]=mon1/10+'0';mon[1]=mon1%10+'0';mon[2]='\0';
//一定要加结束符,这一句非常重要.
LCD_Print(5,1,mon);

//日显示
day[0]=day1/10+'0';day[1]=day1%10+'0';day[2]='\0';
//一定要加结束符,这一句非常重要.
LCD_Print(8,1,day);

}
void main()
{LCD_Initial();
time_initial();
while(1)
 {week();
  display();
  keyscan();
 }
}

void t0() interrupt 1
{
 TR0=0; TH0=(65536-49980)/256;TL0=(65536-49980)%256;
 count++;
 if(count>=20)
 {count=0;timedata[0]++;
   if(timedata[0]==10)
    {timedata[0]=0;timedata[1]++;
	 if(timedata[1]==6)
	  {timedata[1]=0;timedata[2]++;
	   if(timedata[2]==10)
	    {timedata[2]=0;timedata[3]++;
		 if(timedata[3]==6)
		  {timedata[3]=0;timedata[4]++;
		   if(timedata[4]==4)
		    {timedata[4]=0;timedata[5]++;
			 if(timedata[5]>=2)
			  {timedata[5]=0;day1++;}//日递加
			  //判断几月有几多日,是否润年等.
			  switch(day1)
			  {
			   case 29 :if(mon1==2&&year1%4){mon1=3;day1=1;};break;
			   case 30 :if(mon1==2&&year1%4==0&&year1%100){mon1=3;day1=1;};break;
			   case 31 :if(mon1==4||mon1==6||mon1==9||mon1==11)
			            {day1=1;mon1++;};break;
			   case 32 :day1=1;mon1++;break;
			   default:  break;
			  }
			 if(mon1==13){mon1=1;year1++;};//年递加;
			}
		   }
		 }
	   }
	 }
	}
  TR0=1;
  dis[0]=timedata[0];dis[1]=timedata[1];dis[2]=timedata[2];dis[3]=timedata[3];
  dis[4]=timedata[4];dis[5]=timedata[5];
}

⌨️ 快捷键说明

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