gejigeji521 发表于 2024-3-25 20:18

如何在 AVR 中使用输入按钮

我们将连接带和不带中断的物理按钮。此外,我们将使用此按钮来控制板载 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 会亮起,只要按下按钮,它就会保持亮起状态。松开按钮时它将关闭。




zhuomuniao110 发表于 2024-3-25 21:15

这板子看着真不错。用的查询法。

21mengnan 发表于 2024-3-25 21:37

这个板子有个性,附带了洞洞板,可以设置一些自己的电路上去。

小明的同学 发表于 2024-3-30 21:40

这种开发板真有意思,可以搭建自己的电路。
页: [1]
查看完整版本: 如何在 AVR 中使用输入按钮