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

📄 2.c

📁 电子闹钟
💻 C
字号:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

uchar LED[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
uint i,k,ss,ff,mm;
uint rs,rf,rm;
uchar aa,bb[]={0,0,10,0,0,10,0,0},cc,flag;
uchar dismask[]={0,0,0xff,0xff,0,0,0,0};
bit keyrelease;//键释放
unsigned char status;
bit ringoff;
sbit beep=P3^3;
void keyprocess(unsigned char);
void delay_10ms(void);
void delay(void);

time0() interrupt 1 using 2//定时器0中断函数
{ unsigned char temp;
  P2=0xff;//关闭P0口即关闭显示
  TF0=0;//定时器0中断溢出标志清0
  TH0=(65536-1000)/256;//定时器0设置初始值1ms中断初始值
  TL0=(65536-1000)%256;//
  cc=bb[i];//
  temp=LED[cc]|dismask[i];
  P0=temp;
  P2=aa;//显示段码
  i++;//显示位计数
  if(i==8)//如果显示了8个位码初始
     {aa=0xfe;//位码初始值11111110其中0为显示 1为不显示
      i=0;//初始变量i
     }
  else
      aa=(aa<<1)|0x01;//不是8位码左移一位
  if(status==0)//正常计时
       k++;
  if(k>=1000)
       {  //   毫秒计数
        k=0;
		mm++;
        if(mm>= 60)
		     {   //   秒计数
               mm=0; ff++;
               if(ff>= 60)
			       { //   分计数
                    ff=0; ss++;
                    if(ss>= 24)
					    {  //   时计数
                         ss=0;
                        }
				   }
			 }


       }
  if (status==4||status==5)
	{bb[0]=rs/10;
	bb[1]=rs%10;
  	bb[3]=rf/10; //  显示分的十位
  	bb[4]=rf%10; //  显示分的个位
	}
 else
  {bb[0]=ss/10;  //  显示时的十位
  bb[1]=ss%10; //  显示时的个位
  bb[3]=ff/10; //  显示分的十位
  bb[4]=ff%10; //  显示分的个位
  bb[6]=mm/10; //  显示秒的十位
  bb[7]=mm%10; //  显示秒的个位
	}


 }

 main()//主函数
 { unsigned char keyinput;
   unsigned char keyvalue;
   unsigned char temp;
   unsigned char flashtime;
   flashtime=0;
   i=0;//初值
   k=0;//
   keyrelease=1;
ringoff=1;
   delay_10ms();
   flag=0x00;//
   aa=0xfe;//位码初值
   TMOD=0x01;//方式寄存器初值
   TH0=(65536-1000)/256;// 定时器0设置初始值1ms中断初始值
   TL0=(65536-1000)%256;//
   TR0=1;//起动定时器0
   IE=0x82;//开定时器0中断
   status=0;
   keyvalue=0xff;
   while(1)//死巡环
  {keyinput=P3&0xf0;
   if(keyinput!=0xf0)   //键扫描程序,全扫描,逐行扫描。键按下,keyvalue存键值。
      {delay_10ms();
	   keyinput=P3&0xf0;
	   if(keyinput!=0xf0)
	       { if(keyrelease==1)
		         {keyrelease=0;
				  keyvalue=keyinput;
				 }
		   }
       else		//键释放
	       {keyrelease=1;
		    keyprocess(keyvalue);
			keyvalue=0xff;
			}

	  }
   else			//无键按下
      {keyrelease=1;
	   keyprocess(keyvalue);
	   keyvalue=0xff;
	   delay_10ms();
	  }

   if(status==0)//正常计时,无闪烁
      {for(temp=0;temp<8;temp++)
	      dismask[temp]=0x00;
	  }

   if(status==1)//时调整
      {if(flashtime>30)
	      {dismask[0]=0xff;
		dismask[1]=0xff;
		  }
	   else
	      {dismask[0]=0x00;
		   dismask[1]=0x00;
		  }
	  }
   if(status==2)//分调整
      {if(flashtime>30)
	      {dismask[3]=0xff;
		   dismask[4]=0xff;
		  }
	   else
	      {dismask[3]=0x00;
		   dismask[4]=0x00;
		  }
	  }
   if (status==3)//秒调整
      {if(flashtime>30)
	      {dismask[6]=0xff;
		   dismask[7]=0xff;
		  }
	   else
	      {dismask[6]=0x00;
		   dismask[7]=0x00;
		  }
	  }
   if (status==4)//闹铃时调整
      {dismask[6]=0xff;
	dismask[7]=0xff;
	if(flashtime>30)
	      {dismask[0]=0xff;
		   dismask[1]=0xff;
		  }
	   else
	      {dismask[0]=0x00;
		   dismask[1]=0x00;
		  }
		  }
   if (status==5)//闹铃分调整
      {dismask[6]=0xff;
	dismask[7]=0xff;
	if(flashtime>30)
	      {dismask[3]=0xff;
		   dismask[4]=0xff;
		  }
	   else
	      {dismask[3]=0x00;
		   dismask[4]=0x00;
		  }
		  }
   if(flashtime>60)
      flashtime=0;
   else
      flashtime++;

	if(ringoff==0&&ss==rs&&ff==rf)
		{beep=0;
		delay();
		beep=1;}

  }
 }

void keyprocess(unsigned char key)	//键值处理,6种状态,正常计时,设置时分秒,设置闹铃时分
{switch (key)
   {case 0xe0:status++; 	 //设置键
              if(status>5)
			      status=0;
			  if(status==2)
			  	{dismask[0]=0x00;
				dismask[1]=0x00;}
			  if(status==3)
			   {dismask[3]=0x00;
			   dismask[4]=0x00;}
			   if(status==5)
			   {dismask[0]=0x00;
			   dismask[1]=0x00;}
               break;
    case 0xd0:switch(status)	//加1键
	              {case 0x01:if(ss<23)
				                  ss++;
							  else
							      ss=0;
							  break;
				   case 0x02:if(ff<59)
				                  ff++;
							  else
							      ff=0;
							  break;
				   case 0x03:if(mm<59)
				                  mm++;
							  else
							      mm=0;
							  break;
				case 0x04:if(rs<23)
						rs++;
					else
						rs=0;
						break;
				case 0x05:if(rf<59)
						rf++;
					else
						rf=0;
						break;
				  }
	          break;
	case 0xb0:switch(status)   //减1键
	              {case 0x01:if(ss>0)
				                  ss--;
							  else
							      ss=23;
							  break;
				   case 0x02:if(ff>0)
				                  ff--;
							  else
							      ff=59;
							  break;
				   case 0x03:if(mm>0)
				                  mm--;
							  else
							      mm=59;
							  break;
				case 0x04:if(rs>0)
						rs--;
					else
						rs=23;
						break;
				case 0x05:if(rf>0)
						rf--;
					else
						rf=59;
						break;
				  }
	          break;
	case 0x70:
		ringoff=~ringoff;
	          break;
	default:break;
   }
}

void delay_10ms()
{unsigned char delay1,delay2;
 for(delay1=0;delay1<30;delay1++)
   for(delay2=0;delay2<120;delay2++);
}void delay()
{unsigned char delay1,delay2;
 for(delay1=0;delay1<255;delay1++)
   for(delay2=0;delay2<255;delay2++);
}

⌨️ 快捷键说明

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