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

51单片机读取键盘的按键问题

时间:10-02 整理:3721RD 点击:

51单片机读取74c922键盘的按键,在12864进行显示,程序:
/*------------------键盘读值-----------------*/
uchar  key1(void)
{ uchar keyk;
        //KDA=keyDA;
if(KDA==1)
{         //P2=0x00;
          delay_key(20);
        if (KDA==1)
        {
                delay_key(20);
                  keyk=P2&0xf0;
                  next++;
                P2=0xf0;
                        }
                        switch(keyk)
                {        
                        case 0x00:k=7; break;
                        case 0x10:k=4; break;
                        case 0x30:k=1; break;
                        case 0x20:k=0; break;
                        case 0x40:k=8; break;
                        case 0x50:k=5; break;
                        case 0x70:k=2; break;                                                                                                                                                                           case 0x80:k=9; break;
                        case 0x90:k=6; break;
                        case 0xb0:k=3; break;
                        case 0x60:k=10;break;//光标        
                        case 0xa0:k=11;break;//确定
                        case 0xc0:k=12;break;//复位
                        case 0xd0:k=13;break;//通信
                    case 0xf0:k=14;break;//设置
                        case 0xe0:k=15;break;//测量
                        }
}
return k;
}
void main ()
{
//delay_lcd(2000);
//P2=0x00;        
init_lcd ();
init();
KDA=keyDA;
shen=0;
time=0;
KDA=0;
counter=0;
clrram ();
        wc(0x80);
        wh("速度");
        wd(0x3a);
        wc(0x90);
        wh ("深度");
while(1)
{
          KDA=keyDA;
        delay_lcd(100);
        k=key1();
        sushen();
if(0<=k<=9)
        {wc(0x88);
        wd(0x30+k);
        }
if(k==14)
        {
         s=1;
         shezhi();
           }
if(k==12)
         {
           soft_reset();
         }
  }
}
/*------------------设置子程序-----------------*/
void shezhi(void)         //;
{
        uchar a,b,shejishu;
        shejishu=0;
        a=1;
        b=1,s=0,x=1;
        clrram();
        while(shejishu==0)        //设置1
        { delay_key(100);
//        uchar k;
        wc(0x81);
        wh("测量方式:");
        wc(0x91);
        wh("1:磁法");
        wc(0x89);
        wh("2:电法");
        wc(0x99);
        wh("选择:");
        wc(0x9c);
        wc(0x14);
//        wc(0x0c);
        wd(a+0x30);
        k=key1();
         if(1<=k<=2)
         {
                 a=k;
                  if(a==1)
                  {        c=1;
                          d=0;
                  }
                  if(a==2)
                  {        
                          c=0;
                          d=1;
                  }
         }
         if(k==11)                     //设置1完成,跳出
         {shejishu++;
         clrram();
         break;
         }
         }
        while(shejishu==1)                //设置2
        {
        
//         uchar k;
        next=0;
        wc(0x81);
        wh("起始深度:");
        wc(0x89);
//        wc(0x0f);
        k=key1();
        if(0<=k<=9)
        {
                if(next>=2)
                        {next=0;}
                wu[next]=k;
        }
        wd(wu[0]+0x30);
        wd(wu[1]+0x30);
        wc(0x8a);
//        wc(0x0f);
        wd(wu[2]+0x30);
        wd(wu[3]+0x30);
        shen=wu[0]*1000+wu[1]*100+wu[2]*10+wu[3];
        if(k==11)
         {shejishu++;
         clrram();
         break;
         }
        }
不知道为什么设置1的循环能正常,设置2的循环只是执行一次就跳出了?感觉还是键值读取的K=11这个值,有没有办法当K值读完就不再去读了,或着KDA不等于1时不去跳过  k=key1();这个语句,

http://bbs.elecfans.com/forum.php?mod=viewthread&tid=267398  按键

可以通过设置标志位来进行切换,当得到你想要的值后就给标志位赋个值,然后判断哪些你想根据这个值来执行的程序是否需要执行

建议再看看课本按键处理相关知识

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

网站地图

Top