thy110 发表于 2014-12-13 00:08:20

最近在用汇编编写独立按键的程序时,输出总是不稳定

本帖最后由 thy110 于 2014-12-13 11:00 编辑

最近在用汇编编写独立按键的程序时,输出总是不稳定,用于测试的led灯总是闪烁,怎么回事啊,之前用c写的就很正常,按照原来的思路一步一步写下来就不正常了,大家帮忙看看。

ORG 0000H
LJMP START
ORG 0200H
START:MOV P1,#0FFH
LOOP: LCALL DELAY_10MS
      MOV A,P1
      MOV R1,A
      CPL A
          ANL A,#0FFH
          JZLOOP
          LCALL DELAY_10MS
      MOV A,P1
      MOV R1,A
          CPL A
          ANL A,#0FFH
          JZ LOOP
          ACALL SKEY
          SJMP LOOP
SKEY: MOV A,R1   
      JNB ACC.0,KEY1
          JNB ACC.1,KEY2
          JNB ACC.2,KEY3
          JNB ACC.3,KEY4
          JNB ACC.4,KEY5
          JNB ACC.5,KEY6
          JNB ACC.6,KEY7
          JNB ACC.7,KEY8
          RET
KEY1: CPL P0.4
      RET
KEY2: CPL P0.4
      RET
KEY3: CPL P0.4
      RET
KEY4: CPL P0.4
      RET
KEY5: CPL P0.4
      RET
KEY6: CPL P0.4
      RET
KEY7: CPL P0.4
      RET
KEY8: CPL P0.4
      RET                
DELAY_10MS:MOV R7,#10H
TS1:       MOV R6,#0FFH
TS2:       DJNZ R6,TS2
         DJNZ R7,TS1
                   RET
                   END      

lxa0 发表于 2014-12-13 00:27:59

好像是你的消抖动的代码有问题~~~~~~~~~~~~~~~~

thy110 发表于 2014-12-13 00:59:01

lxa0 发表于 2014-12-13 00:27
好像是你的消抖动的代码有问题~~~~~~~~~~~~~~~~

我就是按照之前写c的思路写的,先取出p1口的状态,取反后与上0ffh,判断A中是否有1,然后延时消抖,在判断一次p1口状态,再执行子程序啊。如果错的话,是哪错了呢

gfy200866 发表于 2014-12-13 08:11:09

会不会有变量冲突,汇编比C难检查到。

limuzi2012 发表于 2014-12-13 08:32:59

用的是CPL P0.4指令啊?这样子按键按的时间不确定的话结果当然也不确定了。应该松开按键判断,长按就不进入skey了

not_at_all 发表于 2014-12-13 08:43:41

输出总是不稳定?怎样不稳定?按键一直按下时,LED一直闪烁?按键没有按下时,LED一直闪烁?有时候按键按下没反应?

loveskangaroo 发表于 2014-12-13 09:53:48

mov P1 A 寄存器A的值送到P1写错了吧

lgg88 发表于 2014-12-13 10:46:46

好奇楼主为什么要回到原始社会,仅仅是为了学习汇编吗?

thy110 发表于 2014-12-13 10:57:09

lgg88 发表于 2014-12-13 10:46
好奇楼主为什么要回到原始社会,仅仅是为了学习汇编吗?

是的,课程要学,学完后感觉挺不错的

thy110 发表于 2014-12-13 10:58:12

not_at_all 发表于 2014-12-13 08:43
输出总是不稳定?怎样不稳定?按键一直按下时,LED一直闪烁?按键没有按下时,LED一直闪烁?有时候按键按下 ...

按键一直按下时,LED一直闪烁
有时候按键按下没反应
就这两种

thy110 发表于 2014-12-13 10:59:51

loveskangaroo 发表于 2014-12-13 09:53
mov P1 A 寄存器A的值送到P1写错了吧

这是之前的一个代码,完了检查了,实际是mov a,p1

thy110 发表于 2014-12-13 11:02:20

本帖最后由 thy110 于 2014-12-13 11:24 编辑

limuzi2012 发表于 2014-12-13 08:32
用的是CPL P0.4指令啊?这样子按键按的时间不确定的话结果当然也不确定了。应该松开按键判断,长按就不进入 ...

是延时一段时间在判断是否是高定平吗


ORG 0000H
LJMP START
ORG 0200H
START:MOV P1,#0FFH
LOOP: LCALL DELAY_10MS
      MOV A,P1
      MOV R1,A
      CPL A
          ANL A,#0FFH
          JZLOOP
          LCALL DELAY_10MS
      MOV A,P1
      MOV R1,A
          CPL A
          ANL A,#0FFH
          JZ LOOP
skey1:         LCALL DELAY_10MS
          MOV A,P1
          CPL A
          ANL A,#0FFH
         JNZ skey1
          ACALL SKEY
          SJMP LOOP
SKEY: MOV A,R1   
      

limuzi2012 发表于 2014-12-13 12:04:29

thy110 发表于 2014-12-13 11:02
是延时一段时间在判断是否是高定平吗




你都没明白怎么检测按键的。在这里你检测到按键后的处理,比如你检测到某个按键就存这个按键标号,下次如果一样就退出,就解决了长按键的问题,就是要锁存按键值,没按键就清零按键标号。还有你这里是处理位的,如果两个按键一起按呢?三个呢?结果也是不一样。找个对的结构研究吧,都用汇编了还用c的死循环?

mon51 发表于 2014-12-13 12:49:04

与汇编何关?

lxa0 发表于 2014-12-13 13:34:51

思路应该是这样的:
1.先辨别有键按下否,没有的话就循环再判别,有按下就到2
2.有键按下就延时10mS消抖动,然后再去辨别
3.延时后判别是干扰,则返回去继续判别,不是干扰到4
4.确定是有键按下则到5
5.调用键盘子程序
6.子程序完成后返回,继续判别有无键按下

thy110 发表于 2014-12-13 17:44:27

limuzi2012 发表于 2014-12-13 12:04
你都没明白怎么检测按键的。在这里你检测到按键后的处理,比如你检测到某个按键就存这个按键标号,下次如 ...

谢谢你,我弄懂了,刚学汇编,各种指令弄晕了,不过总算弄出来了。

KEY_V DATA 30H
KEY_S DATA 31H
ORG 0000H
LJMP START
ORG 0200H
START:MOV P1,#0ffH
      MOV KEY_S,#0FFH
LOOP: LCALL DELAY_10MS
      MOV A,P1
          MOV KEY_V,A
      XRL A,KEY_S
          JZLOOP
          LCALL DELAY_10MS
      MOV A,P1
          MOV KEY_V,A
      XRL A,KEY_S
          JZLOOP
          MOV        KEY_S,KEY_V
          ACALL SKEY
          SJMP LOOP
SKEY: MOV A,KEY_S   
          JNB ACC.6,KEY6
          JNB ACC.7,KEY7
          RET
KEY6: JNB ACC.0,KEY0
          JNB ACC.1,KEY1
          JNB ACC.2,KEY2
          JNB ACC.3,KEY3
          JNB ACC.4,KEY4
          JNB ACC.5,KEY5
          RET
KEY7: JNB ACC.0,KEY0
          JNB ACC.1,KEY1
          JNB ACC.2,KEY2
          JNB ACC.3,KEY3
          JNB ACC.4,KEY4
          JNB ACC.5,KEY5
          RET
KEY0: CPL P0.4
      RET
KEY1: CPL P0.4
      RET
KEY2: CPL P0.4
      RET
KEY3: CPL P0.4
      RET
KEY4: CPL P0.4
      RET
KEY5: CPL P0.4
      RET       
DELAY_10MS:MOV R7,#10H
TS1:       MOV R6,#0FFH
TS2:       DJNZ R6,TS2
         DJNZ R7,TS1
                   RET
                   END      



dz20062008 发表于 2014-12-14 15:58:52

没有松开检测所以有按键按下就会不断的翻转输出,加上所有的按键功能一样,所以就这样了。加上按键松开检测就好了
页: [1]
查看完整版本: 最近在用汇编编写独立按键的程序时,输出总是不稳定