digitalWrite/digitalRead()函数的Arduino Framework分析

digitalWrite/digitalRead()函数的Arduino Framework分析当我们要点亮连接在13管脚的内置的led的时候,我们需要以下几步:①设置13管脚为输出模式②给13管脚输出一个高电平只需要这样的两步。

大家好,欢迎来到IT知识分享网。

digitalWrite/digitalRead()函数的Arduino Framework分析

我还是沿用上一个教程中的例子《关于Arduino 对端口或引脚编程可以直接用数字来操作的分析》,当我们要点亮连接在13管脚的内置的led的时候,我们需要以下几步:

①设置13管脚为输出模式

②给13管脚输出一个高电平

只需要这样的两步,13管脚连接的内置的led灯就亮了起来。

上个教程中,我们详细的讲解了一下pinMode(pin, mode)函数的内部封装机理,最后也留了这样的一个疑问:

digitalWrite/digitalRead()函数的Arduino Framework分析

这个else里面,其实就是将引脚设置为OUTPUT的时候,*out这个地址里面怎么没有设置任何的信息呢?这就衍生了我们今天要讲的其中的一个函数了:digitalWrite(uint8_t pin, uint8_t val)。那么对于一个已经设置为输出的引脚我们不外乎可以输出,这个输出不外乎能输出数字信号的能力和输出模拟信号的能力。今天主要看看数字信号的输出,那也就是直接输出高电平和低电平了。

digitalWrite(uint8_t pin, uint8_t val)

  • 功能:控制引脚输出高低电平;如果引脚被pinMode()设为OUTPUT,5V (或者 3.3V 在使用 3.3V的板子上) 就是HIGH, 0V (ground) 就是 LOW。如果引脚被设为INPUT,digitalWrite()将对输入引脚的上拉电阻使能HIGH(或者禁止LOW)。建议digitalwrite使用之前要用piMode指定输出输入,否则引脚上拉电阻会像限流电阻一样(此时应该是高阻态)。
  • pin:要操作的引脚;
  • value:有HIGH和LOW两个取值;

看一下函数原型:

digitalWrite/digitalRead()函数的Arduino Framework分析

  • uint8_t timer = digitalPinToTimer(pin); 这个函数有一个宏定义:( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) ),来看一下这个数组digital_pin_to_timer_PGM里面放的信息:这个数组是在pins_arduino.h里面放着的,太长了就不贴出来了。

它其实就是对arduino有复用的管脚做了有个条件的编译,使有的管脚成呈现出第2功能。比如说3、5、6、9、10、11管脚不仅仅是数字输出管脚也有pwm的输出能力。

  • if (port == NOT_A_PIN) return ;

如果引脚没有接到任何地方,那么将随机返回HIGH或LOW

  • if (timer != NOT_ON_TIMER) turnOffPWM(timer);

如果有使用复用的管脚,并且使用复用的功能,这个地方就要去对timer进行设置了,这个我们后续再说。

digitalWrite/digitalRead()函数的Arduino Framework分析

如果参数val用户设置为LOW,那其实就是对PORTxn清位,PORTxn为0,那就是输出低电平,同理,如果参数val用户设置为HIGH,那其实就是对PORTxn置位,PORTxn为1,那就是输出高电平。

附加:AVR对IO口的控制涉及到的三个寄存器的控制作用:也可以参考教程《AVR单片机IO口位操作的方法(1)》

digitalWrite/digitalRead()函数的Arduino Framework分析


前面我们知道不管是pinMode()还是digitalWrite()函数,基本上都是对DDR和PORT这两个寄存器的封装,还没有涉及到PIN这个寄存器。这个PIN寄存器就是设置管脚读的,读也是分为2种,读取模拟信号和读取数字信号,今天还是只说读取数字信号。假如现在我们将13管脚连接一个button,那么我们怎么来检测这个button的状态呢?这其实也很简单,这就需要来检测13管脚端口的电平状态了。这就需要下面我们说到的这个函数了:int digitalRead(uint8_t pin)

int digitalRead(uint8_t pin)

  • 功能:读取引脚电平状态;
  • pin:要读取的引脚
  • 返回值:HIGH或者LOW;

函数原型:

digitalWrite/digitalRead()函数的Arduino Framework分析

  • if (port == NOT_A_PIN) return LOW;

如果没有检测到管脚的位,那么就返回低电平。

  • if (*portInputRegister(port) & bit) return HIGH;

return LOW;

bit一定为非0的,*portInputRegister(port)指向的地址为:

digitalWrite/digitalRead()函数的Arduino Framework分析

就是PIN寄存器了,这个值为1,那么结果就为1,那是高电平输入,反之就是一个低电平输入了。


喜欢我文章的朋友,欢迎关注、分享、点赞、评论。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/80844.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信