找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3391|回复: 1
打印 上一主题 下一主题
收起左侧

分享一些单片机按键程序

[复制链接]
跳转到指定楼层
楼主
ID:165188 发表于 2018-9-16 21:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*==================
  按键读键函数
==================*/   
void ReadKey(void)
{  
uchar ReadData;   
ReadData=(((~(P3&0XF0))&0XF0)|(P3&0X0F));  //将前四位取反,即P3.7-P3.4 保留P3.3-P3.0的数据,【目的为将按键位取反,不影响其他位】   
    Trg  = ReadData & (~Cont);      // 只要有按键按下,在对应位会有一个脉冲,后四位不确定。如P3.4按下了,会出现一次0X1F;P3.5按下了,会出现一次0X2F;
    Cont = ReadData;                // 有按键按下,会出现对应编码。
if(Cont&0xf0) // 如果按键不放,不处理  
   {
     KeyCnt++;   // 读键次数
  KeyEffect=Cont;
  if(KeyCnt>=1000)KeyCnt=1000;
     return;
   }
else       // 键值发生改变
   {     
     
     if((KeyCnt>=10)&&(KeyCnt<=90))   //多次读键消抖      
     {      
        KeyCnt=0;
   KeyEffect=(KeyEffect&0xf0)+80;
   KeyOpt();
   send_char_com(KeyEffect);
        if(Cont&0x10)
   {  
    BeepCnt=0x10;
    Keyflg_S2=1;
   
   }
     }      
  else if(KeyCnt>=150)   //长按      
     {                        
   BeepCnt=0x10;
      KeyCnt=0;
     }
   }  
}
/*===============
  按键处理子函数
=================*/
void KeyOpt(void)         
{  
  switch(KeyEffect)
  {     
    case 0:              // 空键  
    {      
      break;
    }
case 0xd0:              // S4键(P1.3)  
   {      
    BeepCnt=0x10;  
  Keyflg_S5^=1;
  LED1^=1;
      break;
   }
   case 0x90:            // S5键(P1.4)   
   {
    BeepCnt=0x10;
    Keyflg_S4^=1;
  LED2^=1;
      break;
    }
case 0x70:              // S6键(P1.5)  
   {      
    BeepCnt=0x10;
    Keyflg_S3^=1;
  LED3^=1;      
      break;
   }
    case 0x60:              // S6键(P1.5)  
   {      
    BeepCnt=0x10;
    Keyflg_S2^=1;
  LED4^=1;      
      break;
   }  
   default: break;
  }
}   


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:66287 发表于 2018-9-17 15:36 | 只看该作者
通过三个逻辑变量运算,确定按键的按下、长按、抬起,确实较妙。如果配以状态机,则程序会更简洁。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表