多输入按键宏

问题描述

我厌倦了一遍又一遍地重写我的代码,所以决定组合一个简单的宏来处理处理输入按钮的所有可能情况:

.macro CPBI; Sets Z-Flag if button PC@0 is pressed.
    .ifndef BTNS_C
    .error "BTNS_C is not defined!"
    .endif
    IN r16,PINC; Read Port C
    ANDI r16,BTNS_C

    SUBI r16,-@0; *ADDI r16,@0
    CPI r16,BTNS_C
.endmacro

有了这个,我应该能够给它一个我想要检查的按钮的值:

.equ BTNS_C = (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)
LDI r16,BTNS_C
OUT PORTC,r16
; ...

CPBI 0b00000101; Check if button 0 and 2 are pressed
BREQ label1
CPBI 0b00000010; Check if button 1 is pressed
BREQ label2

所以如果我想检查按钮 1 是否被按下并且我正在按下按钮 1,输入应该是这样的:XXXX1101。因此,如果我向其中添加 arg,则该值应该正好是 BTNS_C。如果按下了更多或错误的按钮,它应该大于或小于 BTNS_C。 这适用于一个按钮,但不一致(有时无法识别按钮按下)。如果我测试多个按钮,它完全失败(只有一个按钮被按下时触发,另一个不起作用,随机切换哪个按钮正在注册按钮按下)。这对我来说感觉比较合理,所以我不知道为什么它不起作用。

我尝试重写它。这正如我所希望的那样工作,但它现在使用两个寄存器,而不是我不喜欢的一个

.macro CPBI; Sets Z-Flag if button PC@0 is pressed.
    .ifndef BTNS_C
    .error "BTNS_C is not defined!"
    .endif
    IN r16,BTNS_C

    LDI r17,@0
    EOR r16,r17
    CPI r16,BTNS_C
.endmacro

在这里,我翻转了来自 arg 的输入的位,结果正好是 BTNS_C 或更少。)

在这里做错了什么?为什么第一个解决方案不起作用而第二个解决方案有效?如果有人能看一下它,也许能发现我逻辑中的错误,我将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)