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

📄 key10_10.c

📁 自已编写的一个用于调试单片机串口的一个下位机程序。很实用的。
💻 C
📖 第 1 页 / 共 2 页
字号:
 -----------蜂鸣器鸣叫程序----------------
 *****************************************/
void OpeningBeep(uchar OBN)
{
    uchar data i;
    for(i=0;i<OBN;i++){
       Beep=0;
       DELAY(150);
       Beep=1;
    DELAY(150);
      // DELAY(100);
       //Beep=0;            
       //DELAY(150);
       //Beep=1;
   }
}
/****************************************
 ---------  延时函数 ,大约1MS.-----------
 ****************************************/
void DELAY(uint z)
{
    uchar data l;
    while((z--)>0)
    {
       for(l=0;l<31;l++)    RestWatchdog();   /* 125 _nop_(); */
    }
}

/**************************************************************
 ---------------键盘扫描程序,返回按下的键值代码----------------
 -- 有键按下返回键值代码,无键按下返回0,有键但没松开返回0XFF --
 **************************************************************/

uchar Key_Press(void)
{
	uchar data j=1,d;
	RetKey=0;
    key=0xff;
    
    P2=0;            /*  查询有无按键按下   */
    _nop_();
    _nop_();
    key=P0;
    if(key==0xff ){  /*  无键按下  */
KP: 	RetKey=NoKeyPress; KeyStatus=Up;
		//OpeningBeep(1);//ysmtest
		goto ENDKPONE;
     			  }
    else
		{
        	for(d=0;d<250;d++)     RestWatchdog();   /*  254  */
            key=P0;
            if(key==0xff)  goto KP;  /* 除去因抖动引起的错误按键信息  */
          	 		   
		    ScanKey();
	  
		    if(key==PYStatusKey)	/* 是汉英键  */
				{
                                     
                 	RetKey=0xaf;
				    PYStatus1=0;
                    PYStatusLED=0;
				    KeyStatus=Down;
			    }
            else				/* 不是汉英键 */
				{ 

					if((PYStatus1==0)&&(DotKeyStatus==1))/* 汉英和DotKey键已按下  */
						{
						  OpeningBeep(8);
							RetKey=KeyCodeNewTabFour[key];
						    DotKeyStatus=0;
						    KeyStatus=Down; 
						    goto ENDKP;
						 }
			             
		            if((PYStatus1==0)&&(DotKeyStatus==0))/* 汉英键已按但DotKey还没按下  */
						{
							if(key==dotkey)				/* 是DotKey键吗?  */
								{
						    		DotKeyStatus=1;
						    		RetKey=NoKeyPress;
                            		KeyStatus=Down;
						    		goto ENDKP;						 						  
						  		}
				 		  
                            StartPYKey();	/*在汉英状态下选择第几个字母*/
			                CheckPYTab();
			                KeyStatus=Down;
					    }

	
			 		else					/* 汉英和DotKey键都没按下  */
						{
			            	if((key==ShiftKey)&&(PYStatus1==1))
								{     /* 如为变位(上下档)键,则改变上下档标志位及LED灯显示状态  */
                                	RetKey=NoKeyPress;
                                    ShiftStatus=~ShiftStatus;   /* 上下档键切换,=0上,=1下档键. */
                                    SHIFTLED=ShiftStatus;
									
						 		}
                         	else{
                                    if((ShiftStatus==0)&&(PYStatus1==1)){     /* 如果是上档键 */
                                       RetKey=KeyCodeNewTabUp[key];OpeningBeep(3);
							  											}
                        			else {       /* 如果是=1下档键 */
				    					if((ShiftStatus==1)&&(PYStatus1==1))
                                        	RetKey=KeyCodeNewTabDown[key];OpeningBeep(5);
							  			 }
                                     KeyStatus=Down;
						 		}            

							_nop_();
							goto ENDKP;
					    }
				    _nop_();
				    goto ENDKP;
				 }
            _nop_();
            goto  ENDKP;
	}
ENDKP: 
	for(;;)
		{
			key=P0;
            if(key==0xff)
				{
                	for(d=0;d<70;d++) RestWatchdog();  /* 254 WatchDog=!WatchDog;*/
                    break;
                }
            RestWatchdog();
        }
ENDKPONE:                           
  
	return(RetKey);
}


uchar   ScanKey(void)
{
      uchar data i,j=1;
      P2=0;                         /*  查询有无按键按下   */
//    key=P0;
      for(i=0;i<5;i++)
		{        /*  扫描哪个按键按下   */ 
        	P2=~j;              /*  列扫描             */ 
            key=P0;
			_nop_();
            if(key!=0xff)
				{
                	j=i*8;
                    for(i=0;i<8;i++)
						{  /*       行扫描   */                         
                           if(key%2==0) break;
                           key=key>>1;
                      	}
                    key=j+i;                 /*   按键的行列值之和  */
		     		
					if(key==EnterKey)
						{	
	    	      			PYStatusLED=1;
                  			PYStatus1=1;	/*非汉英状态*/
	            		}
                    Beep=0;
                    DELAY(90);             /*  100   */
                    Beep=1;
                    _nop_();
                    goto ENDKP1;
                }
		    j=j<<1;
		    RestWatchdog();
	    }

ENDKP1:  
		return(key);
}


void  CheckPYTab(void)
{

	switch(CounterNub1){

		case   Tab1:
	        	RetKey=KeyCodeNewTabOne[key];
	        	break;
     	case   Tab2:	
			    RetKey=KeyCodeNewTabTwo[key];
				break;
        case   Tab3:
			    RetKey=KeyCodeNewTabThree[key];
				break;
//      case   Tab4:
//			    RetKey=KeyCodeNewTabFour[key];
//				break;
        default:
			    break;
	}
}


uchar  StartPYKey(void)
{
   if(key==SbufKey)		/*按键与上次相同*/
   	{
       ++CounterNub2;
	   SbufKey=key;
       CounterNub1=CounterNub2;
	   if(CounterNub1==4)
	   	{
		  CounterNub1=1;
          CounterNub2=CounterNub1;
	    }
    }
   else					/*按键与上次不同*/
	 {
		if(key==EndInputKey)
			{
				SbufKey=0x28;
				CounterNub1=1;
        		CounterNub2=0;		
			}
		else{			
			 	SbufKey=key;
		     	CounterNub1=1;
             	CounterNub2=CounterNub1;
			}		
	 }
	return(CounterNub1);
}


void   RestWatchdog(void)
{
    _nop_();
    _nop_();
    _nop_();
}


void delayms(uchar t1,uchar t2)       /* 延时时间=4[t2(t1+1)+1]*机器周期 */
{                                     /* 机器周期=1.08us 11.0592Mhz */
	uchar t;                          /* 最大延时282Ms */

	do{
		t=t1;
		do{
             t--;
		   }while(t != 0);
		t2--;
	  }while(t2 != 0);
}


void CheckLED(void)
{        
	 uchar m; 
	 for(m=0;m<2;m++)
       {
         PowerLed=0;
         delayms(90,90);
         PowerLed=1;
         delayms(90,90);
        
         SHIFTLED=0;
         delayms(90,90);
         SHIFTLED=1;
         delayms(90,90);
		 TestLED=0;
		 delayms(90,90);
		 TestLED=1;
         PowerLed=0;
       }  
}


void main(void)
{
    uchar data k, mkey=0x0; 
    bit     NewKey=No;
    IE=0;
    SHIFTLED=1;
    KeyStatus=Up;
    ShiftStatus=1;           /* 上下档键切换,=1下档,=0上档键. */
    SHIFTLED=ShiftStatus;
    DotKeyStatus=0;
    PYStatus1=1;
    PYStatusLED=1;
    SbufKey=0x28;
    fini=0;       /*   初始化串行数据完成标志位  */
    OpeningBeep(2);
    CheckLED();                 
    InitSBUF();   /*   初始化串行口              */  
    IT0=1;		  /*   下降沿有效   */
	EX0=1;		  
	ES=1;
    EA=1;    /*   开串行中断                */                            
	
	KeyInt=High;
    while(1)
	{	P2=0;            /*  查询有无按键按下 ysmtest  */
		 k=P0;  
         if(KeyStatus==Down)
			{
             	if(k==0xff)
					{  /* 如果键已松开,则置松键标志与新键输入标志位*/  
                 		KeyStatus=Up;
                 		//NewKey=Yes;
						NewKey=No;
             		}
					
         	}
         if(KeyInt==Low)
			{			
         		if((NewKey==No) && (KeyStatus==Up))
				  {
                	ES=0;
                	mkey=Key_Press();   
                	RI=0;
                	TI=0;
                	ES=1;
        		  }

				KeyInt=High;	
		    }
         if(fini==1)
		   {
              ES=0;
              switch(handle)
				{
                   case GetKey:  if(KeyStatus==Down)
                                      Un.ComBuf[0]=KeyNoUp;    									 			
                                       
                                 else
								 	{
                                       Un.ComBuf[0]=mkey; 
                                       NewKey=No;
                                    }
                                  SendBuf(Finish,1);                                                                                                   
                                  break;
                   case OpenBeep: k=Un.ComBuf[0];
                                  OpeningBeep(k); /* 开蜂鸣器,有可能更改为带参数的程序,产生多种声音 */
                                  SendBuf(Finish,0);
                                  break;
                   //case TestKey:  SendBuf(Finish,0);
                                  //break;
                   default:       break;
					   
                }
              fini=0;
              ES=1;
           }
    }
}

⌨️ 快捷键说明

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