我们将连接带和不带中断的物理按钮。此外,我们将使用此按钮来控制板载 LED,我们在上一教程中进行了接口。
xplained mini 已经有一个焊接在板上的按钮。下图是显示该按钮的图片。
下图显示了按钮的原理图。
如上图所示,引脚 PC5 连接到 VCC 和按钮。默认情况下,当松开按钮时,引脚 PC5 被拉到 VCC。按下按钮将销钉拉低到地面。我们将使用此逻辑来编写代码。
#define F_CPU 5000000
#include <xc.h>
#include <util/delay.h>
#include <avr/interrupt.h>
void clkInit(void)
{
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, 0); // Internal 20MHz OSC, CLKOUT=0
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x03); // PEN=1, DIV=4
while ((CLKCTRL.MCLKSTATUS & (1<<4)) == 0); // wait for the osc to stabilize.
}
int main(void)
{
clkInit();
}
方向寄存器(DIR)用于设置引脚输入或输出。按钮连接到引脚 PC5,LED 连接到引脚 PC0。因此,我们需要将引脚 PC5 设置为输入,将引脚 PC0 设置为输出。
PORTC.DIR = 0x01; // PC5->input, PC0->output
在这里,我将 PORTC 方向寄存器设置为 0x01。这会将 PC5 设置为输入,将 PC0 设置为输出。
我们将在 while 循环中读取按钮状态。INPUT寄存器可用于读取引脚的状态。
引脚 PC5 被拉到 VCC,当按下按钮时,它将被拉低到地面。我们基本上将在 while 循环中监控 INPUT 寄存器的位 5。
while(1)
{
if ((PORTC.IN & (1<<5)) == 0)
{
PORTC.OUT |= (1<<0); // turn the LED ON
while ((PORTC.IN & (1<<5)) == 0); // wait for the button to release
}
PORTC.OUT &= ~(1<<0);
_delay_ms(500);
}
按下按钮时,引脚 PC5 变为低电平。这是我们将打开 LED 的地方。
然后我们将等待按钮松开并且引脚 PC5 再次变为高电平。
松开按钮后,我们将关闭 LED。
基本上,按下按钮时 LED 会亮起,只要按下按钮,它就会保持亮起状态。松开按钮时它将关闭。
|