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

📄 hello.c.huzm.c

📁 uart,mcu,linux,embedded soc
💻 C
📖 第 1 页 / 共 3 页
字号:
                     break;		/*跳出此循环*/
          case 0x0e:			/*是否按“C”,已侦测过*/	
               	read24c02();	/*呼叫读取密码存放在DATE1[]副程式*/
                     break;		/*跳出此循环*/                    
          case 0x0f: 
          		open();			/*是否按“D”,是则呼比较密码开门副程式*/
				dispbuf[0]=0x03;	/*小数点位*/
				goto openend;
                     break;		/*跳出此循环*/
          default:   
          		xch();			/*以上均不是则为数字键呼叫XCH作右键滚入*/
                     break;		/*跳出此循环*/
             }					/*跳出SWITCH*/
        delay(100);				/*按钮抗机械反弹跳*/
        while(m==P0);			/*按钮放开否?*/
        send_to_Led_a();				/*串行发送到DTLED-6副程式*/
openend:	nop;
   }				
}		/*返回上一层程式*/
/****************************************************/
void temp_setclock(void)		/*判断有按键输入否?*/
{
switch(dispbuf[0])			/*是则测试ptr键盘扫描计数器指标至TAB[]取到的键盘码*/
 {
  case 0x01: 
			wxb1();		/*0~9计数*/	
	       break;		/*跳出此循环*/
  case 0x03: 
			wxb1();		/*0~9计数*/	
	       break;		/*跳出此循环*/
  case 0x05: 
			wxb2();		/*0~2,0~4计数*/	
	       break;		/*跳出此循环*/
  default:  			/*以上均不是*/
	       break;		/*跳出此循环*/
 }		
   delay(100);				/*按钮抗机械反弹跳*/
   while(m==P0);			/*按钮放开否?*/
   send_to_Led_a();				/*串行发送到DTLED-6副程式*/
}		/*返回上一层程式*/
/****************************************************/
void wxb1(void)
{
   switch(tab[ptr])			/*是则测试ptr键盘扫描计数器指标至TAB[]取到的键盘码*/
        {
          case 0x02: 
          		dispbuf[dispbuf[0]]++;	/*是按“上”,是则呼叫设定密码SET*/
          		if(dispbuf[dispbuf[0]]>9)
          			{dispbuf[dispbuf[0]+1]++;	
          			 dispbuf[dispbuf[0]]=0;
          			}  
          		if(dispbuf[dispbuf[0]+1]==6)
          			{dispbuf[dispbuf[0]+1]=dispbuf[dispbuf[0]]=0;
          			}  
                     break;		/*跳出此循环*/
          case 0x08: 
          		if(dispbuf[dispbuf[0]]==0)	/*是按“下”,是则呼叫清除显示器CLEAR*/
          			{if(dispbuf[dispbuf[0]+1]==0)  
          			    dispbuf[dispbuf[0]+1]=6;
          			    dispbuf[dispbuf[0]]=10; 
          			    dispbuf[dispbuf[0]+1]--;
          			}	
          		dispbuf[dispbuf[0]]--;		
                     break;		/*跳出此循环*/
          case 0x04:			/*是按“左”,未规划键待用户自己定义*/
          		dispbuf[0]=dispbuf[0]+2;	/*小数点左移一位*/
				if(dispbuf[0]>6)
					dispbuf[0]=1;
      	    	     break;		/*跳出此循环*/
          case 0x06:			/*是按“右”,未规划键待用户自己定义*/	
				if(dispbuf[0]<3)
					dispbuf[0]=7;
          		dispbuf[0]=dispbuf[0]-2;	/*小数点右移一位*/
                     break;		/*跳出此循环*/
          case 0x0a:			/*是按“*”,已侦测过*/	
               		FLAG5=1;
               	     break;		/*跳出此循环*/ 
          case 0x0c:			/*是否按“A”,未规划键待用户自己定义*/
          		FLAG4=FLAG5=P3_6=1;	
				dispbuf[0]=0x03;		/*小数点位*/
      	    	     break;		/*跳出此循环*/
          default:  			/*以上均不是*/
                     break;		/*跳出此循环*/
        }			
}		/*返回上一层程式*/
/****************************************************/
void wxb2(void)
{switch(tab[ptr])			/*是则测试ptr键盘扫描计数器指标至TAB[]取到的键盘码*/
        {case 0x02: 
          		dispbuf[dispbuf[0]]++;	/*是按“上”,是则呼叫设定密码SET*/
          		if(dispbuf[dispbuf[0]+1]==2)
          			{if(dispbuf[dispbuf[0]]>4)
          				{dispbuf[dispbuf[0]+1]=dispbuf[dispbuf[0]]=0;}  
					}
          		else
          			{if(dispbuf[dispbuf[0]]>9)
        	  			{dispbuf[dispbuf[0]+1]++;	dispbuf[dispbuf[0]]=0;}  
          			if(dispbuf[dispbuf[0]+1]>2)
          				{dispbuf[dispbuf[0]+1]=dispbuf[dispbuf[0]]=0;}  
					}
                     break;		/*跳出此循环*/
          case 0x08: 
          		if(dispbuf[dispbuf[0]]==0)	/*是按“下”,是则呼叫清除显示器CLEAR*/
          			{if(dispbuf[dispbuf[0]+1]==0) 
          				{dispbuf[dispbuf[0]+1]=2;
          				 dispbuf[dispbuf[0]]=5; 
          			    }	
          			else 
          			    {dispbuf[dispbuf[0]]=10; dispbuf[dispbuf[0]+1]--;
          			    } 	
          			}
          			dispbuf[dispbuf[0]]--;		
                     break;		/*跳出此循环*/
          case 0x04:			/*是按“左”,未规划键待用户自己定义*/
          		dispbuf[0]=dispbuf[0]+2;	/*小数点左移一位*/
				if(dispbuf[0]>6)
					dispbuf[0]=1;
      	    	     break;		/*跳出此循环*/
          case 0x06:			/*是按“右”,未规划键待用户自己定义*/	
				if(dispbuf[0]<3)
					dispbuf[0]=7;
          		dispbuf[0]=dispbuf[0]-2;	/*小数点右移一位*/
                     break;		/*跳出此循环*/
          case 0x0a:			/*是按“*”,已侦测过*/	
               		FLAG5=1;
               	     break;		/*跳出此循环*/                    
          case 0x0c:			/*是否按“A”,未规划键待用户自己定义*/
          		FLAG4=FLAG5=P3_6=1;	
				dispbuf[0]=0x03;		/*小数点位*/
      	    	     break;		/*跳出此循环*/
          default:  			/*以上均不是*/
                     break;		/*跳出此循环*/
        }			
}		/*返回上一层程式*/
/****************************************************/
void save_clocks(void)				/*按显示时间更改时钟*/
{clocktmp[0]=dispbuf[1]|(dispbuf[2]<<4);
 clocktmp[1]=dispbuf[3]|(dispbuf[4]<<4);
 clocktmp[2]=dispbuf[5]|(dispbuf[6]<<4);
 Wr1302();
 FLAG2=1;				
 nop;
}
/****************************************************/
void xch(void)					/*显示向右移动副程式*/
{char c;					/*宣告变数*/
     for(c=6;c>0;c--)
     {dispbuf[c]=dispbuf[c-1];/*将显示器dispbuf[]移位交换,dispbuf[3]->dispbuf[4]->dispbuf[5]...*/
     }
     dispbuf[0]=0;				/*有安键时,小数点不亮*/
     dispbuf[1]=tab[ptr];		/*新的按键值存入dispbuf[1],最低位*/
}		/*返回上一层程式*/
/****************************************************/
void open(void)					/*开门比较密码副程式*/
{char c;						/*宣告变数*/
   FLAG1=1;						/*设开门标号为1*/
for(c=1;c<6;c++)				/*比较六个密码*/
 {if(dispbuf[c]!=bufdata[c])	/*显示值(按键值disbuf[])与密码TAB[]比较是否相等*/
       	FLAG1=0;
        if(FLAG1==0)			/*FLAG1=0 表示不相等*/
               break;			/*跳出此循环*/
 }
 if(FLAG1==1)				/*如FLAG1=1 表示密码相等,令电锁P2.0置0动作*/
  {							/*密码正确*/
    dispbuf[8]=0x09;				/*蜂鸣器设定开/二次分频*/
	dispbuf[0]=0x01;			/*小数点到最高位位*/
   	P3_6=0;						/*P3.6置0,使绿色下载指示灯亮(喇叭响)*/	
	TMOD=0x11;
 	TR1=1;						/**/
    IE=0x8a;					/*8是允许中断,a是TIMER0,TIMER1中断致能位*/
   	send_to_Led_a();		/*串行发送到DTLED-6副程式*/	
	while(FLAG5==0)				/*等待设置死循环*/
		{
		 scan();    	 		/*呼叫键盘扫描副程式有按FLAG0会为1*/
	   	 if(FLAG0==1) 
		  {
		   temp_setclock();		/*判断有按键输入否?*/
		  }
		}
	if(FLAG4==0)
    save_clocks();				/*按显示时间更改时钟*/
  }	
    else P3_6=1;				/*密码错,P3.6置1,关闭绿色下载指示灯灭(喇叭不响)*/	
}		/*返回上一层程式*/
/******************************************************/
void clear(void)				/*清除显示器dispbuf[]为00副程式*/
{char c;					/*宣告变数*/
     for(c=1;c<7;c++)			/*将00存入显示阵列dispbuf[]*/
     {dispbuf[c]=0x00;
     }					
}		/*返回上一层程式*/
/******************************************************/
void Wr1302(void)					/*写时钟芯片DS1302*/
{char i,j,ts0,conb,conbyt;
	conb=0x80;
	ts0=conb;
//
for(j=0;j<3;j++)			/*写秒,分,时三次循环*/
	{clk=RST=0;					/*DS1302系统初始化*/
		nop;nop;
		RST=1;
	for(i=0;i<8;i++)			/*写控制字到DS1302*/
	  {clk=0;					/*清时钟*/
		if(conb&0x01) 
				DINOUT=1;
		else    DINOUT=0;
 		clk=1;					/*时钟上升沿,发送数据有效*/
		conb=conb>>1;	
		nop;
	  }
	 	clk=0;					/*清时钟*/
		conb=ts0+2+j*2;
	conbyt=clocktmp[j]&0x7f;
	for(i=0;i<8;i++)			/*写设定值到DS1302*/
	  {clk=0;					/*清时钟*/
	   if(conbyt&0x01) 
				DINOUT=1;
		else    DINOUT=0;
 		clk=1;					/*时钟上升沿,发送数据有效*/
		conbyt=conbyt>>1;	
		nop;
	  }
	delay(5);
	RST=0;
nop;
}
	}
		/*返回主程式*/
/******************************************************/
void Rd1302st()				/*启动时钟芯片振荡器*/
{
char i,ts0,conb,conbyt;
	Rd1302();
	conbyt=clocktmp[0]&0x7f;
	conb=0x80;
	ts0=conb;
	clk=RST=0;					/*DS1302系统初始化*/
	nop;nop;
	RST=1;
	for(i=0;i<8;i++)			/*写控制字到DS1302*/
	  {	clk=0;					/*清时钟*/
		if(conb&0x01) 
				DINOUT=1;
		else    DINOUT=0;
 		clk=1;					/*时钟上升沿,发送数据有效*/
		conb=conb>>1;	
		nop;
	  }
	 	clk=0;					/*清时钟*/
	for(i=0;i<8;i++)			/*写控制字到DS1302*/
	  {	clk=0;					/*清时钟*/
		if(conbyt&0x01) 
				DINOUT=1;
		else    DINOUT=0;
 		clk=1;					/*时钟上升沿,发送数据有效*/
		conbyt=conbyt>>1;	
		nop;
	  }
	delay(5);
	RST=0;
nop;
}		/*返回主程式*/
/******************************************************/
void Rd1302()				/*读时钟芯片DS1302*/
{
	char i,j,ts0,conb;
	conb=0x81;
	clocktmp[0]=0;
	clocktmp[1]=0;
	clocktmp[2]=0;
	ts0=conb;
	for(j=0;j<3;j++)
	{
	   clk=RST=0;					/*DS1302系统初始化*/
		nop;nop;
		RST=1;
		for(i=0;i<8;i++)			/*写控制字到DS1302*/
		  {
	 	 	clk=0;					/*清时钟*/
			if(conb&0x01) 
					DINOUT=1;
			else    DINOUT=0;
	 		clk=1;					/*时钟上升沿,发送数据有效*/
			conb=conb>>1;	
			nop;
		  }
		conb=ts0=ts0+2;
		clk=0;
		for(i=0;i<7;i++)			/*读时钟芯片的时分秒单元*/
		{
		if(DINOUT==1) 
				clocktmp[j]=clocktmp[j]|0x80;
		else  	clocktmp[j]=clocktmp[j]&0x7f;
		clk=1;
		clocktmp[j]=clocktmp[j]>>1;	/*接收暂存单元*/	
		nop;
		clk=0;					/*时钟下降沿,接收数据有效*/
		}
		delay(5);
		RST=0;
		delay(10);
	   }
	dispbuf[1]=clocktmp[0]&0x0f;	/*转换秒分时显示单元*/
	dispbuf[2]=clocktmp[0]>>4&0x07;
	dispbuf[3]=clocktmp[1]&0x0f;
	dispbuf[4]=clocktmp[1]>>4&0x07;
	dispbuf[5]=clocktmp[2]&0x0f;
	dispbuf[6]=clocktmp[2]>>4&0x03;
nop;
}		/*返回主程式*/
//**************************************************************
void read24c02()				/*读24c02的存储值*/
{uchar i;
   TRcvAddress(0xa0,0,&bufdata[0],7);  
   for(i=0;i<6;i++)
    {dispbuf[i]=bufdata[i];
    }
}		/*返回上一层程式*/
/******************************************************/
void write24c02()			/*写24c02的存储值*/
{
	TSendAddress(0xa0,0,dispbuf,7);	 /* 向有子地址器件写入6字节数据函数 */
}
//**************************************************************
void send_to_Comm1(void)			/*宣告串口serial发送副程式*/	
{ 
	uchar i=0;//huzm
/*	uchar sec,min,hour;
	sec=((dispbuf[2]<<4)&0xf0)|(dispbuf[1]&0x0f);
	min=((dispbuf[4]<<4)&0xf0)|(dispbuf[3]&0x0f);
	hour=((dispbuf[6]<<4)&0xf0)|(dispbuf[5]&0x0f);

⌨️ 快捷键说明

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