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

📄 dianzi.c

📁 实验学习型电子钟包括红外线控制密码da控制led亮度ad转换语音转换闹铃
💻 C
📖 第 1 页 / 共 2 页
字号:
				DispBuf[4]= 10;
				DispBuf[5]= 10;
				desips7219();
				key10=1;
				Read_flash(0x8008, 6, cunmima);
				do{
					k = scan();
					if(k == 10){goto exit;}
					if(k==12)DispBuf[--i] = 10;
					desips7219();
					if( k >=0 && k<= 9)
					{
  						DispBuf[i++]= k;
						desips7219();	
					}

				}while(i<6);
            
				for( i = 0 ; i < 6 ; i++ )
				{
					if( cunmima[i] != DispBuf[i] )
					{ 
						if( Cnt++ > 2)
						{Cnt=0;	goto exit;}
						goto setcode;
					}
				}
				PassOk = 1;
				break;
		case 11:  //设定时间
				if( PassOk == 0)
					goto exit ;
                    Cnt = 0;
		settime:DispBuf[0]= 10;	
				DispBuf[1]= 10;
				DispBuf[2]= 10;
				DispBuf[3]= 10;
				DispBuf[4]= 10;
				DispBuf[5]= 10;
				i = 0;
				desips7219();
				
				do{
					k = scan();
					if(k == 11){PassOk = 0 ;goto exit;}
					if( k == 12 )
						DispBuf[--i] = 10;
					desips7219();
					if( k >=0 && k<= 9)
					{
  						DispBuf[i++]= k;
						desips7219();	
					}

				}while(i<6);
				if( DispBuf[0]*10 + DispBuf[1] >23 ||
					DispBuf[2]*10 + DispBuf[3] > 59||
					DispBuf[4]*10 + DispBuf[5] > 59 )
				{		   
					if( Cnt++ >2 )
						goto exit;
					else
						goto settime;
				}
				else
				{ 	SetTime(DispBuf[0]*16+DispBuf[1],
						    DispBuf[2]*16+DispBuf[3],	
							DispBuf[4]*16+DispBuf[5]);
					PassOk = 0 ;key10=0;
				}break;
		case 12:
        case 13: //修改密码
				if( PassOk == 0)
					goto exit ;
                    Cnt = 0;
		        DispBuf[0]= 10;	
				DispBuf[1]= 10;
				DispBuf[2]= 10;
				DispBuf[3]= 10;
				DispBuf[4]= 10;
				DispBuf[5]= 10;
				i = 0;
                desips7219();
				do{
					k = scan();
      				if(k == 13){PassOk = 0 ;goto exit;}
					if(k==12)DispBuf[--i] = 10;
					desips7219();
					if( k >=0 && k<= 9)
					{
  						DispBuf[i++]= k;
 						desips7219();	
					}

				}while(i<6);
                for(i = 0;i < 6;i++)
				{
					cunmima[i]=DispBuf[i];
				}
               Write_flash(0x8008, 6, cunmima);
               delay( 5 );
      		   PassOk = 0 ;
               break;
    case 14://设置闹铃
	time:	
			if( PassOk == 0)
					goto exit ;
                    Cnt = 0;
	            DispBuf[0]= 10;	
				DispBuf[1]= 10;
				DispBuf[2]= 10;
				DispBuf[3]= 10;
				DispBuf[4]= 10;
				DispBuf[5]= 10;
				i = 0;
				desips7219();
				do{
					k = scan();
					if(k ==14){PassOk = 0 ;goto exit;}
					if(k==12)DispBuf[--i] = 10;
  					desips7219();
					if( k >=0 && k<= 9)
					{
  						DispBuf[i++]= k;
						desips7219();	
					}

				}while(i<4);keybuttflag=0;
				for(i = 0;i < 4;i++)
				 { 
   					naoling[nex][i]=DispBuf[i];
				 }
				nex++;
   				if(nex==5)
                {
				nex = 0;
		        
				PassOk = 0 ;
				}
			
                else goto time;
                break; 
		case 15:     			   
		default : break;
	}


exit:;
}
/******************************************************
            鬧鈴組
*******************************************************/
void naozhong()//闹钟
{
 uchar nex;
 
 if(keybuttflag ==0) 

 {
  
 for(nex = 0;nex <5;nex++)
  {
   if(  naoling[nex][0]==DispBuf[0]&&
        naoling[nex][1]==DispBuf[1]&&
 		naoling[nex][2]==DispBuf[2]&&
	    naoling[nex][3]==DispBuf[3])
    {    
	  delay(5);
	 if(naoling[nex][0]==DispBuf[0]&&
        naoling[nex][1]==DispBuf[1]&&
 		naoling[nex][2]==DispBuf[2]&&
	    naoling[nex][3]==DispBuf[3])

      {  
         if(k==15){keybuttflag=1;P0= 0xff;}
          else write1420(0X7E);
      }
     } 
      if(  naoling[nex][0]==DispBuf[0]&&
        naoling[nex][1]==DispBuf[1]&&
 		naoling[nex][2]==DispBuf[2]&&
	    naoling[nex][3]+2==DispBuf[3])
      {    
	    delay(5);
	   if(naoling[nex][0]==DispBuf[0]&&
        naoling[nex][1]==DispBuf[1]&&
 		naoling[nex][2]==DispBuf[2]&&
	    naoling[nex][3]+2==DispBuf[3])

         {  
          if(k==15){keybuttflag=~keybuttflag;}
          else write1420(0X7E);
         }
      } 
  }
 }
}
/*******************************************************
                 紅外接收
*******************************************************/
void wai0() interrupt 0////zhong  duan  jin ru jie shou dao de  shu ju 
{
  unsigned char jihao,shu;
  unsigned long a,b,wai,m;
     wai = TH0;
     wai=wai<<8;
     wai = wai|TL0;
     if( jihao==0)
       {
        if(1800< wai && wai <2200)//gao dian ping wei 2 ms;
          {TH0=0; TL0=0;   wai=0;    jihao=1; }
	      else
          {TH0=0; TL0=0;   wai=0;     jihao=0;}
        }
     else
        {        shu++;
		        if(250<wai &&wai<700)
                {m=m&0x7f;  TH0=0;   TL0=0;wai=0;      }

               if(800<wai && wai<1200)

                 {m=m | 0x80;  TH0=0;TL0=0;wai=0;     }
            if(shu==8)
 			{    
			  b= m&0x0f;
              a=m&0xf0;
              a >>=4;								
              if(a == (~b&0x0f))
			
			  {yuanma=(a & 0x0f); shu=0;wai=0;TH0=0;TL0=0;jihao=0;}
              else
              {shu=0;wai=0;TH0=0;TL0=0;jihao=0;}
			}		
           else{  m >>= 1;}
		          		
                    
        }
}
void ISP_IAP_enable(void)   //打开 ISP,IAP 功能 
{
	EA	=	0;	/* 关中断 */
	ISP_CONTR	=	ISP_CONTR & 0x18;       /* 0001,1000 */
	ISP_CONTR	=	ISP_CONTR | WAIT_TIME;  //设置延时
	ISP_CONTR	=	ISP_CONTR | 0x80;       /* 1000,0000 */  //允许IAP/ISP功能
}


void ISP_IAP_disable(void) //关闭 ISP,IAP 功能
{
	ISP_CONTR	=	ISP_CONTR & 0x7f;	/* 0111,1111 */ //禁止IAP/ISP功能
	ISP_TRIG	=	0x00;
	EA			=   1;                	/* 开中断 */
}
/* 写数据进数据Flash存储器(EEPROM), 只在同一个扇区内写,保留同一扇区中不需修改的数据	*/
/* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源		*/
uchar Write_flash(uint begin_addr, uint counter, uchar array[])
{ 	uint	i=0;
	uint	in_sector_begin_addr=0;
	uint	sector_addr	=0;
	uint	byte_addr=0;

	/* 判是否是有效范围,此函数不允许跨扇区操作 */
	if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
		return ERROR;
	in_sector_begin_addr=begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
	/* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用,程序易编写	*/
	if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
		return ERROR;

	/* 将该扇区数据 0 - (USED_BYTE_QTY_IN_ONE_SECTOR-1) 字节数据读入缓冲区保护 */
	sector_addr		=	(begin_addr & 0xfe00); 	/* 1111,1110,0000,0000; 取扇区地址		*/
	byte_addr		=   sector_addr;			/* 扇区地址为扇区首字节地址			 	*/

	ISP_IAP_enable();
	for(i = 0; i < USED_BYTE_QTY_IN_ONE_SECTOR; i++)
	{
		ISP_ADDRH	=	(uchar)(byte_addr >> 8);
		ISP_ADDRL	=	(uchar)(byte_addr & 0x00ff);

		ISP_CMD		=	ISP_CMD	&	0xf8;        /* 1111,1000 *///读FLASH
		ISP_CMD		=	ISP_CMD	|	READ_Command;	/* 0000,0001 */

		ISP_TRIG	=	0x46;
		ISP_TRIG	=	0xb9;
		_nop_();

		protect_buffer[i]	=	ISP_DATA;
		byte_addr++;
	}

	/* 将要写入的数据写入保护缓冲区的相应区域,其余部分保留 */
	for(i = 0; i < counter; i++)
	{
		protect_buffer[in_sector_begin_addr] = array[i];
		in_sector_begin_addr++;
	}

	/* 擦除 要修改/写入 的扇区 */
	ISP_ADDRH	=	(uchar)(sector_addr >> 8);
	ISP_ADDRL	=	0x00;
	ISP_CMD		=	ISP_CMD	&	0xf8;        /* 1111,1000 */
	ISP_CMD		=	ISP_CMD	|	ERASE_Command;	/* 0000,0011 */

	ISP_TRIG	=	0x46;        /* 触发ISP_IAP命令 */
	ISP_TRIG	=	0xb9;        /* 触发ISP_IAP命令 */
	_nop_();

	/* 将保护缓冲区的数据写入 Data Flash, EEPROM */
	byte_addr	=   sector_addr;			/* 扇区地址为扇区首字节地址	*/
	for(i = 0; i< USED_BYTE_QTY_IN_ONE_SECTOR; i++)
	{
		/* 写一个字节 */
		ISP_ADDRH	=	(uchar)(byte_addr >> 8);
		ISP_ADDRL	=	(uchar)(byte_addr & 0x00ff);
		ISP_DATA	=	protect_buffer[i];
		ISP_CMD		=	ISP_CMD	&	0xf8;        /* 1111,1000 */
		ISP_CMD		=	ISP_CMD	|	PROGRAM_Command;		/* 0000,0010 */

		ISP_TRIG	=	0x46;        /* 触发ISP_IAP命令 */
		ISP_TRIG	=	0xb9;        /* 触发ISP_IAP命令 */
		_nop_();

		/* 读回来 */
		ISP_DATA	=	0x00;

		ISP_CMD		=	ISP_CMD	&	0xf8;        /* 1111,1000 */
		ISP_CMD		=	ISP_CMD	|	READ_Command;	/* 0000,0001 */

		ISP_TRIG	=	0x46;        /* 触发ISP_IAP命令 */
		ISP_TRIG	=	0xb9;        /* 触发ISP_IAP命令 */
		_nop_();

		/*  比较对错 */
		if(ISP_DATA != protect_buffer[i])
		{
			ISP_IAP_disable();
			return ERROR;
        }
        byte_addr++;
	}
	ISP_IAP_disable();
	return OK;
}
uchar Read_flash(uint begin_addr, uint counter, uchar array[])  //读FLASH
{
	uint	i=0;
    uint  in_sector_begin_addr=0;

	/* 判是否是有效范围,此函数不允许跨扇区操作 */
	if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
		return	ERROR;
	in_sector_begin_addr=begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
	/* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用*/
	if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )  //不允许跨扇区
		return ERROR;
    
	ISP_IAP_enable();
	for(i = 0; i< counter; i++)
	{
		ISP_ADDRH	=	(uchar)(begin_addr >> 8);
		ISP_ADDRL	=	(uchar)(begin_addr & 0x00ff);  //传地址
		ISP_DATA	=	0x00;

		ISP_CMD		=	ISP_CMD	&	0xf8;	/* 1111,1000 */
		ISP_CMD     =	ISP_CMD	|	READ_Command;	/* 0000,0001 */

		ISP_TRIG	=	0x46;	/* 触发ISP_IAP命令 */
		ISP_TRIG	=	0xb9;	/* 触发ISP_IAP命令 */
		_nop_();

		array[i]=ISP_DATA;   //读数据
		
        begin_addr++;
	}
	ISP_IAP_disable();
	return	OK;
}
void ProcessPlay()
{
  uchar Play_temp;
   if( (DispBuf[0]*16 + DispBuf[1])<0x06 ) //零晨
	    { 
	     temp[1] = 15;
	    } //零晨
   else 
     {
		   if((DispBuf[0]*16 + DispBuf[1])<0x12)  //上午
	          {
	           temp[1]=16;  //上午
			   }
		   else 
		     {
			   if((DispBuf[0]*16 + DispBuf[1])<0x18)  //下午
		        temp[1]=18; //下午
	           else temp[1]=17; //晚上		
			  }
	 }

Play_temp = 2;

	if((DispBuf[0]*16 + DispBuf[1])<0x10)
	 {
	   temp[Play_temp++] = DispBuf[1];
	 }
 	else
      {
	    if((DispBuf[0]*16 + DispBuf[1])==0x10)
		 {
		   temp[Play_temp++] = 10;
		 }    //十

	       else
	         {
			    if((DispBuf[0]*16 + DispBuf[1])<0x20)
			      {
				    temp[Play_temp++] = 10;    //十 
					temp[Play_temp++] = DispBuf[1];    //几点 
				  }
				else
				  {
				    if((DispBuf[0]*16 + DispBuf[1])==0x20)
					 {
					   temp[Play_temp++] = DispBuf[0];    //二
				       temp[Play_temp++] = 10;    //十 					 
					 }
                    else
					{
					   temp[Play_temp++] = DispBuf[0];    //二
                       temp[Play_temp++] = 10;    //十 	
					   temp[Play_temp++] = DispBuf[1];    //几点 
					}	 
										
				   }
				  
			  }
	   }

     temp[Play_temp++] = 11;   //点 
//	 if(flag_baoshi==1){goto exit;}
    if((DispBuf[2]*16 + DispBuf[3])<0x10)
      {
	     temp[Play_temp++] = DispBuf[2];
         temp[Play_temp++] = DispBuf[3];
		 temp[Play_temp++] = 12;    //分	  
	  }
	 else
	  {
	      if(DispBuf[3]==0)
		    {
			    if(DispBuf[2]==1)
			      {
					 temp[Play_temp++] = 10;    //十 
			   		 temp[Play_temp++] = 12;    //分  			
				  }		
			    else
				    {
						   temp[Play_temp++] = DispBuf[2];    //几十
						   temp[Play_temp++] = 10;            //十 
			   			   temp[Play_temp++] = 12;            //分   			
				    }
		    }
		   else
		     {
		        if(DispBuf[2]==1)
	 		      {
				    temp[Play_temp++] = 10;    //
					temp[Play_temp++] = DispBuf[3];
					temp[Play_temp++] = 12;    //分 				  
				  }
				else
					{
						temp[Play_temp++] = DispBuf[2];
						temp[Play_temp++] = 10;
						temp[Play_temp++] = DispBuf[3];    
						temp[Play_temp++] = 12;    //分  
					}
			 
			 }
	  
	  }	  
 //exit:;
 Play_num = Play_temp+1;
 TR1 = 1;

}

⌨️ 快捷键说明

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