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

📄 keycontrol.c

📁 51键盘控制
💻 C
📖 第 1 页 / 共 2 页
字号:
			 else
			 {
			   task++;                            //按键状态转入重复的延缓阶段
			   keycnt = 0;                        //按键年龄清零
			 }
		   }
		   break;
		 case 1:                                  //重复的延缓阶段
		   if(keycnt == MaxRate)                  //按键年龄等于重复的延缓时间
		   {
		     enflash = 0;                         //不允许闪烁
			 
			 keyprocess = 1;                      //进行键值处理
			 keycnt = 0;                          //按键年龄清零
			 task++;                              //按键状态转入重复阶段
		   }
		   break;
		 case 2:                                  //重复阶段
		   if(keycnt == MinRate)                  //重复时间到
		   {
		     enflash = 0;                         //不允许闪烁
			 keyprocess=1;                        //进行按键值处理
			 keycnt=0;                            //按键年龄清零
		   }
		   break;
		}
	  }
	}
  }
}
/***********************************************************************************
*函数原型:void key_handler()
*功能:按键1处理
*说明:正常工作模式下,按下按键1即进入设定状态,此时第一个数码管闪烁,同时对应LED1的指示灯亮。
*      设定模式下,按下按键1,在LED1和LED4之间循环切换选择被选中的数码管闪烁,相应的指示灯亮
************************************************************************************/  
void key1_handler()
{
  if(!keymark)                                     //进入设定状态
  {
    led_buf[0] = 0xFE;                             //点亮第一个LED
	pb=&led_buf[1];                                //pb指向第一个数码管
	blink=0x08;                                    //第一位数码管闪烁
	keymark=1;
	enflash=1;                                     //允许闪烁
  }
  else
  {
    pb++;                                           //指向下一个数码管
	blink>>=1;                                      //该数码管闪烁
	led_buf[0]=_crol_(led_buf[0],2);                //调整指示灯
	if(pb>=(uchar*)(led_buf+5))
	{
	  pb=&led_buf[1];
	  blink=0x08;                                    //第一个数码管闪烁
	}
  }
}
/***********************************************************************************
*函数原型:void key2_handler()
*功能:按键2处理
*说明:设定状态下,每执行一次选中的数码管的显示数值加1,
*      常按数值以一定速度连续递增,当数值大于9时又回到0;
*      正常状态下,按该键无效
************************************************************************************/    
void key2_handler()
{
  if(keymark)
  {
    *pb+=1;
	if(*pb==0x0A)
	  *pb=0x00;
  }
}            
/***********************************************************************************
*函数原型:void key3_handler()
*功能:按键3处理
*说明:设定状态下,每执行一次选中的数码管的显示数值减1,
       常按数值以一定速度连续递减,当数值等于0时又回到9;
	   正常状态下,按该键无效
************************************************************************************/
void key3_handler()
{
  if(keymark)
  {
    if(*pb==0)              *pb=9;
	else                    *pb-=1;
  }
}
/***********************************************************************************
*函数原型:void key4_handler()
*功能:按键4处理
*说明:该键为确定键,按下后熄灭指示灯,不闪烁,进入工作状态
************************************************************************************/
void key4_handler()
{
  blink=0x00;
  led_buf[0]=0xFF;
  keymark=0;
}
/***********************************************************************************
*函数原型:void keymix_handler()
*功能:复合键(上档键5+功能键8)处理
*说明:执行复位功能。4个数码管全显0,不闪烁。8个指示灯全灭,进入正常工作方式
************************************************************************************/
void keymix_handler()
{
  led_buf[0]=0xFF;
  led_buf[1]=0x00;
  led_buf[2]=0x00;
  led_buf[3]=0x00;
  led_buf[4]=0x00;
  keymark=0;
  blink=0x00;
}
/***********************************************************************************
*函数原型:void key_processing()
*功能:键值处理
*说明:根据键值执行相应按键功能
*参数:keyprocess keypre[1] keypre[0]
************************************************************************************/
void key_processing()
{
  if(keyprocess)                               //keyprocess为1时,函数实体才被执行
  {
    keydone=0;
	keyprocess=0;
	switch(keypre[1])
	{
	  case 0x00:
	    switch(keypre[0])
		{
		  case 0x01:key1_handler();break;
		  case 0x02:key2_handler();break;
		  case 0x03:key3_handler();break;
		  case 0x04:key4_handler();break;
		}
		break;
	  case 0x05:
	    if(keypre[0]==8)
		   keymix_handler();
		break;
	}
	keydone = 1;
  }
}
/***********************************************************************************
*函数原型:void timer0() interrupt 1
*功能:定时器0中断服务程序
*说明:键盘和LED一起构成1/6扫描,每6次中断进行一次键盘处理
************************************************************************************/
void timer0() interrupt 1
{
  TH0=V_TH0;
  TL0=V_TL0;                                //时间常数重载
  if(state<=4)
  {
    lflash();
	display(state);
	state++;
  }
  else
  {
    key();
	state=0;
  }
}
/***********************************************************************************
*函数原型:void main()
*功能:主程序,执行初始化操作,循环等待按键事件
*说明:无
************************************************************************************/
void main()
{
  TMOD=V_TMOD;
  TH0=V_TH0;
  TL0=V_TL0;                                //定时器T0初始化
  TR0=1;
  ET0=1;
  EA=1;
  task=0x00;
  state=0x00;                               //标量和变量初始化
  keyprocess=0;
  keydone=1;
  ledtime=ledshow;
  ledtask=0;
  keymark=0;
  while(1)
  {
    key_processing();
  }
}

⌨️ 快捷键说明

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