问题描述
嗨
我厌倦了一遍又一遍地重写我的代码,所以决定组合一个简单的宏来处理处理输入按钮的所有可能情况:
.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 (将#修改为@)