[PIC®/AVR®/dsPIC®产品] 如何在 AVR 中使用输入按钮

[复制链接]
 楼主| gejigeji521 发表于 2024-3-25 20:18 | 显示全部楼层 |阅读模式
我们将连接带和不带中断的物理按钮。此外,我们将使用此按钮来控制板载 LED,我们在上一教程中进行了接口。
xplained mini 已经有一个焊接在板上的按钮。下图是显示该按钮的图片。

下图显示了按钮的原理图。

如上图所示,引脚 PC5 连接到 VCC 和按钮。默认情况下,当松开按钮时,引脚 PC5 被拉到 VCC。按下按钮将销钉拉低到地面。我们将使用此逻辑来编写代码。
  1. #define F_CPU 5000000
  2. #include <xc.h>
  3. #include <util/delay.h>
  4. #include <avr/interrupt.h>

  5. void clkInit(void)
  6. {
  7.         _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, 0);  // Internal 20MHz OSC, CLKOUT=0
  8.         _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x03);  // PEN=1, DIV=4
  9.         while ((CLKCTRL.MCLKSTATUS & (1<<4)) == 0);  // wait for the osc to stabilize.
  10. }

  11. int main(void)
  12. {
  13.         clkInit();
  14. }
方向寄存器(DIR)用于设置引脚输入或输出。按钮连接到引脚 PC5,LED 连接到引脚 PC0。因此,我们需要将引脚 PC5 设置为输入,将引脚 PC0 设置为输出。

  1. PORTC.DIR = 0x01;  // PC5->input, PC0->output
在这里,我将 PORTC 方向寄存器设置为 0x01。这会将 PC5 设置为输入,将 PC0 设置为输出。
我们将在 while 循环中读取按钮状态。INPUT寄存器可用于读取引脚的状态。


引脚 PC5 被拉到 VCC,当按下按钮时,它将被拉低到地面。我们基本上将在 while 循环中监控 INPUT 寄存器的位 5。
  1. while(1)
  2.     {
  3.         if ((PORTC.IN & (1<<5)) == 0)
  4.         {
  5.                 PORTC.OUT |= (1<<0);  // turn the LED ON
  6.                 while ((PORTC.IN & (1<<5)) == 0);  // wait for the button to release
  7.         }
  8.         PORTC.OUT &= ~(1<<0);
  9.         _delay_ms(500);
  10.     }
按下按钮时,引脚 PC5 变为低电平。这是我们将打开 LED 的地方。
然后我们将等待按钮松开并且引脚 PC5 再次变为高电平。
松开按钮后,我们将关闭 LED。
基本上,按下按钮时 LED 会亮起,只要按下按钮,它就会保持亮起状态。松开按钮时它将关闭。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
zhuomuniao110 发表于 2024-3-25 21:15 | 显示全部楼层
这板子看着真不错。用的查询法。
21mengnan 发表于 2024-3-25 21:37 | 显示全部楼层
这个板子有个性,附带了洞洞板,可以设置一些自己的电路上去。
小明的同学 发表于 2024-3-30 21:40 | 显示全部楼层
这种开发板真有意思,可以搭建自己的电路。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

195

主题

2460

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部