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

📄 key.c

📁 AVR基本外设测试程序
💻 C
字号:
#include"sga.h"  
unsigned char key_t2(void)
{
	static unsigned char   NK=0,
            			   PPK=111,
			           KZT,
                                   YYK,
                                   NKEY_n,
				   key_i=0;
				   			  
	unsigned char   a,c, KEYIN,z,i;
    z=0;
	DDRC|=0X3E;//0011 1110 PC1,PC2,PC3,PC4,PC5设为输出
	PC5_1;PC4_1;PC3_1;   //PC3,PC4,PC5输出为1
	NOP();NOP();NOP();NOP();NOP();NOP();
    switch(key_i)
	{
		case 0:PC2_1;PC1_0;  break;
		case 1:PC2_0;PC1_1;  break; 
	}
	key_i++;
	NOP();NOP();NOP();NOP();NOP();NOP();
	if(key_i==2)	key_i=0;
      
     DDRC&=0XC7;//1100 0111
	 i=PORTC;
	 i=i&0x38;
	     if(i==0x18)//PC3,PC4,PC5中有一个为0
	{
		a=3;
	}else
	     if(i==0x28)
	{
		a=4;
	}else
		if(i==0x30)
	{
		a=5;
	}else		 
	{		 
		a=0;
	}

	a=a*10+key_i;
	if(a<20)
	{
		NKEY_n++;
        if(NKEY_n==4)
        {

            NKEY_n=0;   z=1;
            for(a=0;a!=14;a++)
            KKEY_n[a]=0;
            KEYIN=0;             //返回空按钮键值
        }
	}else //A>20
    {
        NKEY_n=0;
        switch(a)
        {
            
            case 31:KKEY_n[3]++;break;  //UP    	4
            case 30:KKEY_n[8]++;break;  //KS3   	9 
			
            case 41:KKEY_n[1]++;break; // ADD   	2
            case 40:KKEY_n[0]++;break;  //BEGIN     1

	   	    case 51:KKEY_n[12]++;break;  // X6	    13
            case 50:KKEY_n[6]++;break;	 // MUSIC  
 
        }
        for(a=0;a!=14;a++)
        {
            if(KKEY_n[a]==4)
            {
                KEYIN=a+1;  z=1;
                NKEY_n=0;
                for(c=0;c!=14;c++)  KKEY_n[c]=0;
                break;
            }
        }
        if(a==14)   return(0);       //有按钮,但还没有获得有效按钮
    }

    if(z==0)    return(0);


   if(KEYIN==0)            //没有按键时的处理
	{

		if((++NK)>2)
		{
			NK=30;		//强制赋值为20;以防止不断累加溢出
			KEY=0;
//			YYK=0;
//			if(XIE_BEGIN==1)	SENG=JIANG=1;	//没有按键,停止升降
			switch(PPK)
			{
				case SET:
					KEY=PPK;
					PPK=111;
					if(YYK<16)
                                        	return(1);//若连击时间小于2s则认为是单击
					break;
				default:PPK=111;
			}
                        YYK=0;
		}
		return(0);
	}
	NK=0; 

	if(PPK!=KEYIN)
	{
	  PPK=KEYIN;
	  YYK=0;
	  KZT=1;
	  return(0);
	}
	if(YYK==200) return(0);		//连续按住ok状态,不进行下面处理
	++YYK;
	switch(KZT)
	{
	case 1:   if((PPK==SET && YYK>26))
			{
				YYK=200;
				KEY=PPK;
				return(2);
			}  
 
		 if  (  PPK==BEGIN  || PPK==END    )//PPK==CLEAR ||
			     {
					 if(YYK!=1) return(0);
                     NOP();
					KEY=PPK;
					return(1);
			     }
///			 ///
			if(PPK==ADD || PPK==SUB  )	// +.-
			{
				KEY=PPK;
				KZT=2;        YYK=0;
				 if(CHW==0)    BIT_80|=0x80;//a.BEEP1=1;
				return(1);
			}
			return(0);
		case 2: if(YYK!=20 && (PPK==ADD || PPK==SUB  ))
                           return(0);
				 YYK=0;
				 KEY=PPK;
				 KZT=3;
			return(1);
		case 3: if (YYK!=10)      return(0);
			 	YYK=0;
			 	KEY=PPK;
			 	return(1);               
	 }
	 return 255;
}

⌨️ 快捷键说明

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