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

📄 keydisp.c

📁 4*4按键显示扫描程序, 按键显示扫描程序
💻 C
字号:
/*键码值-----------------------------------------
p0.0    0x11       0x21      0x41       0x81      

p0.1    0x12       0x22      0x42       0x82

p0.2    0x14       0x24      0x44       0x84  

p0.3    0x18       0x28      0x48       0x88

       p0.4     p0.5     p0.6     p0.7
-------------------------------------------*/
 #include <reg52.h>
 
 #define uchar unsigned char
 #define uint unsigned int
 uchar code byteled[]={0x70,0x60,0x50,0x40,0x30,0x20,0x10,0x00};
 uchar Dis_buffer[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
 void delays (void);
 uchar kbscan(void);
 void do_key(void);
 void disp(void);
 uchar key;
 void main(void)
 {
 
 while(1)
  {
   disp();
   key=kbscan();//键扫描函数
   do_key();
   delays();        //消抖
  }
}
  
//键扫描函数
  uchar kbscan(void)
  {
  uchar sccode,recode;
  P2=0xf0;                    //设初值以便高4位在有键按下时。就被拉低
 if((P2&0xf0)!=0xf0)               //判断有没有按键
   { 
  //  DelayMs(10);                   //有按键时消除抖动
	if((P2&0xf0)!=0xf0)       //再判断有没有按键
    {
	   sccode=0xfe;             //从p0.0开始扫描行值
	 while((sccode&0x10)!=0)     //扫描到第四个,即p0.3
	  { 
	     P2=sccode;             //记录当前扫描行有没有按键
	    if((P2&0xf0)!=0xf0)       //判断当前行有没有按键
	     {
                recode=(P2&0xf0)|0x0f;  //记录当前p0口列的值‘0’为有效
                do{P2=0xf0;}while((P2&0xf0)!=0xf0);
					// DelayMs(10);     //放开按键时消除抖动
		return((~sccode)+(~recode));  //返回行值和列值。取反则‘1’为有效
	     }
	     else
	      sccode=(sccode<<1)|0x01;     //没有,则扫描下一行
	  }
	}
   }
  return(0);
}
 void do_key(void)
 {
  uchar i,key_value;
	//处理数字键
 switch(key)
   {
	 
      case 0x11:
	   key_value=0x00;
		break;
	  case 0x21:
	   key_value=0x01;
		break;
	  case 0x41:
	   key_value=0x02;
		break;
	  case 0x81:
	   key_value=0x03;
		break;
	  case 0x12:
	   key_value=0x04;
		break;
	  case 0x22:
	   key_value=0x05;
		break;
	  case 0x42:
	   key_value=0x06;
		break;
	  case 0x82:
	   key_value=0x07;
		break;
	  case 0x14:
	   key_value=0x08;
		break;
	  case 0x24:
	   key_value=0x09;
		break;
	  case 0x44:
	   key_value=0x0a;
		break;
	  case 0x84:
	   key_value=0x0b;
		break;
	  case 0x18:
	   key_value=0x0c;
		break;
	  case 0x28:
	   key_value=0x0d;
		break;
	  case 0x48:
	   key_value=0x0e;
		break;
	  case 0x88:
	   key_value=0x0f;
		break;
		default :key_value=0xff; break;
	 }
	 if(key_value==0xff)
	     return;
    if(key_value>=0&&key_value<=9)
	   {
        for(i=7;i>0;i--)
        Dis_buffer[i]=Dis_buffer[i-1];
        Dis_buffer[0]=key_value;
	   }
}
   //动态显示
 void disp(void)
 {
   uchar k;
    for(k=0;k<8;k++)
     {
       P0=Dis_buffer[k]|byteled[k];
		delays();
      }
  }
    //延时
void  delays(void)
  { 
   uint i;
	for (i=0;i<560;i++);
  }




if(key==0x84)
    time_set();
  else if(key==0x18)
    alarm_set();
  else if(key==0x28)
    alarm_led=0;
  else if(key==0x48)
    {
    alarm_led=1;
    alarm_buzzer=1;
    }
do{P2=0xf0;}while((P2&0xf0)!=0xf0);

⌨️ 快捷键说明

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