我想让 2 个或更多按钮等待按下。
例如,增加或减少 7 段显示器中的值。 Button1 递增值,Button2 递减值。 对于下面的代码,我可以减少或增加它,但不能同时执行这两个操作。
对于一个按钮,我这样做的方式是:
PROCESS2:;SW09 & SW11 的功能
......................
BTFSC PORTB,7 This line is to understand whether we pressed button or not.
GOTO PROCESS2 We cant go below until the button pressed
CALL UP ;Up increments the value which will be shown in the 7-segment-display.
BTFSS PORTB,7
GOTO $-1
那么对于多个按钮如何实现呢?算法是怎样的?背后的逻辑是什么?
我不熟悉PIC汇编,但我记得MCS51汇编,也许这不是根据你的问题,但可以作为参考。
我假设按钮工作为低电平有效(当按下按钮时,按钮端口将被拉低,或者按下按钮时按钮端口将接地)。
button1 EQU P1.0 ; Port1 bit0 as button1 (input)
button2 EQU P1.1 ; Port1 bit1 as button2 (input)
led EQU P2 ; Port2 bit 0 until 8 as led (output)
ORG 00H
mov A,#7FH ; init led value 7FH = 0111 1111B
mov R0,A
main:
btn1sts:
jb button1, btn2sts ;if button1 not pressed then check button2 status
jnb button1, $ ;wait until button 1 is released
inc R0 ;A value only increases after the button1 is released.
sjmp process:
btn2sts:
jb button2, btn1sts ;if button2 not pressed then check button1 status
jnb button2, $ ;wait until button 2 is released
dec R0 ;A value only decreases after the button2 is released.
process:
mov A, R0
mov led, A ;show A value in P2 (led).
ljmp main: ;goto main
我不知道是否强制使用汇编程序,但在 C 中这非常简单。
假设 BUTTON1 和 BUTTON2 在其他地方定义为输入引脚并且它们具有上拉电阻,您可以尝试:
void checkIncrement(void)
{
if (BUTTON1 == 0) {
while (BUTTON1 == 0) DelayMs(1); // software debounce
increment(); // call the increment function
}
}
void checkDecrement(void)
{
if (BUTTON2 == 0) {
while (BUTTON2 == 0) DelayMs(1);
decrement();
}
}
int main(void)
{
// your main loop
while (1)
{
checkIncrement();
checkDecrement();
// do something else if none of the buttons are pressed
}
}
如果需要汇编程序,您可以尝试编译并查看汇编程序列表,以了解它是如何完成的。