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

📄 时分秒设计.c

📁 此程序是用来实现报警时间的
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
//#include <at89x51.h>
sbit P1_7=P1^7;		 //嗡鸣器控制口
sbit P3_5=P3^5;		 //修改(加一)
sbit P3_6=P3^6;		 //移动
sbit P3_7=P3^7;		 //进入(系统时间或报警时间)或退出
sbit RS=P1^0;       //定义引脚
sbit RW=P1^1;
sbit E=P1^2;
int true=1;

#define LCD_Data P0
unsigned  char  seg[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};//0~f
unsigned  char  i,j,p=1,shi=0,shi_1=0,shi_0=0,fen=0,fen_10=0,msecond=0,second=0,second_10=0;

void xiangling(void);
void xianshi3(void);
void guangbiao2(void);
void guangbiao1(void);
void delay(int k);
void writedatalcd(unsigned char wdlcd);
void writecommandlcd(unsigned char wclcd);
unsigned char readdatalcd(void);
unsigned char readstatuslcd(void);
void initlcd(void);
void displayonechar(unsigned char X, unsigned char Y, unsigned char DData);
void displaylistchar(unsigned char X, unsigned char Y, unsigned char code *DData);
void xianshi1(void);
unsigned char code maohao[] ={":"};
unsigned char BaoJing[]={0x42,0x61,0x6f,0x4a,0x69,0x6e,0x67,0x20,0x30,0x30,0x3a,0x30,0x30,0x3a,0x31,0x30};
unsigned char shijian[8]={0,0,58,0,0,58,0,0};

void main(void)
{ 
 delay(100);
 initlcd();
 EA=1;
 ET0=1;
 TMOD=0x01;
 TH0=55536/256;			  //每一次中断(10ms)的初值
 TL0=55536%256;
// while(P3_7!=0);
 xianshi1();
 delay(10);
 xianshi3();
 TR0=1;
while(1)
{ 
  while(1)	          //进入循环判断(有P3.7键按下,则需进行相应的调整处理,否则,只进行报警时间的判断
 { int a=8,b=4;
 while(P3_7!=0)	       //判断系统时间是否与报警时间相等,相等则响铃5秒
 {
   if(shi_1==BaoJing[8]-0x30)
    if(shi_0==BaoJing[9]-0x30)
     if(fen_10==BaoJing[11]-0x30)
	  if(fen==BaoJing[12]-0x30)
	    if(second_10==BaoJing[14]-0x30)
		  if(second==BaoJing[15]-0x30)
			 xiangling();
		  }
 //if(flag==1)xiangling();	//若不需调整,则等待,在这等待期间判断报警时间是否到,若到,则报警
 true=0;	  //注意:若不关掉系统时间的显示,则不能进行光标的定位(因为每次系统时间的显示都会让光标跑到字符串末端)
 delay(1000);
 if(P3_7==0)	//超过一秒,则进入调整报警时间
 {
 guangbiao1();	  //光标定位到要调整的位置
 delay(500);
 while(1)
{ 
 if(P3_5==0)		//每按一次,自加1
   {	
   		
    
   		if(a==8)        //判断第一位是否大于2(24小时制) 
        {  BaoJing[a]++;
		   if(BaoJing[a]>0x32)BaoJing[a]=0x30;
		   xianshi1();
		   writecommandlcd(0x80+a);
		   delay(500);
		 }
	   	else
		 {  if(a==11||a==14)	 //a指向分或秒的十位
	           {  
		         BaoJing[a]++;
                 if(BaoJing[a]>0x35)BaoJing[a]=0x30;
		         xianshi1();
	 	         writecommandlcd(0x80+a);
		         delay(500);
		       }
		    else			  // a指向分或秒的个位
               { BaoJing[a]++;
                 if(BaoJing[a]>=0x3a)BaoJing[a]=0x30;
		         xianshi1();
	 	         writecommandlcd(0x80+a);
		         delay(500);
		        }
		  }
		        
		 
	}
 if(P3_6==0)	  //每按一次,向右移一位
 { 
  writecommandlcd(0x81+a);
  delay(500);
  a++;
  if(a>=16)				 //到行末,则返回到开始处
  {
  a=8;
  writecommandlcd(0x80+a);		   //返回到开始处
  }
}
 if(P3_7==0)break;  	 //报警时间调整完成,按P3_7键退出
} 

} 
 
 else				//不足一秒,则进入调整系统时间
 {	   TR0=0;		//关系统时间
	   shijian[0]=shi_1;
       shijian[1]=shi_0;
       shijian[3]=fen_10;
       shijian[4]=fen;
       shijian[6]=second_10;
       shijian[7]=second;
	   guangbiao2();
       delay(1000);
	   while(1)
	   {
	      if(P3_5==0)
           {
		      if(b==4)      //判断第一位是否大于2(24小时制) 
			   {   shijian[b-4]++;
			       if(shijian[b-4]>2)shijian[b-4]=0;
 				   shi_1=shijian[0];
                   shi_0=shijian[1];
                   fen_10=shijian[3];
                   fen=shijian[4];
                   second_10=shijian[6];
                   second=shijian[7];
			   
			       xianshi3();
			       writecommandlcd(0xc0+b);
		           delay(500);
			   }
			  else
			  {	
			   if(b==7||b==10)		  //b指向分或秒的十位
			       {  	shijian[b-4]++;
			            if(shijian[b-4]>5)shijian[b-4]=0;
 				        shi_1=shijian[0];
                        shi_0=shijian[1];
                        fen_10=shijian[3];
                        fen=shijian[4];
                        second_10=shijian[6];
                        second=shijian[7];
			   
			            xianshi3();
			            writecommandlcd(0xc0+b);
		                delay(500);
					}
			    else				//b指向分或秒的个位
			      { shijian[b-4]++;
			       if(shijian[b-4]>=10)shijian[b-4]=0;
			      
			  	   shi_1=shijian[0];
                   shi_0=shijian[1];
                   fen_10=shijian[3];
                   fen=shijian[4];
                   second_10=shijian[6];
                   second=shijian[7];
			   
			       xianshi3();
			       writecommandlcd(0xc0+b);
		           delay(500);
			      }
		      	}
			 }
		 if	(P3_6==0)
		 {
           writecommandlcd(0xc1+b);
           delay(500);
           b++;
           if(b>=12)
             {
               b=4;
               writecommandlcd(0xc0+b);
              }
		 }
	  if(P3_7==0)break;	  //系统时间调整完成,按P3_7键退出
}
  TR0=1;  //调整好系统时间后,开定时器
}

 while(P3_7!=0);
 true=1;
 writecommandlcd(0x0c);		  //关光标及闪烁
 break;	   // 退出,进入下一次循环判断
 }
 delay(2000);
 }
}

void writedatalcd(unsigned char wdlcd)		   //写数据
{
readstatuslcd();
LCD_Data=wdlcd;
RS=1;
RW=0;
E=0;
E=0;
E=1;
}


void writecommandlcd(unsigned char wclcd)	   //写命令
{
readstatuslcd();
LCD_Data=wclcd;
RS=0;
RW=0;
E=0;
E=0;
E=1;
}

unsigned char readdatalcd(void)		 //读数据
{
RS=1;
RW=1;
E=0;
E=0;
E=1;
return(LCD_Data);
}

unsigned char readstatuslcd(void)	   //读lcd的状态
{
LCD_Data=0xff;
RS=0;
RW=1;
E=0;
E=0;
E=1;
while(LCD_Data&0x80);
return(LCD_Data);
}

void initlcd(void) 			//初始化1602
{
 LCD_Data = 0;
 writecommandlcd(0x38); 
 delay(5);
 writecommandlcd(0x38);
 delay(5);
 writecommandlcd(0x38);
 delay(5);

 writecommandlcd(0x38); 
 writecommandlcd(0x08);
 writecommandlcd(0x01); 
 writecommandlcd(0x06); 
 writecommandlcd(0x0c);
}


void displayonechar(unsigned char X, unsigned char Y, unsigned char DData)	   //显示单个字符
{
 Y &= 0x1;
 X &= 0xF; 
 if (Y) X |= 0x40; 
 X |= 0x80; 
 writecommandlcd(X); 
 writedatalcd(DData);
}

void displaylistchar(unsigned char X, unsigned char Y, unsigned char code *DData)	 //显示字符串
{
 unsigned char listlength;

  listlength = 0;
 Y &= 0x1;
 X &= 0xF; 
 while (DData[listlength]>=0x20) 
  {
   if (X <= 0xf) 
    {
     displayonechar(X, Y, DData[listlength]); 
     listlength++;
     X++;
    }
  }
}



void delay(int n)	 //1毫秒延时
{ int i,j;
 for(i=0;i<n;i++)
  for(j=0;j<110;j++);
}

void timer0(void) interrupt 1		  //中断子程序实现时间的跳变(秒-分-时)
{
TH0=55536/256;
TL0=55536%256;
msecond++;
  if(msecond>=100)
   {msecond=0;
    second++;
	if(second>=10)
	{second=0;
	 second_10++;
	 if(second_10>=6)
	 {
	  second_10=0;
	  fen++;
	  if(fen>=10)
	  {fen=0;
	   fen_10++;
	   if(fen_10>=6)
	   {fen_10=0;
	    shi++;
	     if(shi>=24)
	     {shi=0;
	      shi_1=shi/10;
	      shi_0=shi%10;
		 }
	   }
	  }
	}
  } 
}
 
 if(true==1)xianshi3();

}


void xianshi1(void)				   //显示设置时间
{ 
 for(i=0;i<16;i++)
 displayonechar(i,0,BaoJing[i]);

}

void guangbiao1(void)		//定位设置时间光标
{
	writecommandlcd(0x0f);
	writecommandlcd(0x88);   //光标移动一位
}

void guangbiao2(void)			 //定位系统时间光标
{
	writecommandlcd(0x0f);
	writecommandlcd(0xc4);//光标移动一位
}

void xianshi3(void)				 //显示系统时间
{
 displayonechar(4, 1,  seg[shi_1]);
 displayonechar(5, 1,  seg[shi_0]);
 displaylistchar(6, 1, maohao);
 displayonechar(7, 1,  seg[fen_10]);
 displayonechar(8, 1,  seg[fen]);
 displaylistchar(9, 1, maohao);
 displayonechar(10, 1,  seg[second_10]);
 displayonechar(11, 1,  seg[second]);
}

void xiangling(void)	 //报警5秒
{ 
  P1_7=0;
  delay(5000);
  P1_7=1;
 }



⌨️ 快捷键说明

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