打印
[PIC®/AVR®/dsPIC®产品]

如何在 AVR 中使用输入按钮

[复制链接]
9028|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我们将连接带和不带中断的物理按钮。此外,我们将使用此按钮来控制板载 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 | 只看该作者
这种开发板真有意思,可以搭建自己的电路。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

2229

帖子

8

粉丝