【问题标题】:How do I detect when a button is pressed?如何检测何时按下按钮?
【发布时间】:2019-03-06 13:37:24
【问题描述】:

我正在尝试对 msp430 进行编程以更改变量以更改闪烁 LED 的速度。这是我的第一次尝试。按下按钮时如何执行子程序“changeVelocity”?

  bic.b #00001000b, &P2DIR  ; P2.3 as input
  bis.b #1,&P1DIR       ; P1.0 as output
  bis.b #00001000b, &P2REN  ; select internal resistor
  bis.b #00001000b, &P2OUT  ; make it pull-up


main:
    xor.b #1,&P1OUT            ; Toggle P1.0
    call #ExtraDelay
    bit.b  #00001000b, &P2IN ;poll 2.3 (trying to detect the button)
    jz changeVelocity ;this is how I'm trying but do not work as expected.
    jmp main

【问题讨论】:

  • 检查中断。
  • this is how I'm trying but do not work as expected. 什么没有按预期工作?如果设置了零标志,则执行跳转到changeVelocity。但是那里会发生什么?这些代码是否会更改闪烁速度变量并跳回主代码?为什么不像 #ExtraDelay 那样调用“changeVelocity”作为子程序?此外,您按下按钮的时间必须超过 LED 切换所需的时间,因为只要您处于#ExtraDelay 例程中,CPU 就无法测试 P2.3 位。正如@fuz 所说,最好使用中断。

标签: assembly msp430


【解决方案1】:

您必须通过设置 P2IE 来启用中断,并使用 P2REN 启用上拉上拉/下拉。 P2OUT 应相应选择(1 为上拉 0 为下拉)

然后你应该使用中断向量中的固定地址注册你的中断处理程序:

ORG     PORT2_VECTOR
DW      your_interrupt_handler

你可以为你的延迟设置一个值。

记得添加某种防碰撞程序来过滤故障。并不是真的需要中断,您也可以汇集端口输入(如您所做的那样),但您需要用某种计数器替换延迟循环,该计数器决定何时打开/关闭 LED,并使您的 CPU 在每个周期都休眠并设置一个定时器来唤醒她(这将帮助您做出精确的延迟并正确安排/执行您的任务)。 类似的东西

Mainloop
    nop
    bis #LPM0,SR            ; sleep
    nop

    <<<yourcode here>>>

    jmp Mainloop

TimerA0_ISR_Handler
    bic     #LPM0,0(SP)     ; wake up
    reti

尝试多次读取端口并在按钮保持稳定至少 20 毫秒时发出按下按钮的信号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    相关资源
    最近更新 更多