打印

C51 3*4 按键

[复制链接]
1454|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lijiejun1314|  楼主 | 2011-3-19 11:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式






本人想用P1口做个3*4键盘,由于P1.2,P1.3 要用于串口2,
故P1.0,P1.1,P3.5作行线  P1.4,P1.5,P1.6,P1.7作列线
仿真过好像不行,不知是什么原因,请大侠们给我改动一下
还有ltkey这个定义,不知这样处理可行不?

bit amled = 0; //状态标志位
bit ltkey = 0;  //防止长按键标志位
uchar pic = 0;  //用于定时器计数
void KeyScan(void)   
{
uchar NowTemp;
if(pic == 10)    //每40ms首次扫描
{
    P1 = 0xfc;
   
    temp = P1;
    temp = temp & 0xfc;
}
if(pic == 13)    //12ms后再次扫描判断
{
    P1 = 0xfc;
   
    NowTemp = P1;
    NowTemp = NowTemp & 0xfc;
    if(temp != NowTemp)   //如果不同,视为抖动,不作处理
    {
       P1 = 0xfc;
    }
    if((temp == NowTemp)&&(NowTemp != 0xfc))   //如果相同,且不为fc,判为有按键按下
    {
   
      //以下为逐行扫描
        P1_0 = 0;
     switch(temp)
     {
         case 0x7c:
               if(ltkey == 0)break;
       {
          amled = ~amled;
       KeyValue = 1;
       ltkey = 1
       }
      case 0xdc: KeyValue = 2;break;
      case 0xec: KeyValue = 3;break;
      default:break;
     }
     P1_0 = 1;   //置位 ?
        P1_1 = 0;
     switch(temp)
     {
         case 0x7c: KeyValue = 4;break;
      case 0xbc: KeyValue = 5;break;
      case 0xdc: KeyValue = 6;break;
      case 0xec: KeyValue = 7;break;
      default:break;
     }
     P1_1 = 1;
        P3_5 = 0;
     switch(temp)
     {
         case 0x7c: KeyValue = 8;break;
      case 0xbc: KeyValue = 9;break;
      default:break;
     }
     P3_5 = 1;
    }
    else
    {
       ltkey = 0;
    }   
}
}

void KeyControl(void)
{
   switch(KeyValue)
   {
      case  1:      
    LEDAM1 = amled;
    LEDAM2 = ~amled;
    break;
  case   2:
          if(amled == 0)
    {
        LED1 = ~LED1;   //灯闪烁
     delay0_5s();
    }
    else
    {
       LED1 = 1;   //灯长亮
    }
    break;
   case   3:
          if(amled == 0)
    {
        LED2 = ~LED2;   //灯闪烁
     delay0_5s();
    }
    else
    {
       LED2 = 1;   //灯长亮
    }
    break;
    .
    .
    .
    .
  default :break;
   }
}

相关帖子

沙发
airwill| | 2011-3-19 13:05 | 只看该作者
连按键消抖都没有处理, 哪里能够稳定呢?

使用特权

评论回复
板凳
lijiejun1314|  楼主 | 2011-3-19 13:13 | 只看该作者
消抖了,定时器消抖,pic=10到pic=13,中间隔了12ms,两次判断哦,不知我理解对不?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

5

帖子

1

粉丝