先按一下主键,马达开始正转,再按一下子键,马达反转 .... 前提是必须先按主键。

2020-02-09 11:36发布

有一产品,先按一下主键,马达开始正转,再按一下子键,马达反转,再按一下另一子键,马达又正转,在两个子键中循环。前提是必须先按主键。

以下是我的主程序,A,B口按键输入,C口输出。

1.照现在的这个程序,按一下主键(B0),马达正转,按一个子键(A4),马达反转,按另一个子键(A5),马达正转。再按主键(B0)就不能关闭了。

2.如果把下面标号“KEY3”处的(KEY1)换成(SA),则,按一下主键(B0)马达正转,两个子键(A4.A5)无功能,再按一下主键(B0)可以关闭(由于循环位置的不同)。

求高手们帮忙看看

SA      ;
BTFSC PORTB,0 ;检测B0位是否按下
GOTO SA ;没有,返回
CALL DELAY ;按下,去抖
BTFSC PORTB,0 ;再次检测
GOTO SA ;没有,返回
SB
BTFSS PORTB,0 ;测试B0是否弹回
GOTO SB ;没有,循环
MOVF PORTC,W ;读C口数据到W
BTFSC STATUS,Z ;测试是否为0
GOTO UP ;为1,C口为0,执行驱动程序
CLRF PORTC ;为0,清C口
GOTO SA ;返回
UP
MOVLW B'01000000' ;按下,马达转动
MOVWF PORTC
KEY1
BTFSC PORTA,4 ;检测A4口是否按下
GOTO KEY2 ;没按,检测KEY2
CALL DELAY ;延时去抖
BTFSC PORTA,4 ;再次检测A4
GOTO KEY2 ;没有按下
MOVLW B'10000000' ;按下,马达反转
MOVWF PORTC
GOTO KEY1 ;循环
KEY2
BTFSC PORTA,5 ;检测A5口是否按下
GOTO KEY3 ;没按,检测KEY1
CALL DELAY ;延时去抖
BTFSC PORTA,5 ;再次检测A5
GOTO KEY3 ;没有按下
MOVLW B'01000000' ;按下,马达反转
MOVWF PORTC
GOTO KEY1
KEY3
BTFSC PORTB,7 ;检测B7口
GOTO KEY1;按下,执行低电压不动作程序
CALL DELAY ;延时去抖
BTFSC PORTB,7 ;再次检测
GOTO SA ;没有按下,返回
CLRF PORTC ;按下,清C口
GOTO SA ;返回
DELAY
MOVLW 3CH



以下蓝 {MOD}文字由站长:armok 于:2010-05-31,05:52:57 加入。
你的原标题:“<font color=black>求助,按键
” 不合符规定。请更改成能说明帖子大意的标题
试想一下,如果本论坛的帖子标题清一 {MOD}的‘帮助!’,‘ADC求救!’等笼统的标题,你在阅读的过程中会造成许多麻烦。
所以本论坛规定:一定要起一个能说明帖子大意的标题。不允许“关于 AVR 的 ADC 使用!”这种笼统标题。作为标题,必须说明清楚:
 ①你是在请教问题,还是在介绍有关的知识?
 ②ADC的问题有许多,你是想说那方面的内容?
注意以上两点,标题应该改成如:“请教:ADC 可以不使用中断吗?”。
起一个能说明帖子大意的标题,除了减轻我们的帖子分类整理工作,还方便其它人阅读,节省大家的时间。
注:使用合格的标题,对你来说只是举手之劳,但却会为我们的管理工作提供很大的便利。谢谢你的支持。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
portx
1楼-- · 2020-02-09 12:53
//你也许应该学学C语言,描述起来更直观
//你可以参考一下

#define MAIN_KEY RB0    //主按键  以下所有按键以高电平作为有效,每个按键都接10K左右下拉电阻
#define EX_KEY_A RA4    //子按键A
#define EX_KEY_B RA5    //子按键B

#define MOT_A    RB1    //电机驱动控制输出A
#define MOT_B    RB2    //电机驱动控制输出B

unsigned char NS='+';   //方向控制
unsigned char RUN='T';  //运行控制

void MOT_CONT(unsigned char SG)
{


  if(SG=='+')
   {
    MOT_A=1;
    MOT_B=0;
   
   }

  else if(SG=='-')
   {
    MOT_A=0;
    MOT_B=1;
   
   }

  else
   {
    MOT_A=0;
    MOT_B=0;
   
   }


}

int main()
{
SYS_INIT();


while(1)
{

  if(MAIN_KEY)
   {
    while(MAIN_KEY);//等待按键释放
    if(RUN=='T')    //如果为停车状态则切换进入运行状态
    RUN='S';
    else           //如果为运行状态则切换进入停车状态
    RUN='T';
   }

  if(EX_KEY_A)
   {
     while(EX_KEY_A);//等待按键释放
    NS='+';
    }

  if(EX_KEY_B)
   {
     while(EX_KEY_B);//等待按键释放
    NS='-';
   }

  if(RUN=='T')
  {
   MOT_CONT=NS;
  }
  else
  MOT_CONT='=';
}
}


//以上程序仅供参考如有错误请指出
yealien
2楼-- · 2020-02-09 18:01
 精彩回答 2  元偷偷看……
yealien
3楼-- · 2020-02-09 19:00
怎么个动态法?提示一下。
285286997
4楼-- · 2020-02-09 22:03
这种程序用C做方便的多,而且也不繁琐!建议用C
tonyliaw
5楼-- · 2020-02-10 03:00
SA      ;
BTFSC PORTB,0 ;检测B0位是否按下
GOTO SA ;没有,返回
CALL DELAY ;按下,去抖
BTFSC PORTB,0 ;再次检测
GOTO SA ;没有,返回
SB
BTFSS PORTB,0 ;测试B0是否弹回
GOTO SB ;没有,循环
MOVF PORTC,W ;读C口数据到W
BTFSC STATUS,Z ;测试是否为0
GOTO UP ;为1,C口为0,执行驱动程序
CLRF PORTC ;为0,清C口
GOTO SA ;返回
UP
MOVLW B'01000000' ;按下,马达转动
MOVWF PORTC  
KEY1
BTFSC PORTA,4 ;检测A4口是否按下
GOTO KEY2 ;没按,检测KEY2
CALL DELAY ;延时去抖
BTFSC PORTA,4 ;再次检测A4
GOTO KEY2 ;没有按下
MOVLW B'10000000' ;按下,马达反转
MOVWF PORTC  
GOTO KEY1 ;循环
KEY2
BTFSC PORTA,5 ;检测A5口是否按下
GOTO KEY3 ;没按,检测KEY1
CALL DELAY ;延时去抖
BTFSC PORTA,5 ;再次检测A5
GOTO KEY3 ;没有按下
MOVLW B'01000000' ;按下,马达反转
MOVWF PORTC  
GOTO KEY1
KEY3
BTFSC PORTB,7 ;检测B7口
GOTO KEY1;按下,执行低电压不动作程序
CALL DELAY ;延时去抖
BTFSC PORTB,7 ;再次检测

##  GOTO SA;没有按下,返回  ##########此時返回 SA  會鎖住不能关闭了

改成>>>>>   
  GOTO KEY1;按下,执行低电压不动作程序
  
CLRF PORTC ;按下,清C口
GOTO SA ;返回  
DELAY
MOVLW 3CH

一周热门 更多>