求高人指点按键扫描的思想

2020-01-30 13:57发布

本人是刚接触单片机的菜鸟,现在想做个小模块。
是这样的,有A,B,C三件事,通过一个按键在A,B,C之间选择,当按1下,执行A;再按1下,执行B;再按1下,执行C;再按1下,又回到A.其中有个D函数是A,B,C都得调用它,也就是A要完成A的事要调用D,B要完成B的事要调用D,C要完成C的事要调用D;同时我用马老的状态机原理编了个键盘扫描的程序的程序可以用。
希望高人能指点下实现这些功能应该怎样弄
本人是刚接触单片机的菜鸟,现在想做个小模块。
是这样的,有A,B,C三件事,通过一个按键在A,B,C之间选择,当按1下,执行A;再按1下,执行B;再按1下,执行C;再按1下,又回到A.其中有个D函数是A,B,C都得调用它,也就是A要完成A的事要调用D,B要完成B的事要调用D,C要完成C的事要调用D;同时我用马老的状态机原理编了个键盘扫描的程序的程序可以用。
希望高人能指点下实现这些功能应该怎样弄
17条回答
jswd0810   
  • 13  
  • 329  技术员
    1楼-- · 2020-01-30 18:56
    你将A、B、C、D分别做成函数呀,在设置一个变量Key_num来统计按下1键的次数,当Key_num=4时,Key_num清零
    void A()
    {

    }

    void B()
    {

    }

    void C()
    {

    }

    void D()
    {

    }

    void main()
    {
       while(1)
      {
         key_scan();
        switch(Key_num)
        {
         case 1:A();break;
         case 2:A();break;
         case 3:A();break;
       }
    }
    }
    查看更多
    xslff   
  • 218  
  • 355  技术员
    2楼-- · 2020-01-30 20:25
    本帖最后由 xslff 于 2013-3-28 22:48 编辑
    jswd0810 发表于 2013-3-28 20:15
    你将A、B、C、D分别做成函数呀,在设置一个变量Key_num来统计按下1键的次数,当Key_num=4时,Key_num清零
    v ...


    void main()
    {
         while(1)
        {
            key_scan();
            switch(Key_num)
            {
                case 1:
                    A();
                    D();
                break;
                case 2:
                    B();
                    D();
                break;
                case 3:
                    C();
                    D();
                break;
                default:
                break;
             }
         }
    }
    查看更多
    jswd0810   
  • 13  
  • 329  技术员
    3楼-- · 2020-01-31 02:23
    xslff 发表于 2013-3-28 22:30
    void main()
    {
         while(1)

    呵呵,不好意思,全是A()了,不过,D函数不应该在那儿吧?
    查看更多
    xslff   
  • 218  
  • 355  技术员
    4楼-- · 2020-01-31 06:02
    jswd0810 发表于 2013-3-28 22:36
    呵呵,不好意思,全是A()了,不过,D函数不应该在那儿吧?

    呵呵,初学C,见笑了,已经改过来了,谢谢提醒!
    查看更多
    jswd0810   
  • 13  
  • 329  技术员
    5楼-- · 2020-01-31 07:15
    xslff 发表于 2013-3-28 22:49
    呵呵,初学C,见笑了,已经改过来了,谢谢提醒!

    这种地方也不对
            case 1:
                    A();
                    D();
                break;
    应该是这样吧,这样好理解一些
            case 1:
                {
                     A();
                     D();               
                }
    break;
    查看更多
    limmy321   
  • 171  
  • 501  技术员
    6楼-- · 2020-01-31 12:09
    jswd0810 发表于 2013-3-28 20:15
    你将A、B、C、D分别做成函数呀,在设置一个变量Key_num来统计按下1键的次数,当Key_num=4时,Key_num清零
    v ...

    这种结构不行,不能时时处理按键,要等A或B或C执行完后刚好返回主程序才能处理按键。而且执行完A或B或C至少要1分钟时间。
    查看更多
    jswd0810   
  • 13  
  • 329  技术员
    7楼-- · 2020-01-31 13:47
    你不要在程序中用for(;;)那种循环来延时,如果不能做到,你就把switch放到中断里去处理
    查看更多
    .titrwh   
  • 128  
  • 120  技术员
    8楼-- · 2020-01-31 15:31
    中断里放标志位,主程序检测。
    查看更多
    如果感觉按键扫描太麻烦,可以采用AD按键 只需一个接口 那么比较简单 扩展的按键也比较多
    查看更多
    limmy321   
  • 171  
  • 501  技术员
    10楼-- · 2020-01-31 22:59
    本帖最后由 limmy321 于 2013-3-29 14:50 编辑

    中断也不行,可能是时间没把握好,我还是把代码贴出来吧,大家帮忙看看
    查看更多
    jswd0810   
  • 13  
  • 329  技术员
    11楼-- · 2020-02-01 04:44
            while(1)
            {
                         read_mode() ;
             }      
    你主程序执行while(1)之后,后面的语句有什么用?
    查看更多
    limmy321   
  • 171  
  • 501  技术员
    12楼-- · 2020-02-01 08:28
    本帖最后由 limmy321 于 2013-3-29 15:11 编辑

    #include<REG52.H>
    #include<intrins.h>
    #include <absacc.h>
    #include "GONGYONG.h"  
    #include "DANSE.h"          
    #include "TUOWEI.h"          
    #include "TUIJIN.h"          
    #include "KEY.h"
    #define uint unsigned int  
    #define uchar unsigned char
    void main(void)
    {   delay1();
            delay1();
            delay1();
            delay1();
            delay1();
            delay1();
            while(1)
            {
         read_mode() ;
             }      
    }



    main()这有这些,后面的是没删掉的,不好意思,我改好了
    查看更多
    jswd0810   
  • 13  
  • 329  技术员
    13楼-- · 2020-02-01 08:29
    你把delay函数改用定时器的时标来实现,不要用for(;;)那种循环来延时
    查看更多
    贝贝M   
  • 261  
  • 352  技术员
    14楼-- · 2020-02-01 12:43
    哇塞说的很对
    查看更多
    jswd0810   
  • 13  
  • 329  技术员
    15楼-- · 2020-02-01 15:20
    坛子里有个高手写的从单片机初学者到工程师,可以学习一下
    查看更多
    limmy321   
  • 171  
  • 501  技术员
    16楼-- · 2020-02-01 15:24
    本人菜鸟,看了从单片机初学者到工程师里面定时的应用,还是没明白怎么用到这里,希望高人能结合我的这个代码给个思路
    查看更多

    一周热门 更多>