打印

单片机按键扫描 程序 如何做判断 循环优化

[复制链接]
2876|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
otheric|  楼主 | 2013-6-27 02:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大虾,同学好,很久没来学习了,谢谢。
附件的程序功就是扫描按键  输入相应的位置开关控制电机 正反转到 相应位置停止  ,
相应个点开关值
             P4  p3  p2  p1  p0
keyi1     1  1  1  0  0
keyi2    1  1  0  0  1
keyi3     1  0  0  1  1
keyi4      0  0 1  1  1
keyi5     0  1  1  1  0

相应的程序可以运行 ,但是有问题 ,当输入键后,就死循环了,跑到相应位置才会停,
请教各位:
1 是否  可以循环中 判断键盘输入 ,判断后按新的输入运行?
2  电机 跑到相应位置后 ,按相应的键开关 ,电机任然会 点动 ,是什么问题?
   理想情况应该先判断 是否是相应键值,是电机就不动作.

谢谢各位


// 判断 P2位置接近开关状态, 开关动作输出低电平
// 输入按键位置,输入后,电机产生对应的正反转,转到相应位置停止,要判断当前位置



#include"reg51.h"
#define uchar unsigned char  

sbit a0 = P2^0;// 开关位置
sbit a1 = P2^1;
sbit a2 = P2^2;
sbit a3 = P2^3;
sbit a4 = P2^4;


sbit keyi1 = P3^7;//键盘输入1
sbit keyi2 = P3^6;//键盘输入2
sbit keyi3 = P3^5;//键盘输入3
sbit keyi4 = P3^4;//键盘输入4
sbit keyi5 = P3^3;//键盘输入5


sbit  cw = P1^4;//继电器动作,电机正转
sbit  rw = P1^0;//继电器动作,电机反转

void delay(uchar i)
{
        uchar j;
        for (j = i; j >0; j--)
        ;
}


void main(void)
{
       
        P1 =0xff;
        P2 =0xff;

        cw = 1;
        rw = 1;
        while(1)
        {               
                if(keyi1 == 0)
                {
                        delay(20);
                        if(keyi1==0)
                        while(1)
                        {                                       
                    if(P2==0xfc)
                                {
                                          rw = 1;
                                        cw = 1;
                                        break;                                       
                                  }
                            else
                                 {
                                        rw =0;
                                 }
                        }
                }

                if(keyi2 == 0)
                {
                        delay(20);       
                        if(keyi2 == 0)
                        while(1)
                        {
                                if(P2 == 0xf9)
                                {                                       
                                        cw = 1;
                                        rw = 1;
                                        break;                                       
                                }
                       
                                else if(P2 < 0xf9)
                                {
                                        rw = 0;       
                                }
                       
                                else
                                {
                                        cw = 0;
                                }
                        }
                }


                if(keyi3==0)
                {
                        delay(20);               
                        if(keyi3 == 0)               
                        while(1)               
                        {
                                if(P2 == 0xf3)
                                {
                                        cw = 1;
                                        rw = 1;
                                        break;
                                }               
                                else if (P2 < 0xf3)
                                {
                                        rw = 0;                                       
                                }
                                                                       
                                else
                                {
                                        cw = 0;
                       
                                }
                        }               
                }

                if(keyi4 == 0)
                {
                        delay(20);
                        if(keyi4 == 0)
                        while(1)
                        {
               
                            if(P2== 0xe7)       
                                {       
                                        cw = 1;
                                        rw = 1;
                                        break;
                                }
                       
                          else if ((P2==0xef)||(P2== 0xee))
                                {
                                        rw = 0;               
                                }
       
                                else
                                {
                                        cw = 0;                               
                                }
                        }               
                }

                if (keyi5 == 0)
                {
                        delay(20);
                        if (keyi5 == 0)
                        while(1)
                        {
                                if(P2== 0xee)
                                {                                       
                                        cw = 1;
                                        rw = 1;
                                        break;
                                }

                                else
                                {
                                        cw = 0;                       
                                }
                        }               
                }                       
        }
}


相关帖子

沙发
xyz549040622| | 2013-6-27 07:12 | 只看该作者
判断按键的时候,不要傻傻的等待就不会出现这种情况了

使用特权

评论回复
板凳
logokfu| | 2013-6-27 16:22 | 只看该作者
楼主看来是学生,楼主以后写程序的框架要改了,改用定时器调度各个任务

使用特权

评论回复
地板
renwocai| | 2013-6-27 18:54 | 只看该作者
5
otheric|  楼主 | 2013-6-27 21:35 | 只看该作者
谢谢,以上,定时器调度能举个例子么

使用特权

评论回复
6
otheric|  楼主 | 2013-6-27 21:35 | 只看该作者
框架如何改呢,

使用特权

评论回复
7
huangxz| | 2013-6-27 22:46 | 只看该作者
对于要实时处理的按键事件要进中断才可以,按循环执行的如果任务时间稍长可能就无法及时响应。

使用特权

评论回复
8
3htech| | 2013-6-28 09:24 | 只看该作者
建议去看一下《匠人手记》,里面有对按键做了深入的分析。

下面的是我写的。
https://bbs.21ic.com/icview-394632-1-1.html

使用特权

评论回复
9
电子学习员| | 2013-6-28 09:43 | 只看该作者
用定时器扫描按键,如果扫描到有按键输入设置一个电机动作标志位。在主函数while中根据标志位调度电机正反转

使用特权

评论回复
10
dengm| | 2013-6-28 13:03 | 只看该作者
建议2个状态机 串联: 1. 键盘 2. 电机控制

使用特权

评论回复
11
find_all| | 2013-6-28 14:39 | 只看该作者
本帖最后由 find_all 于 2013-6-28 14:48 编辑

你while(1) 里面加while(1),有点乱!

使用特权

评论回复
12
find_all| | 2013-6-28 14:47 | 只看该作者
本帖最后由 find_all 于 2013-6-28 14:49 编辑

上面没说对。
贴了我改的,你试试!
if(keyi1 == 0)
{
    delay(20);
    if(keyi1==0)
    {
               while(P2!=0xfc)
                {
                   rw =0;
                 }
                 rw = 1;
                 cw = 1;  
     }
     else
     {
            rw = 1;
            cw = 1;                                       
     }
}

使用特权

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

本版积分规则

2

主题

110

帖子

1

粉丝