标题: 求大神帮忙提供一个51单片机的按键的程序设计思路(新手) [打印本页]

作者: wxia0c    时间: 2020-2-23 11:09
标题: 求大神帮忙提供一个51单片机的按键的程序设计思路(新手)
想用51单片机写一个按键程序,当按键按下去时(长时间按住)执行一个函数,当按键松开时执行另一个函数。PS:要有实时性,因为一共有八个按键(要用51单片机做一个小车的遥控器,想用按键实现:当按键按住是小车一直走,当按键松开时小车停止。)拜托各位大神了,实在是写不出来了

作者: 51hei**1140    时间: 2020-2-23 13:03
你好!
你说的个功能可以实现,小车应该是无线的吧,用的什么无线模块
作者: baiyun1234    时间: 2020-2-23 13:34
//可以参照下,因为没有上班没给你调试,你自己调试下。
void key()
{
        sbit key1   =  P2^0;//按键1
        sbit key2   =  P2^1;
        .....                                //几个按键只要IO够就行
        sbit status =  P1^0;//状态指示
        bit flag;
        int f;
        while(1)
        {
                f=1;
                switch (f)
                {
                        case 1:
                        {       
                                if(key1==0&&key2)                //你需要的功能可以继续往下写
                                        {
                                                delayms(20);                //防抖
                                                if(key1==0&&key2)
                                                {
                                                        z=2;
                                                }
                                        }
                                if(key2==0&&key1)               
                                        {
                                                delayms(20);
                                                if(key2==0&&key1)
                                                {
                                                        z=3;
                                                }
                                        }
                        }break;       
                        case 2:
                        {
                                delayms(500);
                                status=0;                //打开
                                delayms(500);
                                z=1;                        //返回第一步继续等待
                        }break;
                        case 3:
                        {
                                delayms(500);
                                status=1;                //关闭
                                delayms(500);       
                                z=1;                     //同理返回第一步继续等待
                        }break;
                }
        }
}
作者: xuyaqi    时间: 2020-2-23 13:47
void main()
{
  
        while(1)
        {

                读键() ;//读键
                if(键值==前进){前进();}
                if(键值==后退){后退();}
                。
                。
                。

                else{停();}
        }
}
作者: wxia0c    时间: 2020-2-24 07:36
51hei**1140 发表于 2020-2-23 13:03
你好!
你说的个功能可以实现,小车应该是无线的吧,用的什么无线模块

无线数传模块,大神可知道应该怎么写这个程序吗?

作者: wxia0c    时间: 2020-2-24 09:17
baiyun1234 发表于 2020-2-23 13:34
//可以参照下,因为没有上班没给你调试,你自己调试下。
void key()
{

谢谢大神,还请大神讲讲这个程序,没太看懂(新手小白)我想实现的功能是一个按键按下去执行小车前进这个函数,松开时执行小车停止这个函数,而且按键比较多,因为这个按键控制小车所以想实时性好一点(不知道是不是要用中断,还有就是程序的逻辑没想出来),再次谢谢大神了!
作者: PDDDF    时间: 2020-2-24 10:26
void key_scan()
{
  static uchar a;
  if( key1 == 0)  {a++;}
  else if(key2 == 0) {a++;}
  else {a = 0;}
  if(xx<a)
  {
   if(key1 == 0) {key =1;}
   else if(key2 == 0) {key =2;}
   else {key = 0;}
  }
}
框架大概这样吧,把扫描放中断里,消抖效果根据自己的手感改时间就行,可以改一改看能不能用,我也是新手,不能保证好用
作者: hantu    时间: 2020-2-25 01:01
用状态机的机制就行了,按键改变状态值,由主执行结构(循环或定时器中断)来动作。
作者: 玉子屋    时间: 2020-3-2 18:57
这个是按键控制流水灯程序,可以看看框架。希望对你有帮助。
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit key1 =P3^0; //按键1
sbit key2 =P3^1; //按键2
sbit key3 =P3^2; //按键3
uchar flag1=0,flag2=0,flag3=0;
void delay_ms(uint z)
{
     uint i,j;
     for(i=0;i<z;i++)
     for(j=0;j<110;j++);
}
void O_to_E() //1,3,5,7与2,4,6,8交替闪烁
{
     P2=0Xaa;
     delay_ms(200);
     P2=~0Xaa;
     delay_ms(200);
}
void key_scan()    //键盘扫描
{
     if(!key1)
     {
          delay_ms(10); //延时消抖
          if(!key1)
          flag1=1;
     }
     if(!key2)
     {
          delay_ms(10); //延时消抖
          if(!key2)
           flag2=1;
         }
     if(!key3)
     {
          delay_ms(10); //延时消抖
          if(!key3)
           flag3=1;
     }
}
void main()
{
     uchar i;
     while(1)
     {
            key_scan();
            if(flag1)                               //按键一按下?               
            {
                   for(i=0;i<8;i++)            //从左至右亮,每次一盏            
                   {
                            P2=~(0x80>>i);
                            delay_ms(100);
                            key_scan();                 //按键扫描   
                            if(flag2||flag3){flag1=0;break;}        //如果有其它按键按下响应其它按键
                   }
             }
             if(flag2)                                //按键一按下?                  
             {
                    for(i=0;i<8;i++)             //从右至左亮,每次一盏  
                   {
                            P2=~(0x01<<i);
                            delay_ms(100);
                            key_scan();
                            if(flag1||flag3){flag2=0;break;}
                   }
             }
              if(flag3)
             {
                   O_to_E();                             //奇偶交替闪烁
                   key_scan();
                   if(flag1||flag2)flag3=0;
              }
        }
}
作者: Edison.    时间: 2020-3-2 19:33
八个按键的c程序最好有程序说明
作者: flyme123    时间: 2020-3-3 09:51
区别不大,pwm是一种调制方式而已,被控制的系统接受什么样的pwm会有什么反应是由被控制的系统决定的,我们只要看懂手册输出对应的pwm波就行




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