閱讀141 返回首頁    go 阿裏雲 go 技術社區[雲棲]


8路搶答器(帶倒計時)

#include<reg52.h>     //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#define uchar unsigned char
#define uint  unsigned int
sbit SPK=P1^2; 
unsigned char code  seg[]={0,1,2,3,4,5,6,7};  
unsigned char code dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
		                  	 0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
uchar keyscan();   //鍵盤掃描
void play();
/******************************************************************/
/*                    延時函數                                    */
/******************************************************************/
void delay(unsigned int cnt)
{
   while(--cnt);
}
void delay1()
{   
	int i,j;
	 for(i=200;i>0;i--)
	   for(j=1000;j>0;j--);
}
/******************************************************************/
/*                    主函數                                      */
/******************************************************************/
void main()
{ 
     uint gewei,shiwei,i,j,k,flag=1; 
	 uchar key; 	
	 uint time=11;
     while(time--)						  //十秒倒計時
	  {		   
		    if(time==0)
		    break;   			   	  
		    shiwei=dofly[time/10];
		    gewei=dofly[time%10];
	  for(j=0;j<100;j++)					//數碼管動態掃描,隻顯示前兩位   
	     { 	
		 	delay(300);		
		   	P0=gewei;				   //段選
			P2=1;						//位選
			delay(300);	
			P0=shiwei;
			P2=0;			
	     }		  
   }
   for(k=5;k>0;k--)					 //無源蜂鳴器響5聲
	 {
	  for(i=0;i<200;i++)//喇叭發聲的時間循環,改變大小可以改變發聲時間長短
          {
          delay(80);     //參數決定發聲的頻率,估算值,可以自行更改參數並
          SPK=!SPK;
          }
       SPK=1;            //喇叭停止工作,間歇的時間,可更改
       delay(80); 
	}
	 while(1)					 //8路搶答器搶答
	 	{
	
		 key=keyscan();  //調用鍵盤掃描,
		{			
					  if(key==0x7e)  {  P0=dofly[1],P1=0x00;play();}
			          if(key==0xbe)  {  P0=dofly[2],P1=0x00;play();}
					  if(key==0xde)  {  P0=dofly[3],P1=0x00;play();}
					  if(key==0xee)	 {  P0=dofly[4],P1=0x00;play();}
				      if(key==0x7d)	 {  P0=dofly[5],P1=0x00;play();}
					  if(key==0xbd)	 {  P0=dofly[6],P1=0x00;play();}
					  if(key==0xdd)	 {  P0=dofly[7],P1=0x00;play();}
					  if(key==0xed)  {  P0=dofly[8],P1=0x00;play();}		 
        }  	 
   }
}
/*------------------------------------------------
              鍵盤掃描程序
------------------------------------------------	*/
uchar keyscan()  //鍵盤掃描函數,使用行列反轉掃描法
{
 uchar cord_h,cord_l;//行列值中間變量
 P3=0xf0;            //行線輸出全為0
 P1=0xff;	  
 cord_h=P3&0xf0;     //讀入列線值
 if(cord_h!=0x0f)    //先檢測有無按鍵按下
	 {
	  delay(100);        //去抖
	  if(cord_h!=0x0f)
			  {
			   	
			    cord_h=P3&0xf0;  //讀入列線值
			    P3=cord_h|0x0f;  //輸出當前列線值
			    cord_l=P3&0x0f;  //讀入行線值
			 
			    return(cord_h+cord_l);//鍵盤最後組合碼值
			   }
	  }
  //  return(0x00);     //返回該值
}


void play()			//8個數碼管動態掃描,死循環
{
   int j=0,i;
  for(i=1;i>0;i++)		   //a死循環
	{
   	     		 
	             P2=seg[j++]; 
	                 {
				         if(j==8) 
				            j=0;
				     }
		       delay(100);
			   }
}
										

最後更新:2017-04-03 14:54:35

  上一篇:go J2EE部署項目至Tomcat報錯:Unable to read TLD &quot;META-INF/c.tld&quot;
  下一篇:go Eclipse SVN (Subclipse的更新日誌)、版本集合(1.10.0起)、更新、安裝方法!