微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 有关单片机键盘的讨论

有关单片机键盘的讨论

时间:10-02 整理:3721RD 点击:
void timer() interrupt 1
{
        static uint time1=0;
    TH0 = 0xFC;
        TL0 = 0x67;
        keystart=0xf0;
    if(keystart!=0xf0)
        {
            time1++;
                if(time1>=4&&keystart!=0xf0)
           {
              keystart=0xf0;//为什么这里keystart还要被赋值0xf0呢?(这是我在网上搜的)这样的话后面                   的 switch语句就没什么作用了吗(keystart只能为0xf0)
              switch(keystart)
                  {
                     case 0x70:value=0;break;
                         case 0xb0:value=4;break;
                         case 0xd0:value=8;break;
                         case 0xe0:value=12;break;
                         default:break;
                  }
                     keystart=0x0f;
                  switch(keystart)
                  {
                     case 0x07:value+=0;break;
                         case 0xb0:value+=1;break;
                         case 0xd0:value+=2;break;
                         case 0xe0:value+=3;break;
                         default:break;
                  }
                  time1=0;
                  a=0;
                }
        }                       
}


开始状态:高4位必须先变成高电平,低4位变成低电平。
然后,如果对应的位置有按键,高电平会被拉低变成低电平。
keystart的值,会根据按键情况变化。

我的意思是说为什么keystart会再次赋值,第一个if语句不是已经赋值了吗?为什么还要再次赋值?麻烦你认真看下我的程序

keystart=0xf0;由于存在线与关系,keystart值会改变,故进入外层if语句中,time1>=4发挥延时消抖的作用(并且要求time1<5期间keystart的值不等于0xf0,即按键一直处于按下的状态),之后再次给keystart赋值0xf0通过判断低四位得到按下的哪一行按键,然后再次给keystart赋值0x0f判断高四位得到按下的是哪一列按键。最终得到按键信息

参考参考之前的回帖吧
http://bbs.elecfans.com/forum.ph ... amp;fromuid=1362400

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top