标题: 单片机按键问题求解 [打印本页]

作者: 思考的机器    时间: 2020-2-2 17:04
标题: 单片机按键问题求解
void keyscan ()
{

        if (k0==0)
        {
                delay (5);
                if (k0==0)
                {
                        delay (5);
                        while (!k0);
                        if (k1==0)
                        {
                                delay (5);
                                if (k1==0)
                                {
                                        delay (5);
                                        led1=0;
                                        while (!k1);
                                }
                        }
                        if (k2==0)
                        {
                                delay (5);
                                if (k2==0)
                                {
                                        delay (5);
                                        led2=0;
                                        while (!k2);
                                }
                        }
                        if (k3==0)
                        {
                                delay (5);
                                if (k3==0)
                                {
                                        delay (5);
                                        led3=0;
                                        while (!k3);
                                }
                        }
                        if (k4==0)
                        {
                                delay (5);
                                if (k4==0)
                                {
                                        delay (5);
                                        led4=0;
                                        while (!k4);
                                }
                        }
                }       
        }
}
想做一个抢答器的程序,按键部分为什么下载到板子上没反应  是程序出错了吗
求教


作者: banalsheep    时间: 2020-2-2 18:32
判断K0的逻辑有问题
我的理解是:K0按下后,K1-K4(优先级先后)按下对应指示灯亮起,程序应该这样

void keyscan2(void)
{
        if(k0==0)
        {
          delay (5);
          if(k0==0) //led0 = 1;
          {
            if(k1==0)
            {
              delay (5);
              if(k1==0) led1 = 1;
            }
            else if(k2==0)
            {
              delay (5);
              if(k2==0) led2 = 1;
            }
            else if(k3==0)
            {
              delay (5);
              if(k3==0) led3 = 1;
            }
            else if(k4==0)
            {
              delay (5);
              if(k4==0) led4 = 1;
            }
        }
    }
}

作者: tyrl800    时间: 2020-2-2 22:13
按键是带锁的吗?不是的话要同时按2个键,程序思路不对
作者: hantu    时间: 2020-2-3 01:07
按键程序写得不对
作者: 思考的机器    时间: 2020-2-3 10:18
banalsheep 发表于 2020-2-2 18:32
判断K0的逻辑有问题
我的理解是:K0按下后,K1-K4(优先级先后)按下对应指示灯亮起,程序应该这样

谢谢      
作者: 思考的机器    时间: 2020-2-3 10:19
tyrl800 发表于 2020-2-2 22:13
按键是带锁的吗?不是的话要同时按2个键,程序思路不对

谢谢         
作者: 思考的机器    时间: 2020-2-3 10:21
hantu 发表于 2020-2-3 01:07
按键程序写得不对

谢谢            
作者: 思考的机器    时间: 2020-2-3 10:28
tyrl800 发表于 2020-2-2 22:13
按键是带锁的吗?不是的话要同时按2个键,程序思路不对

请问具体需要怎么改呢  
实在是想不出来
作者: wulin    时间: 2020-2-4 07:20
抢答器的按键程序为了机会公平不可以用轮询法和软件延时,而是所有抢答键同时查询,比如 if(P1!=0xff),一旦有键动作立即封锁所有抢答键,再查询主持键是否按下,否则属违规。给你一个思路参考:
void keyscan()       
{                       
        unsigned char num;        //局部变量
        static bit key_sign=0;//按键自锁标志
        if(P1!=0xff && key_sign==0)
        {
                key_sign=1;//自锁,
                num=P1;//读键状态
                switch(num)
                {
                        case 0xfe: TheWinner=1;break;
                        case 0xfd: TheWinner=2;break;
                        .......
                        .......
                        default:TheWinner=0; break;
                }
                if(allow)//主持
                        //TheWinner胜出
                else
                        //TheWinner违规
        }
        else
        {
                if(key_sign==1)
                {       
                        if(...)//主持操作
                                key_sign=0;//解锁
                }
        }
}

作者: 思考的机器    时间: 2020-2-4 19:14
wulin 发表于 2020-2-4 07:20
抢答器的按键程序为了机会公平不可以用轮询法和软件延时,而是所有抢答键同时查询,比如 if(P1!=0xff),一旦 ...

谢谢  受教了  
作者: rooe    时间: 2020-2-5 09:49
if (k0==0)
        { 就错了因为你把其它按键都包括在if (k0==0)
        {里
如果K0不等于0 后面程序都不执行
作者: 思考的机器    时间: 2020-2-5 10:06
rooe 发表于 2020-2-5 09:49
if (k0==0)
        { 就错了因为你把其它按键都包括在if (k0==0)
        {里

本意是先按下一个开始键后其他键才能按下




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1