找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1259|回复: 12
收起左侧

单片机按键问题求解

[复制链接]
ID:635120 发表于 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);
                                }
                        }
                }       
        }
}
想做一个抢答器的程序,按键部分为什么下载到板子上没反应  是程序出错了吗
求教

回复

使用道具 举报

ID:168996 发表于 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;
            }
        }
    }
}
回复

使用道具 举报

ID:275826 发表于 2020-2-2 22:13 | 显示全部楼层
按键是带锁的吗?不是的话要同时按2个键,程序思路不对
回复

使用道具 举报

ID:462827 发表于 2020-2-3 01:07 | 显示全部楼层
按键程序写得不对
回复

使用道具 举报

ID:635120 发表于 2020-2-3 10:18 | 显示全部楼层
banalsheep 发表于 2020-2-2 18:32
判断K0的逻辑有问题
我的理解是:K0按下后,K1-K4(优先级先后)按下对应指示灯亮起,程序应该这样

谢谢      
回复

使用道具 举报

ID:635120 发表于 2020-2-3 10:19 | 显示全部楼层
tyrl800 发表于 2020-2-2 22:13
按键是带锁的吗?不是的话要同时按2个键,程序思路不对

谢谢         
回复

使用道具 举报

ID:635120 发表于 2020-2-3 10:21 | 显示全部楼层
hantu 发表于 2020-2-3 01:07
按键程序写得不对

谢谢            
回复

使用道具 举报

ID:635120 发表于 2020-2-3 10:28 | 显示全部楼层
tyrl800 发表于 2020-2-2 22:13
按键是带锁的吗?不是的话要同时按2个键,程序思路不对

请问具体需要怎么改呢  
实在是想不出来
回复

使用道具 举报

ID:213173 发表于 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;//解锁
                }
        }
}
回复

使用道具 举报

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

谢谢  受教了  
回复

使用道具 举报

ID:207589 发表于 2020-2-5 09:49 | 显示全部楼层
if (k0==0)
        { 就错了因为你把其它按键都包括在if (k0==0)
        {里
如果K0不等于0 后面程序都不执行
回复

使用道具 举报

ID:635120 发表于 2020-2-5 10:06 | 显示全部楼层
rooe 发表于 2020-2-5 09:49
if (k0==0)
        { 就错了因为你把其它按键都包括在if (k0==0)
        {里

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表