有一产品,先按一下主键,马达开始正转,再按一下子键,马达反转,再按一下另一子键,马达又正转,在两个子键中循环。前提是必须先按主键。
以下是我的主程序,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 可以不使用中断吗?”。
起一个能说明帖子大意的标题,除了减轻我们的帖子分类整理工作,还方便其它人阅读,节省大家的时间。
注:使用合格的标题,对你来说只是举手之劳,但却会为我们的管理工作提供很大的便利。谢谢你的支持。
//你可以参考一下
#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='=';
}
}
//以上程序仅供参考如有错误请指出
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
一周热门 更多>