最近在用汇编编写独立按键的程序时,输出总是不稳定
本帖最后由 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
好像是你的消抖动的代码有问题~~~~~~~~~~~~~~~~
我就是按照之前写c的思路写的,先取出p1口的状态,取反后与上0ffh,判断A中是否有1,然后延时消抖,在判断一次p1口状态,再执行子程序啊。如果错的话,是哪错了呢 会不会有变量冲突,汇编比C难检查到。 用的是CPL P0.4指令啊?这样子按键按的时间不确定的话结果当然也不确定了。应该松开按键判断,长按就不进入skey了 输出总是不稳定?怎样不稳定?按键一直按下时,LED一直闪烁?按键没有按下时,LED一直闪烁?有时候按键按下没反应? mov P1 A 寄存器A的值送到P1写错了吧 好奇楼主为什么要回到原始社会,仅仅是为了学习汇编吗? lgg88 发表于 2014-12-13 10:46
好奇楼主为什么要回到原始社会,仅仅是为了学习汇编吗?
是的,课程要学,学完后感觉挺不错的 not_at_all 发表于 2014-12-13 08:43
输出总是不稳定?怎样不稳定?按键一直按下时,LED一直闪烁?按键没有按下时,LED一直闪烁?有时候按键按下 ...
按键一直按下时,LED一直闪烁
有时候按键按下没反应
就这两种 loveskangaroo 发表于 2014-12-13 09:53
mov P1 A 寄存器A的值送到P1写错了吧
这是之前的一个代码,完了检查了,实际是mov a,p1 本帖最后由 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
thy110 发表于 2014-12-13 11:02
是延时一段时间在判断是否是高定平吗
你都没明白怎么检测按键的。在这里你检测到按键后的处理,比如你检测到某个按键就存这个按键标号,下次如果一样就退出,就解决了长按键的问题,就是要锁存按键值,没按键就清零按键标号。还有你这里是处理位的,如果两个按键一起按呢?三个呢?结果也是不一样。找个对的结构研究吧,都用汇编了还用c的死循环? 与汇编何关? 思路应该是这样的:
1.先辨别有键按下否,没有的话就循环再判别,有按下就到2
2.有键按下就延时10mS消抖动,然后再去辨别
3.延时后判别是干扰,则返回去继续判别,不是干扰到4
4.确定是有键按下则到5
5.调用键盘子程序
6.子程序完成后返回,继续判别有无键按下 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
没有松开检测所以有按键按下就会不断的翻转输出,加上所有的按键功能一样,所以就这样了。加上按键松开检测就好了
页:
[1]