搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2009-7-31 14:07:38 | 显示全部楼层 |阅读模式
有一产品,先按一下主键,马达开始正转,再按一下子键,马达反转,再按一下另一子键,马达又正转,在两个子键中循环。前提是必须先按主键。

以下是我的主程序,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



以下蓝色文字由站长:armok 于:2010-05-31,05:52:57 加入。
你的原标题:“<font color=black>求助,按键
” 不合符规定。请更改成能说明帖子大意的标题
试想一下,如果本论坛的帖子标题清一色的‘帮助!’,‘ADC求救!’等笼统的标题,你在阅读的过程中会造成许多麻烦。
所以本论坛规定:一定要起一个能说明帖子大意的标题。不允许“关于 AVR 的 ADC 使用!”这种笼统标题。作为标题,必须说明清楚:
 ①你是在请教问题,还是在介绍有关的知识?
 ②ADC的问题有许多,你是想说那方面的内容?
注意以上两点,标题应该改成如:“请教:ADC 可以不使用中断吗?”。
起一个能说明帖子大意的标题,除了减轻我们的帖子分类整理工作,还方便其它人阅读,节省大家的时间。
注:使用合格的标题,对你来说只是举手之劳,但却会为我们的管理工作提供很大的便利。谢谢你的支持。

出0入0汤圆

发表于 2009-8-3 11:00: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='=';
}
}


//以上程序仅供参考如有错误请指出

出0入0汤圆

 楼主| 发表于 2009-8-3 13:52:00 | 显示全部楼层
惭愧,C语言我不会啊

出0入0汤圆

 楼主| 发表于 2009-8-7 14:19:25 | 显示全部楼层
怎么个动态法?提示一下。

出0入0汤圆

发表于 2009-8-9 08:32:08 | 显示全部楼层
这种程序用C做方便的多,而且也不繁琐!建议用C

出0入0汤圆

发表于 2010-5-31 02:15:38 | 显示全部楼层
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
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 03:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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