打印

51单片机的键盘程序问题

[复制链接]
786|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lbb_1112|  楼主 | 2015-12-7 13:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lbb_1112 于 2015-12-7 16:32 编辑

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;//测量
                        }

//if(KDA==1)
//        {
//        
//        delay_key(50);
//        }        

}
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();
           }


//   delay_lcd(1000);
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=key1();这个语句,然后键值读取上次按键值的K=11这个值,有没有办法KDA不等于1时不去返回K值

相关帖子

沙发
dirtwillfly| | 2015-12-7 17:28 | 只看该作者
那么长的代码,估计没人看的

使用特权

评论回复
板凳
lbb_1112|  楼主 | 2015-12-7 21:36 | 只看该作者
dirtwillfly 发表于 2015-12-7 17:28
那么长的代码,估计没人看的

你好,新手问下If 中的条件是一个区间怎么写?感觉我写的没有用
If(0<=k<=9)这句没有判定,K多大都执行里面的程序

使用特权

评论回复
地板
dirtwillfly| | 2015-12-7 23:17 | 只看该作者
这样写:
if((0<=k)&&(k<=9))

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
lbb_1112 + 3
5
lbb_1112|  楼主 | 2015-12-8 11:49 | 只看该作者

还是没有进行判定的感觉~~~~难道我的keil有问题?

使用特权

评论回复
6
dirtwillfly| | 2015-12-8 11:52 | 只看该作者
lbb_1112 发表于 2015-12-8 11:49
还是没有进行判定的感觉~~~~难道我的keil有问题?

设置断点,看看执行到这里了没有

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
lbb_1112 + 3
7
lbb_1112|  楼主 | 2015-12-8 13:05 | 只看该作者
dirtwillfly 发表于 2015-12-8 11:52
设置断点,看看执行到这里了没有

用debug运行就没问题,写到片子上就不行~~~

使用特权

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

本版积分规则

17

主题

54

帖子

1

粉丝